1
- use std:: path:: PathBuf ;
2
1
use std:: sync:: Arc ;
3
- use std:: sync:: Mutex ;
4
2
use std:: time:: Duration ;
5
3
6
4
use anyhow:: anyhow;
@@ -10,10 +8,6 @@ use derivative::Derivative;
10
8
use futures03:: compat:: Stream01CompatExt ;
11
9
use futures03:: stream:: StreamExt ;
12
10
use futures03:: stream:: TryStreamExt ;
13
- use lru_time_cache:: LruCache ;
14
- use object_store:: local:: LocalFileSystem ;
15
- use object_store:: path:: Path ;
16
- use object_store:: ObjectStore ;
17
11
use serde_json:: Value ;
18
12
19
13
use crate :: derive:: CheapClone ;
@@ -28,99 +22,15 @@ use crate::ipfs::IpfsClient;
28
22
use crate :: ipfs:: RetryPolicy ;
29
23
use crate :: prelude:: { LinkResolver as LinkResolverTrait , * } ;
30
24
31
- #[ derive( Clone , CheapClone ) ]
32
- enum Cache {
33
- Memory {
34
- cache : Arc < Mutex < LruCache < ContentPath , Vec < u8 > > > > ,
35
- } ,
36
- Disk {
37
- store : Arc < dyn ObjectStore > ,
38
- } ,
39
- }
40
-
41
- fn log_err ( logger : & Logger , e : & object_store:: Error , log_not_found : bool ) {
42
- if log_not_found || !matches ! ( e, object_store:: Error :: NotFound { .. } ) {
43
- warn ! (
44
- logger,
45
- "Failed to get IPFS object from disk cache; fetching from IPFS" ;
46
- "error" => e. to_string( ) ,
47
- ) ;
48
- }
49
- }
50
-
51
- impl Cache {
52
- fn new ( capacity : usize , path : Option < PathBuf > ) -> Self {
53
- match path {
54
- Some ( path) => {
55
- let fs = match LocalFileSystem :: new_with_prefix ( & path) {
56
- Err ( e) => {
57
- panic ! (
58
- "Failed to create IPFS file based cache at {}: {}" ,
59
- path. display( ) ,
60
- e
61
- ) ;
62
- }
63
- Ok ( fs) => fs,
64
- } ;
65
- Cache :: Disk {
66
- store : Arc :: new ( fs) ,
67
- }
68
- }
69
- None => Self :: Memory {
70
- cache : Arc :: new ( Mutex :: new ( LruCache :: with_capacity ( capacity) ) ) ,
71
- } ,
72
- }
73
- }
74
-
75
- async fn find ( & self , logger : & Logger , path : & ContentPath ) -> Option < Vec < u8 > > {
76
- match self {
77
- Cache :: Memory { cache } => cache. lock ( ) . unwrap ( ) . get ( path) . cloned ( ) ,
78
- Cache :: Disk { store } => {
79
- let log_err = |e : & object_store:: Error | log_err ( logger, e, false ) ;
80
-
81
- let path = Path :: from ( path. cid ( ) . to_string ( ) ) ;
82
- let object = store. get ( & path) . await . inspect_err ( log_err) . ok ( ) ?;
83
- let data = object. bytes ( ) . await . inspect_err ( log_err) . ok ( ) ?;
84
- Some ( data. to_vec ( ) )
85
- }
86
- }
87
- }
88
-
89
- async fn insert ( & self , logger : & Logger , path : ContentPath , data : Vec < u8 > ) {
90
- match self {
91
- Cache :: Memory { cache } => {
92
- let mut cache = cache. lock ( ) . unwrap ( ) ;
93
-
94
- if !cache. contains_key ( & path) {
95
- cache. insert ( path. clone ( ) , data. clone ( ) ) ;
96
- }
97
- }
98
- Cache :: Disk { store } => {
99
- let log_err = |e : & object_store:: Error | log_err ( logger, e, true ) ;
100
- let path = Path :: from ( path. cid ( ) . to_string ( ) ) ;
101
- store
102
- . put ( & path, data. into ( ) )
103
- . await
104
- . inspect_err ( log_err)
105
- . ok ( ) ;
106
- }
107
- }
108
- }
109
- }
110
-
111
25
#[ derive( Clone , CheapClone , Derivative ) ]
112
26
#[ derivative( Debug ) ]
113
27
pub struct IpfsResolver {
114
28
#[ derivative( Debug = "ignore" ) ]
115
29
client : Arc < dyn IpfsClient > ,
116
30
117
- #[ derivative( Debug = "ignore" ) ]
118
- cache : Cache ,
119
-
120
31
timeout : Duration ,
121
32
max_file_size : usize ,
122
33
max_map_file_size : usize ,
123
- max_cache_file_size : usize ,
124
34
125
35
/// When set to `true`, it means infinite retries, ignoring the timeout setting.
126
36
retry : bool ,
@@ -132,14 +42,9 @@ impl IpfsResolver {
132
42
133
43
Self {
134
44
client,
135
- cache : Cache :: new (
136
- env. max_ipfs_cache_size as usize ,
137
- env. ipfs_cache_location . clone ( ) ,
138
- ) ,
139
45
timeout : env. ipfs_timeout ,
140
46
max_file_size : env. max_ipfs_file_bytes ,
141
47
max_map_file_size : env. max_ipfs_map_file_size ,
142
- max_cache_file_size : env. max_ipfs_cache_file_size ,
143
48
retry : false ,
144
49
}
145
50
}
@@ -159,18 +64,10 @@ impl LinkResolverTrait for IpfsResolver {
159
64
Box :: new ( s)
160
65
}
161
66
162
- async fn cat ( & self , logger : & Logger , link : & Link ) -> Result < Vec < u8 > , Error > {
67
+ async fn cat ( & self , _logger : & Logger , link : & Link ) -> Result < Vec < u8 > , Error > {
163
68
let path = ContentPath :: new ( & link. link ) ?;
164
69
let timeout = self . timeout ;
165
70
let max_file_size = self . max_file_size ;
166
- let max_cache_file_size = self . max_cache_file_size ;
167
-
168
- if let Some ( data) = self . cache . find ( & logger, & path) . await {
169
- trace ! ( logger, "IPFS cat cache hit" ; "hash" => path. to_string( ) ) ;
170
- return Ok ( data. to_owned ( ) ) ;
171
- }
172
-
173
- trace ! ( logger, "IPFS cat cache miss" ; "hash" => path. to_string( ) ) ;
174
71
175
72
let ( timeout, retry_policy) = if self . retry {
176
73
( None , RetryPolicy :: NonDeterministic )
@@ -185,17 +82,6 @@ impl LinkResolverTrait for IpfsResolver {
185
82
. await ?
186
83
. to_vec ( ) ;
187
84
188
- if data. len ( ) <= max_cache_file_size {
189
- self . cache . insert ( & logger, path. clone ( ) , data. clone ( ) ) . await ;
190
- } else {
191
- debug ! (
192
- logger,
193
- "IPFS file too large for cache" ;
194
- "path" => path. to_string( ) ,
195
- "size" => data. len( ) ,
196
- ) ;
197
- }
198
-
199
85
Ok ( data)
200
86
}
201
87
0 commit comments