[pbs-devel] [PATCH proxmox-backup] async_lru_cache: fix handling of errors in fetch

Stefan Reiter s.reiter at proxmox.com
Thu Jun 17 11:02:32 CEST 2021


The future needs to be removed from the pending map in any case, even if
it returned an error, else all upcoming calls to access this key will
always return the same error.

Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
---

I don't think this can happen at the moment, as we only use this in parts of the
code were one returned error already causes an abort, but should still be fixed.

 src/tools/async_lru_cache.rs | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/src/tools/async_lru_cache.rs b/src/tools/async_lru_cache.rs
index cc385ec9..62e74fcd 100644
--- a/src/tools/async_lru_cache.rs
+++ b/src/tools/async_lru_cache.rs
@@ -65,15 +65,16 @@ impl<K: std::cmp::Eq + std::hash::Hash + Copy, V: Clone + Send + 'static> AsyncL
         };
 
         let result = result_fut.await;
-        match result {
-            Ok(Some(ref value)) if owner => {
-                // this call was the one initiating the request, put into LRU and remove from map
-                let mut maps = self.maps.lock().unwrap();
+
+        if owner {
+            // this call was the one initiating the request, put into LRU and remove from map
+            let mut maps = self.maps.lock().unwrap();
+            if let Ok(Some(ref value)) = result {
                 maps.0.insert(key, value.clone());
-                maps.1.remove(&key);
             }
-            _ => {}
+            maps.1.remove(&key);
         }
+
         result
     }
 }
-- 
2.30.2






More information about the pbs-devel mailing list