]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
auth, lmdb, backport delete fixes 12675/head
authorKees Monshouwer <mind04@monshouwer.org>
Wed, 22 Mar 2023 21:05:03 +0000 (22:05 +0100)
committermind04 <mind04@monshouwer.org>
Thu, 23 Mar 2023 10:50:19 +0000 (11:50 +0100)
modules/lmdbbackend/lmdbbackend.cc
regression-tests.nobackend/lmdb-metadata-leak/command [new file with mode: 0755]
regression-tests.nobackend/lmdb-metadata-leak/description [new file with mode: 0644]
regression-tests.nobackend/lmdb-metadata-leak/expected_result [new file with mode: 0644]
tasks.py

index 8d3d561fae5606d715f6bc466502cca4cdc874b1..a17c729d61566b62aad4a12ac83f90d145f5db58 100644 (file)
@@ -696,7 +696,7 @@ bool LMDBBackend::deleteDomain(const DNSName& domain)
     auto range = txn.equal_range<0>(domain);
 
     for (auto& iter = range.first; iter != range.second; ++iter) {
-      iter.del();
+      txn.del(iter.getID());
     }
 
     txn.commit();
@@ -707,7 +707,7 @@ bool LMDBBackend::deleteDomain(const DNSName& domain)
     auto range = txn.equal_range<0>(domain);
 
     for (auto& iter = range.first; iter != range.second; ++iter) {
-      iter.del();
+      txn.del(iter.getID());
     }
 
     txn.commit();
@@ -1189,7 +1189,7 @@ bool LMDBBackend::setDomainMetadata(const DNSName& name, const std::string& kind
 
   for (auto& iter = range.first; iter != range.second; ++iter) {
     if (iter->key == kind)
-      iter.del();
+      txn.del(iter.getID());
   }
 
   for (const auto& m : meta) {
diff --git a/regression-tests.nobackend/lmdb-metadata-leak/command b/regression-tests.nobackend/lmdb-metadata-leak/command
new file mode 100755 (executable)
index 0000000..c4d9d02
--- /dev/null
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+set -e
+if [ "${PDNS_DEBUG}" = "YES" ]; then
+  set -x
+fi
+
+rootPath=$(readlink -f $(dirname $0))
+
+for random in no yes
+do
+  workdir=$(mktemp -d)
+
+  cat << EOF > "${workdir}/pdns-lmdb.conf"
+  module-dir=../regression-tests/modules
+  launch=lmdb
+  lmdb-filename=${workdir}/pdns.lmdb
+  lmdb-shards=2
+  lmdb-random-ids=$random
+EOF
+
+  echo === random=$random
+
+  echo == creating zone
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb create-zone example.com
+  
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb set-meta example.com FOO BAR
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb show-zone example.com | grep FOO
+  mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort
+
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb set-meta example.com FOO2 BAR2
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb show-zone example.com | grep FOO
+  mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort
+
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb set-meta example.com FOO2 BAR2
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb show-zone example.com | grep FOO
+  mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort
+
+  echo == deleting zone
+  $PDNSUTIL --config-dir="${workdir}" --config-name=lmdb delete-zone example.com
+  mdb_dump -p -a -n ${workdir}/pdns.lmdb | egrep -o 'FOO[0-9]*' | LC_ALL=C sort
+done
\ No newline at end of file
diff --git a/regression-tests.nobackend/lmdb-metadata-leak/description b/regression-tests.nobackend/lmdb-metadata-leak/description
new file mode 100644 (file)
index 0000000..99a9783
--- /dev/null
@@ -0,0 +1,2 @@
+This test verifies that, with the LMDB-backend, pdnsutil set-meta and delete-zone do not leave old unreachable metadata items lying around
+
diff --git a/regression-tests.nobackend/lmdb-metadata-leak/expected_result b/regression-tests.nobackend/lmdb-metadata-leak/expected_result
new file mode 100644 (file)
index 0000000..d1be72c
--- /dev/null
@@ -0,0 +1,32 @@
+=== random=no
+== creating zone
+Set 'example.com' meta FOO = BAR
+       FOO     BAR
+FOO
+Set 'example.com' meta FOO2 = BAR2
+       FOO     BAR
+       FOO2    BAR2
+FOO
+FOO2
+Set 'example.com' meta FOO2 = BAR2
+       FOO     BAR
+       FOO2    BAR2
+FOO
+FOO2
+== deleting zone
+=== random=yes
+== creating zone
+Set 'example.com' meta FOO = BAR
+       FOO     BAR
+FOO
+Set 'example.com' meta FOO2 = BAR2
+       FOO     BAR
+       FOO2    BAR2
+FOO
+FOO2
+Set 'example.com' meta FOO2 = BAR2
+       FOO     BAR
+       FOO2    BAR2
+FOO
+FOO2
+== deleting zone
index 1f06930c926022e27149edda4ceffe655e0a8a52..0e14a44132fbed118ac9387ee2fb83fd7d73d76e 100644 (file)
--- a/tasks.py
+++ b/tasks.py
@@ -108,6 +108,7 @@ auth_test_deps = [   # FIXME: we should be generating some of these from shlibde
     'libsystemd0',
     'libyaml-cpp0.6',
     'libzmq3-dev',
+    'lmdb-utils',
     'prometheus',
     'ruby-bundler',
     'ruby-dev',