aboutsummaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@verizonmedia.com>2020-10-07 08:28:12 +0000
committerTor Brede Vekterli <vekterli@verizonmedia.com>2020-10-07 08:28:53 +0000
commit04711cb52b87a98be08fa7fcf9167e90f552fe6f (patch)
tree1f8d4eda2ff98960b1d8f408989f388f3e61f6a9 /storage
parentb09f95f1d811b4a14f727a8f6fcde989dcf9b67c (diff)
Ensure hold lists are empty upon DB destruction
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.
Diffstat (limited to 'storage')
-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()));
}