| 95 | } |
| 96 | |
| 97 | fn put( |
| 98 | &mut self, |
| 99 | key: &TableScopedPath, |
| 100 | value: CachedFileMetadata, |
| 101 | ) -> Option<CachedFileMetadata> { |
| 102 | let mut ctx = DFHeapSizeCtx::default(); |
| 103 | let key_size = key.heap_size(&mut ctx); |
| 104 | let entry_size = value.heap_size(&mut ctx); |
| 105 | |
| 106 | if entry_size + key_size > self.memory_limit { |
| 107 | // Remove potential stale entry |
| 108 | return self.remove(key); |
| 109 | } |
| 110 | |
| 111 | self.memory_used += entry_size; |
| 112 | self.memory_used += key_size; |
| 113 | |
| 114 | let old_value = self.lru_queue.put(key.clone(), value); |
| 115 | if let Some(old_entry) = &old_value { |
| 116 | let mut ctx = DFHeapSizeCtx::default(); |
| 117 | self.memory_used -= old_entry.heap_size(&mut ctx); |
| 118 | self.memory_used -= key_size; |
| 119 | } |
| 120 | |
| 121 | self.evict_entries(); |
| 122 | |
| 123 | old_value |
| 124 | } |
| 125 | |
| 126 | fn remove(&mut self, k: &TableScopedPath) -> Option<CachedFileMetadata> { |
| 127 | if let Some(old_entry) = self.lru_queue.remove(k) { |