diff options
Diffstat (limited to 'persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp')
-rw-r--r-- | persistence/src/vespa/persistence/dummyimpl/dummypersistence.cpp | 37 |
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 { |