diff options
author | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2020-10-07 08:28:12 +0000 |
---|---|---|
committer | Tor Brede Vekterli <vekterli@verizonmedia.com> | 2020-10-07 08:28:53 +0000 |
commit | 04711cb52b87a98be08fa7fcf9167e90f552fe6f (patch) | |
tree | 1f8d4eda2ff98960b1d8f408989f388f3e61f6a9 /storage | |
parent | b09f95f1d811b4a14f727a8f6fcde989dcf9b67c (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.h | 2 | ||||
-rw-r--r-- | storage/src/vespa/storage/bucketdb/generic_btree_bucket_database.hpp | 9 |
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())); } |