@@ -24,14 +24,39 @@ use crate::ipfs::IpfsClient;
24
24
use crate :: ipfs:: RetryPolicy ;
25
25
use crate :: prelude:: { LinkResolver as LinkResolverTrait , * } ;
26
26
27
+ #[ derive( Clone , CheapClone ) ]
28
+ struct Cache {
29
+ cache : Arc < Mutex < LruCache < ContentPath , Vec < u8 > > > > ,
30
+ }
31
+
32
+ impl Cache {
33
+ fn new ( capacity : usize ) -> Self {
34
+ Self {
35
+ cache : Arc :: new ( Mutex :: new ( LruCache :: with_capacity ( capacity) ) ) ,
36
+ }
37
+ }
38
+
39
+ fn find ( & self , path : & ContentPath ) -> Option < Vec < u8 > > {
40
+ self . cache . lock ( ) . unwrap ( ) . get ( path) . cloned ( )
41
+ }
42
+
43
+ fn insert ( & self , path : ContentPath , data : Vec < u8 > ) {
44
+ let mut cache = self . cache . lock ( ) . unwrap ( ) ;
45
+
46
+ if !cache. contains_key ( & path) {
47
+ cache. insert ( path. clone ( ) , data. clone ( ) ) ;
48
+ }
49
+ }
50
+ }
51
+
27
52
#[ derive( Clone , CheapClone , Derivative ) ]
28
53
#[ derivative( Debug ) ]
29
54
pub struct IpfsResolver {
30
55
#[ derivative( Debug = "ignore" ) ]
31
56
client : Arc < dyn IpfsClient > ,
32
57
33
58
#[ derivative( Debug = "ignore" ) ]
34
- cache : Arc < Mutex < LruCache < ContentPath , Vec < u8 > > > > ,
59
+ cache : Cache ,
35
60
36
61
timeout : Duration ,
37
62
max_file_size : usize ,
@@ -48,9 +73,7 @@ impl IpfsResolver {
48
73
49
74
Self {
50
75
client,
51
- cache : Arc :: new ( Mutex :: new ( LruCache :: with_capacity (
52
- env. max_ipfs_cache_size as usize ,
53
- ) ) ) ,
76
+ cache : Cache :: new ( env. max_ipfs_cache_size as usize ) ,
54
77
timeout : env. ipfs_timeout ,
55
78
max_file_size : env. max_ipfs_file_bytes ,
56
79
max_map_file_size : env. max_ipfs_map_file_size ,
@@ -80,7 +103,7 @@ impl LinkResolverTrait for IpfsResolver {
80
103
let max_file_size = self . max_file_size ;
81
104
let max_cache_file_size = self . max_cache_file_size ;
82
105
83
- if let Some ( data) = self . cache . lock ( ) . unwrap ( ) . get ( & path) {
106
+ if let Some ( data) = self . cache . find ( & path) {
84
107
trace ! ( logger, "IPFS cat cache hit" ; "hash" => path. to_string( ) ) ;
85
108
return Ok ( data. to_owned ( ) ) ;
86
109
}
@@ -101,11 +124,7 @@ impl LinkResolverTrait for IpfsResolver {
101
124
. to_vec ( ) ;
102
125
103
126
if data. len ( ) <= max_cache_file_size {
104
- let mut cache = self . cache . lock ( ) . unwrap ( ) ;
105
-
106
- if !cache. contains_key ( & path) {
107
- cache. insert ( path. clone ( ) , data. clone ( ) ) ;
108
- }
127
+ self . cache . insert ( path. clone ( ) , data. clone ( ) ) ;
109
128
} else {
110
129
debug ! (
111
130
logger,
0 commit comments