summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@verizonmedia.com>2020-10-07 12:03:17 +0200
committerGitHub <noreply@github.com>2020-10-07 12:03:17 +0200
commitf2e89d3361cae0e2e74bac89405a175d6ecf5e98 (patch)
tree1a3dbf21c9254413dc7e3d556069a1d4319e5f57
parent8f0ce0d33c6b1c88eebdbcd675c2b3fcddff9b76 (diff)
parent04711cb52b87a98be08fa7fcf9167e90f552fe6f (diff)
Merge pull request #14748 from vespa-engine/vekterli/ensure-empty-hold-lists-on-db-destruction
Ensure hold lists are empty upon DB destruction
-rw-r--r--storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.h2
-rw-r--r--storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.hpp9
2 files changed, 11 insertions, 0 deletions
diff --git a/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.h b/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.h
index 5044193ed79..9534b583cd5 100644
--- a/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.h
+++ b/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.h
@@ -73,6 +73,8 @@ public:
GenericBTreeBucketDatabase(GenericBTreeBucketDatabase&&) = delete;
GenericBTreeBucketDatabase& operator=(GenericBTreeBucketDatabase&&) = delete;
+ ~GenericBTreeBucketDatabase();
+
ValueType entry_from_iterator(const BTreeConstIterator& iter) const;
ConstValueRef const_value_ref_from_valid_iterator(const BTreeConstIterator& iter) const;
diff --git a/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.hpp b/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.hpp
index 5fb673a1440..e53fad84db2 100644
--- a/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.hpp
+++ b/storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.hpp
@@ -17,6 +17,15 @@ namespace storage::bucketdb {
using document::BucketId;
template <typename DataStoreTraitsT>
+GenericBTreeBucketDatabase<DataStoreTraitsT>::~GenericBTreeBucketDatabase() {
+ // If there was a snapshot reader concurrent with the last modify operation
+ // on the DB, it's possible for the hold list to be non-empty. Explicitly
+ // clean it up now to ensure that we don't try to destroy any data stores
+ // with a non-empty hold list. Failure to do so might trigger an assertion.
+ commit_tree_changes();
+}
+
+template <typename DataStoreTraitsT>
BucketId GenericBTreeBucketDatabase<DataStoreTraitsT>::bucket_from_valid_iterator(const BTreeConstIterator& iter) {
return BucketId(BucketId::keyToBucketId(iter.getKey()));
}