aboutsummaryrefslogtreecommitdiffstats
path: root/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp')
-rw-r--r--persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp
index 96cb37be3c2..0ea872a54a5 100644
--- a/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp
+++ b/persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp
@@ -6,6 +6,7 @@
#include <vespa/document/fieldvalue/document.h>
#include <vespa/document/update/documentupdate.h>
#include <vespa/document/bucket/fixed_bucket_spaces.h>
+#include <vespa/persistence/spi/doctype_gid_and_timestamp.h>
#include <vespa/persistence/spi/i_resource_usage_listener.h>
#include <vespa/persistence/spi/resource_usage.h>
#include <vespa/persistence/spi/bucketexecutor.h>
@@ -252,6 +253,15 @@ BucketContent::getEntry(const DocumentId &did) const {
return DocEntry::SP();
}
+std::shared_ptr<DocEntry>
+BucketContent::getEntry(const document::GlobalId& gid) const {
+ auto it(_gidMap.find(gid));
+ if (it != _gidMap.end()) {
+ return it->second;
+ }
+ return {};
+}
+
DocEntry::SP
BucketContent::getEntry(Timestamp t) const {
auto iter = lower_bound(_entries.begin(), _entries.end(), t, TimestampLess());
@@ -529,6 +539,33 @@ DummyPersistence::removeAsync(const Bucket& b, std::vector<spi::IdAndTimestamp>
onComplete->onComplete(std::make_unique<RemoveResult>(numRemoves));
}
+void
+DummyPersistence::removeByGidAsync(const Bucket& b, std::vector<spi::DocTypeGidAndTimestamp> ids, std::unique_ptr<OperationComplete> onComplete)
+{
+ verifyInitialized();
+ assert(b.getBucketSpace() == FixedBucketSpaces::default_space());
+ BucketContentGuard::UP bc(acquireBucketWithLock(b));
+
+ uint32_t numRemoves(0);
+ for (const auto& dt_gid_ts : ids) {
+ auto& gid = dt_gid_ts.gid;
+ auto t = dt_gid_ts.timestamp;
+ LOG(debug, "removeByGidAsync(%s, %" PRIu64 ", %s, %s)", b.toString().c_str(), uint64_t(t), dt_gid_ts.doc_type.c_str(), gid.toString().c_str());
+
+ while (!bc) {
+ internal_create_bucket(b);
+ bc = acquireBucketWithLock(b);
+ }
+ DocEntry::SP entry((*bc)->getEntry(gid));
+ if (entry && entry->getTimestamp() <= t) {
+ numRemoves += entry->isRemove() ? 0 : 1;
+ (*bc)->eraseEntry(entry->getTimestamp());
+ }
+ }
+ bc.reset();
+ onComplete->onComplete(std::make_unique<RemoveResult>(numRemoves));
+}
+
GetResult
DummyPersistence::get(const Bucket& b, const FieldSet& fieldSet, const DocumentId& did, Context&) const
{