]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Handle marked-as-deleted elements in ReadonlyOperations::get<> 15339/head
authorMiod Vallat <miod.vallat@powerdns.com>
Fri, 21 Mar 2025 11:00:56 +0000 (12:00 +0100)
committerMiod Vallat <miod.vallat@powerdns.com>
Fri, 21 Mar 2025 11:48:50 +0000 (12:48 +0100)
ext/lmdb-safe/lmdb-typed.hh

index 5e48ff161cfe96c145fc6934002c0c126fa7b705..4cdcb4efaffd3313db722d2f1979b380980c32c0 100644 (file)
@@ -275,15 +275,19 @@ public:
     // }
 
     //! Get item with id, from main table directly
-    bool get(uint32_t itemId, T& value)
+    int get2(uint32_t itemId, T& value)
     {
       MDBOutVal data{};
-      if((*d_parent.d_txn)->get(d_parent.d_parent->d_main, itemId, data)) {
-        return false;
+      int rc;
+      rc = (*d_parent.d_txn)->get(d_parent.d_parent->d_main, itemId, data);
+      if (rc == 0) {
+        deserializeFromBuffer(data.get<std::string>(), value);
       }
-
-      deserializeFromBuffer(data.get<std::string>(), value);
-      return true;
+      return rc;
+    }
+    bool get(uint32_t itemId, T& value)
+    {
+      return get2(itemId, value) == 0;
     }
 
     //! Get item through index N, then via the main database
@@ -301,17 +305,24 @@ public:
       // because we know we only want one item, pass onlyOldest=true to consistently get the same one out of a set of duplicates
       get_multi<N>(key, ids, true);
 
-      if (ids.size() == 0) {
+      switch (ids.size()) {
+      case 0:
         return 0;
-      }
-
-      if (ids.size() == 1) {
-        if (get(ids[0], out)) {
+      case 1: {
+        auto rc = get2(ids[0], out);
+        if (rc == 0) {
           return ids[0];
         }
+        if (rc == MDB_NOTFOUND) {
+          /* element not present, or has been marked deleted */
+          return 0;
+        }
+        throw std::runtime_error("in index get, failed (" + std::to_string(rc) + ")");
+        break;
+      }
+      default:
+        throw std::runtime_error("in index get, found more than one item");
       }
-
-      throw std::runtime_error("in index get, found more than one item");
     }
 
     // //! Cardinality of index N