summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-01-14 15:46:56 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-01-15 17:41:51 +0000
commitb275087c2a110a1dc9aca0662f7ed01e2e7928ec (patch)
tree3ecc31d93e2cdae2d73d3da251d84d35d75baf5a
parentdfeaed2d8926952e1898f5d75df2a4e83a2a5ff2 (diff)
- Add an BucketExecutor interface taking a bucket and a BucketTask for executing a task by the content layer.
- Add method to register this interface. - Minor followups after PR review. - Avoid including the world when not necessary to avoid having to recompile everyting for the smallest unrelated change.
-rw-r--r--persistence/src/vespa/persistence/spi/abstractpersistenceprovider.h2
-rw-r--r--persistence/src/vespa/persistence/spi/bucketexecutor.h31
-rw-r--r--persistence/src/vespa/persistence/spi/operationcomplete.h4
-rw-r--r--persistence/src/vespa/persistence/spi/package.json6
-rw-r--r--persistence/src/vespa/persistence/spi/persistenceprovider.h7
-rw-r--r--persistence/src/vespa/persistence/spi/providerfactory.h27
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_job.h2
-rw-r--r--storage/src/tests/common/teststorageapp.h3
-rw-r--r--storage/src/tests/persistence/common/filestortestfixture.h1
-rw-r--r--storage/src/tests/persistence/persistencetestutils.h12
-rw-r--r--storage/src/tests/persistence/persistencethread_splittest.cpp1
-rw-r--r--storage/src/tests/persistence/testandsettest.cpp1
-rw-r--r--storage/src/vespa/storage/persistence/asynchandler.cpp1
-rw-r--r--storage/src/vespa/storage/persistence/bucketprocessor.cpp1
-rw-r--r--storage/src/vespa/storage/persistence/bucketprocessor.h7
-rw-r--r--storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp18
-rw-r--r--storage/src/vespa/storage/persistence/filestorage/filestormanager.h26
-rw-r--r--storage/src/vespa/storage/persistence/filestorage/modifiedbucketchecker.cpp1
-rw-r--r--storage/src/vespa/storage/persistence/mergehandler.cpp1
-rw-r--r--storage/src/vespa/storage/persistence/persistencehandler.h1
-rw-r--r--storage/src/vespa/storage/persistence/persistenceutil.cpp1
-rw-r--r--storage/src/vespa/storage/persistence/persistenceutil.h9
-rw-r--r--storage/src/vespa/storage/persistence/provider_error_wrapper.cpp6
-rw-r--r--storage/src/vespa/storage/persistence/provider_error_wrapper.h9
-rw-r--r--storage/src/vespa/storage/persistence/splitbitdetector.cpp1
-rw-r--r--storage/src/vespa/storage/persistence/splitbitdetector.h5
-rw-r--r--storage/src/vespa/storage/persistence/testandsethelper.cpp1
-rw-r--r--storage/src/vespa/storage/storageserver/servicelayernode.h3
28 files changed, 115 insertions, 73 deletions
diff --git a/persistence/src/vespa/persistence/spi/abstractpersistenceprovider.h b/persistence/src/vespa/persistence/spi/abstractpersistenceprovider.h
index 016928ab10e..6bb24f582e3 100644
--- a/persistence/src/vespa/persistence/spi/abstractpersistenceprovider.h
+++ b/persistence/src/vespa/persistence/spi/abstractpersistenceprovider.h
@@ -48,6 +48,8 @@ public:
* Default impl empty.
*/
BucketIdListResult getModifiedBuckets(BucketSpace bucketSpace) const override;
+
+ std::unique_ptr<vespalib::IDestructorCallback> register_executor(std::shared_ptr<BucketExecutor>) override { return {}; }
};
}
diff --git a/persistence/src/vespa/persistence/spi/bucketexecutor.h b/persistence/src/vespa/persistence/spi/bucketexecutor.h
new file mode 100644
index 00000000000..318bec641fe
--- /dev/null
+++ b/persistence/src/vespa/persistence/spi/bucketexecutor.h
@@ -0,0 +1,31 @@
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#pragma once
+
+#include "bucket.h"
+#include "operationcomplete.h"
+
+namespace storage::spi {
+
+
+/**
+ * Task that will be run in thread from content layer.
+ * It will hold a bucket lock while run. At token is provided
+ * for optional async completion. It must not be destructed until
+ * you no longer require the bucket lock.
+ */
+class BucketTask {
+public:
+ virtual ~BucketTask() = default;
+ virtual void run(const Bucket & bucket, std::unique_ptr<OperationComplete> onComplete) = 0;
+};
+
+/**
+ * Interface for running a BucketTask
+ */
+struct BucketExecutor {
+ virtual ~BucketExecutor() = default;
+ virtual void execute(const Bucket & bucket, std::unique_ptr<BucketTask> task) = 0;
+};
+
+}
diff --git a/persistence/src/vespa/persistence/spi/operationcomplete.h b/persistence/src/vespa/persistence/spi/operationcomplete.h
index 18a3c250e24..5a9b8d258df 100644
--- a/persistence/src/vespa/persistence/spi/operationcomplete.h
+++ b/persistence/src/vespa/persistence/spi/operationcomplete.h
@@ -1,4 +1,4 @@
-// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.#pragma once
+// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
@@ -27,4 +27,4 @@ public:
virtual void addResultHandler(const ResultHandler * resultHandler) = 0;
};
-} \ No newline at end of file
+}
diff --git a/persistence/src/vespa/persistence/spi/package.json b/persistence/src/vespa/persistence/spi/package.json
new file mode 100644
index 00000000000..ca831b328c1
--- /dev/null
+++ b/persistence/src/vespa/persistence/spi/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "spi",
+ "version": "1.0.0",
+ "dependencies": {
+ }
+}
diff --git a/persistence/src/vespa/persistence/spi/persistenceprovider.h b/persistence/src/vespa/persistence/spi/persistenceprovider.h
index 2fc0713abe8..9ba752c2579 100644
--- a/persistence/src/vespa/persistence/spi/persistenceprovider.h
+++ b/persistence/src/vespa/persistence/spi/persistenceprovider.h
@@ -10,6 +10,8 @@
#include "selection.h"
#include "clusterstate.h"
#include "operationcomplete.h"
+#include "bucketexecutor.h"
+#include <vespa/vespalib/util/idestructorcallback.h>
namespace document { class FieldSet; }
namespace vespalib { class IDestructorCallback; }
@@ -384,6 +386,11 @@ struct PersistenceProvider
*/
virtual std::unique_ptr<vespalib::IDestructorCallback> register_resource_usage_listener(IResourceUsageListener& listener) = 0;
+ /**
+ * Provides an execute interface that can be used by the provider to execute tasks while bucket guarantees are upheld.
+ * When the returned object goes out of scope the executor is deregistered.
+ */
+ [[nodiscard]] virtual std::unique_ptr<vespalib::IDestructorCallback> register_executor(std::shared_ptr<BucketExecutor> executor) = 0;
};
}
diff --git a/persistence/src/vespa/persistence/spi/providerfactory.h b/persistence/src/vespa/persistence/spi/providerfactory.h
deleted file mode 100644
index 8be143851dd..00000000000
--- a/persistence/src/vespa/persistence/spi/providerfactory.h
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-/**
- * \class storage::spi::ProviderFactory
- * \ingroup spi
- *
- * \brief Factory class to generate a persistence provider interface
- */
-
-#pragma once
-
-#include "persistenceprovider.h"
-
-namespace document { class DocumentTypeRepo; }
-
-namespace storage::spi {
-
-struct ProviderFactory {
- virtual ~ProviderFactory() {}
-
- virtual PersistenceProvider::UP createProviderInstance(
- document::DocumentTypeRepo&) = 0;
-};
-
-} // spi
-} // storage
-
-
diff --git a/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_job.h b/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_job.h
index 35549f21471..ea92d6ef915 100644
--- a/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_job.h
+++ b/searchcore/src/vespa/searchcore/proton/server/lid_space_compaction_job.h
@@ -46,8 +46,6 @@ private:
search::DocumentMetaData getNextDocument(const search::LidUsageStats &stats);
bool scanDocuments(const search::LidUsageStats &stats);
void compactLidSpace(const search::LidUsageStats &stats);
- void refreshRunnable();
- void refreshAndConsiderRunnable();
bool remove_batch_is_ongoing() const;
bool remove_is_ongoing() const;
diff --git a/storage/src/tests/common/teststorageapp.h b/storage/src/tests/common/teststorageapp.h
index 4a49b5d7953..b5295fe94a3 100644
--- a/storage/src/tests/common/teststorageapp.h
+++ b/storage/src/tests/common/teststorageapp.h
@@ -20,7 +20,7 @@
#include "testnodestateupdater.h"
#include <vespa/document/base/testdocman.h>
#include <vespa/document/bucket/fixed_bucket_spaces.h>
-#include <vespa/persistence/spi/persistenceprovider.h>
+#include <persistence/spi/types.h>
#include <vespa/storage/bucketdb/storbucketdb.h>
#include <vespa/storage/common/doneinitializehandler.h>
#include <vespa/storage/common/node_identity.h>
@@ -34,6 +34,7 @@
namespace storage {
+namespace spi { class PersistenceProvider; }
class StorageBucketDBInitializer;
DEFINE_PRIMITIVE_WRAPPER(uint16_t, NodeIndex);
diff --git a/storage/src/tests/persistence/common/filestortestfixture.h b/storage/src/tests/persistence/common/filestortestfixture.h
index 69866f7bbf2..8bb3cf8b9fe 100644
--- a/storage/src/tests/persistence/common/filestortestfixture.h
+++ b/storage/src/tests/persistence/common/filestortestfixture.h
@@ -4,7 +4,6 @@
#include <tests/common/dummystoragelink.h>
#include <tests/common/testhelper.h>
#include <tests/common/teststorageapp.h>
-#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/storage/persistence/filestorage/filestorhandlerimpl.h>
#include <vespa/storage/persistence/filestorage/filestormanager.h>
#include <vespa/storageapi/message/persistence.h>
diff --git a/storage/src/tests/persistence/persistencetestutils.h b/storage/src/tests/persistence/persistencetestutils.h
index 29f77048b51..b7d52bcf241 100644
--- a/storage/src/tests/persistence/persistencetestutils.h
+++ b/storage/src/tests/persistence/persistencetestutils.h
@@ -9,19 +9,19 @@
#include <vespa/storage/persistence/bucketownershipnotifier.h>
#include <vespa/storage/common/messagesender.h>
#include <vespa/storage/common/storagecomponent.h>
-#include <vespa/persistence/spi/persistenceprovider.h>
-#include <vespa/persistence/dummyimpl/dummypersistence.h>
-#include <vespa/storage/storageserver/communicationmanager.h>
+#include <vespa/storage/common/storagelink.h>
+#include <vespa/storageapi/messageapi/storagecommand.h>
+#include <vespa/storageapi/messageapi/storagereply.h>
#include <vespa/document/base/testdocman.h>
#include <vespa/vespalib/gtest/gtest.h>
namespace storage {
struct MessageKeeper : public MessageSender {
- std::vector<api::StorageMessage::SP> _msgs;
+ std::vector<std::shared_ptr<api::StorageMessage>> _msgs;
- void sendCommand(const api::StorageCommand::SP& m) override { _msgs.push_back(m); }
- void sendReply(const api::StorageReply::SP& m) override { _msgs.push_back(m); }
+ void sendCommand(const std::shared_ptr<api::StorageCommand> & m) override { _msgs.push_back(m); }
+ void sendReply(const std::shared_ptr<api::StorageReply> & m) override { _msgs.push_back(m); }
};
struct PersistenceTestEnvironment {
diff --git a/storage/src/tests/persistence/persistencethread_splittest.cpp b/storage/src/tests/persistence/persistencethread_splittest.cpp
index 45b9f5aeaac..7d83bacd44c 100644
--- a/storage/src/tests/persistence/persistencethread_splittest.cpp
+++ b/storage/src/tests/persistence/persistencethread_splittest.cpp
@@ -3,6 +3,7 @@
#include <vespa/storage/persistence/persistencehandler.h>
#include <vespa/storageapi/message/bucketsplitting.h>
#include <vespa/persistence/spi/test.h>
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <tests/persistence/persistencetestutils.h>
#include <vespa/document/test/make_document_bucket.h>
diff --git a/storage/src/tests/persistence/testandsettest.cpp b/storage/src/tests/persistence/testandsettest.cpp
index 4b509033d2e..18c083bba82 100644
--- a/storage/src/tests/persistence/testandsettest.cpp
+++ b/storage/src/tests/persistence/testandsettest.cpp
@@ -9,6 +9,7 @@
#include <vespa/document/update/assignvalueupdate.h>
#include <vespa/document/fieldset/fieldsets.h>
#include <vespa/persistence/spi/test.h>
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <functional>
using std::unique_ptr;
diff --git a/storage/src/vespa/storage/persistence/asynchandler.cpp b/storage/src/vespa/storage/persistence/asynchandler.cpp
index 5ec1623c599..e7f7321a422 100644
--- a/storage/src/vespa/storage/persistence/asynchandler.cpp
+++ b/storage/src/vespa/storage/persistence/asynchandler.cpp
@@ -3,6 +3,7 @@
#include "asynchandler.h"
#include "persistenceutil.h"
#include "testandsethelper.h"
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/document/update/documentupdate.h>
#include <vespa/vespalib/util/isequencedtaskexecutor.h>
diff --git a/storage/src/vespa/storage/persistence/bucketprocessor.cpp b/storage/src/vespa/storage/persistence/bucketprocessor.cpp
index 33706e69701..d86ff18a11d 100644
--- a/storage/src/vespa/storage/persistence/bucketprocessor.cpp
+++ b/storage/src/vespa/storage/persistence/bucketprocessor.cpp
@@ -2,6 +2,7 @@
#include "bucketprocessor.h"
#include <vespa/document/fieldset/fieldsets.h>
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/vespalib/stllike/asciistream.h>
#include <cassert>
#include <stdexcept>
diff --git a/storage/src/vespa/storage/persistence/bucketprocessor.h b/storage/src/vespa/storage/persistence/bucketprocessor.h
index 0f15b4a222d..5b96696475e 100644
--- a/storage/src/vespa/storage/persistence/bucketprocessor.h
+++ b/storage/src/vespa/storage/persistence/bucketprocessor.h
@@ -6,7 +6,12 @@
*/
#pragma once
-#include <vespa/persistence/spi/persistenceprovider.h>
+#include <vespa/persistence/spi/bucket.h>
+#include <vespa/persistence/spi/docentry.h>
+#include <vespa/persistence/spi/context.h>
+
+namespace document { class FieldSet; }
+namespace storage::spi { class PersistenceProvider; }
namespace storage {
diff --git a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
index 1e858943ce8..f378e750f62 100644
--- a/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
+++ b/storage/src/vespa/storage/persistence/filestorage/filestormanager.cpp
@@ -12,6 +12,7 @@
#include <vespa/storage/persistence/bucketownershipnotifier.h>
#include <vespa/storage/persistence/persistencethread.h>
#include <vespa/storage/persistence/persistencehandler.h>
+#include <vespa/storage/persistence/provider_error_wrapper.h>
#include <vespa/storageapi/message/bucketsplitting.h>
#include <vespa/storageapi/message/state.h>
#include <vespa/storageapi/message/persistence.h>
@@ -43,7 +44,7 @@ FileStorManager(const config::ConfigUri & configUri, spi::PersistenceProvider& p
framework::HtmlStatusReporter("filestorman", "File store manager"),
_compReg(compReg),
_component(compReg, "filestormanager"),
- _provider(provider),
+ _provider(std::make_unique<ProviderErrorWrapper>(provider)),
_init_handler(init_handler),
_bucketIdFactory(_component.getBucketIdFactory()),
_persistenceHandlers(),
@@ -92,6 +93,11 @@ FileStorManager::print(std::ostream& out, bool , const std::string& ) const
out << "FileStorManager";
}
+ProviderErrorWrapper &
+FileStorManager::error_wrapper() noexcept {
+ return static_cast<ProviderErrorWrapper &>(*_provider);
+}
+
namespace {
uint32_t computeNumResponseThreads(int configured) {
@@ -137,7 +143,7 @@ FileStorManager::createRegisteredHandler(const ServiceLayerComponent & component
assert(index < _metrics->disk->threads.size());
_persistenceHandlers.push_back(
std::make_unique<PersistenceHandler>(*_sequencedExecutor, component,
- *_config, _provider, *_filestorHandler,
+ *_config, *_provider, *_filestorHandler,
*_bucketOwnershipNotifier, *_metrics->disk->threads[index]));
return *_persistenceHandlers.back();
}
@@ -672,7 +678,7 @@ FileStorManager::onInternal(const shared_ptr<api::InternalCommand>& msg)
{
spi::Context context(msg->getPriority(), msg->getTrace().getLevel());
shared_ptr<DestroyIteratorCommand> cmd(std::static_pointer_cast<DestroyIteratorCommand>(msg));
- _provider.destroyIterator(cmd->getIteratorId(), context);
+ _provider->destroyIterator(cmd->getIteratorId(), context);
msg->getTrace().addChild(context.steal_trace());
return true;
}
@@ -871,7 +877,7 @@ FileStorManager::updateState()
}
contentBucketSpace.setNodeUpInLastNodeStateSeenByProvider(nodeUp);
spi::ClusterState spiState(*derivedClusterState, _component.getIndex(), *contentBucketSpace.getDistribution());
- _provider.setClusterState(bucketSpace, spiState);
+ _provider->setClusterState(bucketSpace, spiState);
}
}
@@ -911,7 +917,7 @@ void FileStorManager::initialize_bucket_databases_from_provider() {
size_t bucket_count = 0;
for (const auto& elem : _component.getBucketSpaceRepo()) {
const auto bucket_space = elem.first;
- const auto bucket_result = _provider.listBuckets(bucket_space);
+ const auto bucket_result = _provider->listBuckets(bucket_space);
assert(!bucket_result.hasError());
const auto& buckets = bucket_result.getList();
LOG(debug, "Fetching bucket info for %zu buckets in space '%s'",
@@ -925,7 +931,7 @@ void FileStorManager::initialize_bucket_databases_from_provider() {
StorBucketDatabase::CREATE_IF_NONEXISTING);
assert(!entry.preExisted());
auto spi_bucket = spi::Bucket(document::Bucket(bucket_space, bucket));
- auto provider_result = _provider.getBucketInfo(spi_bucket);
+ auto provider_result = _provider->getBucketInfo(spi_bucket);
assert(!provider_result.hasError());
entry->setBucketInfo(PersistenceUtil::convertBucketInfo(provider_result.getBucketInfo()));
entry.write();
diff --git a/storage/src/vespa/storage/persistence/filestorage/filestormanager.h b/storage/src/vespa/storage/persistence/filestorage/filestormanager.h
index 7a19d837979..b757227e27d 100644
--- a/storage/src/vespa/storage/persistence/filestorage/filestormanager.h
+++ b/storage/src/vespa/storage/persistence/filestorage/filestormanager.h
@@ -12,7 +12,6 @@
#include <vespa/vespalib/util/document_runnable.h>
#include <vespa/vespalib/util/isequencedtaskexecutor.h>
#include <vespa/document/bucket/bucketid.h>
-#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/storage/bucketdb/storbucketdb.h>
#include <vespa/storage/common/messagesender.h>
#include <vespa/storage/common/servicelayercomponent.h>
@@ -21,7 +20,6 @@
#include <vespa/config-stor-filestor.h>
#include <vespa/storage/persistence/diskthread.h>
-#include <vespa/storage/persistence/provider_error_wrapper.h>
#include <vespa/storage/common/nodestateupdater.h>
#include <vespa/storageframework/generic/status/htmlstatusreporter.h>
@@ -35,6 +33,7 @@ namespace api {
class StorageReply;
class BucketCommand;
}
+namespace spi { class PersistenceProvider; }
struct FileStorManagerTest;
class ReadBucketList;
@@ -43,6 +42,7 @@ class AbortBucketOperationsCommand;
struct DoneInitializeHandler;
class PersistenceHandler;
struct FileStorMetrics;
+class ProviderErrorWrapper;
class FileStorManager : public StorageLinkQueued,
public framework::HtmlStatusReporter,
@@ -50,15 +50,15 @@ class FileStorManager : public StorageLinkQueued,
private config::IFetcherCallback<vespa::config::content::StorFilestorConfig>,
public MessageSender
{
- ServiceLayerComponentRegister & _compReg;
- ServiceLayerComponent _component;
- ProviderErrorWrapper _provider;
- DoneInitializeHandler& _init_handler;
- const document::BucketIdFactory & _bucketIdFactory;
+ ServiceLayerComponentRegister & _compReg;
+ ServiceLayerComponent _component;
+ std::unique_ptr<spi::PersistenceProvider> _provider;
+ DoneInitializeHandler & _init_handler;
+ const document::BucketIdFactory & _bucketIdFactory;
std::vector<std::unique_ptr<PersistenceHandler>> _persistenceHandlers;
std::vector<std::unique_ptr<DiskThread>> _threads;
- std::unique_ptr<BucketOwnershipNotifier> _bucketOwnershipNotifier;
+ std::unique_ptr<BucketOwnershipNotifier> _bucketOwnershipNotifier;
std::unique_ptr<vespa::config::content::StorFilestorConfig> _config;
config::ConfigFetcher _configFetcher;
@@ -79,16 +79,14 @@ public:
void print(std::ostream& out, bool verbose, const std::string& indent) const override;
- FileStorHandler& getFileStorHandler() {
+ FileStorHandler& getFileStorHandler() noexcept {
return *_filestorHandler;
};
- spi::PersistenceProvider& getPersistenceProvider() {
- return _provider;
- }
- ProviderErrorWrapper& error_wrapper() noexcept {
- return _provider;
+ spi::PersistenceProvider& getPersistenceProvider() noexcept {
+ return *_provider;
}
+ ProviderErrorWrapper& error_wrapper() noexcept;
void handleNewState() override;
diff --git a/storage/src/vespa/storage/persistence/filestorage/modifiedbucketchecker.cpp b/storage/src/vespa/storage/persistence/filestorage/modifiedbucketchecker.cpp
index 66a122ec666..f09ebf27c3d 100644
--- a/storage/src/vespa/storage/persistence/filestorage/modifiedbucketchecker.cpp
+++ b/storage/src/vespa/storage/persistence/filestorage/modifiedbucketchecker.cpp
@@ -2,6 +2,7 @@
#include "modifiedbucketchecker.h"
#include "filestormanager.h"
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/config/common/exceptions.h>
#include <algorithm>
diff --git a/storage/src/vespa/storage/persistence/mergehandler.cpp b/storage/src/vespa/storage/persistence/mergehandler.cpp
index d4d4dd5e62b..6d580ead659 100644
--- a/storage/src/vespa/storage/persistence/mergehandler.cpp
+++ b/storage/src/vespa/storage/persistence/mergehandler.cpp
@@ -5,6 +5,7 @@
#include "apply_bucket_diff_entry_complete.h"
#include "apply_bucket_diff_entry_result.h"
#include <vespa/storage/persistence/filestorage/mergestatus.h>
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/vespalib/stllike/asciistream.h>
#include <vespa/vdslib/distribution/distribution.h>
#include <vespa/document/fieldset/fieldsets.h>
diff --git a/storage/src/vespa/storage/persistence/persistencehandler.h b/storage/src/vespa/storage/persistence/persistencehandler.h
index 29f09c47fc4..9e5eefa8c7e 100644
--- a/storage/src/vespa/storage/persistence/persistencehandler.h
+++ b/storage/src/vespa/storage/persistence/persistencehandler.h
@@ -6,7 +6,6 @@
#include "mergehandler.h"
#include "asynchandler.h"
#include "persistenceutil.h"
-#include "provider_error_wrapper.h"
#include "splitjoinhandler.h"
#include "simplemessagehandler.h"
#include <vespa/storage/common/storagecomponent.h>
diff --git a/storage/src/vespa/storage/persistence/persistenceutil.cpp b/storage/src/vespa/storage/persistence/persistenceutil.cpp
index 6e0004af88a..b50abce528a 100644
--- a/storage/src/vespa/storage/persistence/persistenceutil.cpp
+++ b/storage/src/vespa/storage/persistence/persistenceutil.cpp
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "persistenceutil.h"
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/storageapi/messageapi/bucketinforeply.h>
#include <vespa/vespalib/util/exceptions.h>
diff --git a/storage/src/vespa/storage/persistence/persistenceutil.h b/storage/src/vespa/storage/persistence/persistenceutil.h
index 47233b0ded6..99133073a19 100644
--- a/storage/src/vespa/storage/persistence/persistenceutil.h
+++ b/storage/src/vespa/storage/persistence/persistenceutil.h
@@ -2,12 +2,13 @@
#pragma once
#include "types.h"
-#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/storage/common/servicelayercomponent.h>
#include <vespa/storage/persistence/filestorage/filestorhandler.h>
#include <vespa/storage/persistence/filestorage/filestormetrics.h>
#include <vespa/storageframework/generic/clock/timer.h>
#include <vespa/storageapi/messageapi/returncode.h>
+#include <vespa/persistence/spi/result.h>
+#include <vespa/persistence/spi/context.h>
#include <vespa/vespalib/io/fileutil.h>
#include <vespa/storage/storageutil/utils.h>
@@ -15,8 +16,12 @@ namespace storage::api {
class StorageMessage;
class StorageReply;
}
-namespace storage {
+namespace storage::spi {
+ class PersistenceProvider;
+}
+
+namespace storage {
class PersistenceUtil;
diff --git a/storage/src/vespa/storage/persistence/provider_error_wrapper.cpp b/storage/src/vespa/storage/persistence/provider_error_wrapper.cpp
index cf83741f5bb..ada57b66f41 100644
--- a/storage/src/vespa/storage/persistence/provider_error_wrapper.cpp
+++ b/storage/src/vespa/storage/persistence/provider_error_wrapper.cpp
@@ -200,4 +200,10 @@ ProviderErrorWrapper::updateAsync(const spi::Bucket &bucket, spi::Timestamp ts,
_impl.updateAsync(bucket, ts, std::move(upd), context, std::move(onComplete));
}
+std::unique_ptr<vespalib::IDestructorCallback>
+ProviderErrorWrapper::register_executor(std::shared_ptr<spi::BucketExecutor> executor)
+{
+ return _impl.register_executor(std::move(executor));
+}
+
} // ns storage
diff --git a/storage/src/vespa/storage/persistence/provider_error_wrapper.h b/storage/src/vespa/storage/persistence/provider_error_wrapper.h
index fa24dbeea45..b7c9204caf1 100644
--- a/storage/src/vespa/storage/persistence/provider_error_wrapper.h
+++ b/storage/src/vespa/storage/persistence/provider_error_wrapper.h
@@ -61,20 +61,13 @@ public:
std::unique_ptr<vespalib::IDestructorCallback> register_resource_usage_listener(spi::IResourceUsageListener& listener) override;
spi::Result removeEntry(const spi::Bucket&, spi::Timestamp, spi::Context&) override;
- spi::PersistenceProvider& getProviderImplementation() {
- return _impl;
- }
- const spi::PersistenceProvider& getProviderImplementation() const {
- return _impl;
- }
-
void register_error_listener(std::shared_ptr<ProviderErrorListener> listener);
void putAsync(const spi::Bucket &, spi::Timestamp, spi::DocumentSP, spi::Context &, spi::OperationComplete::UP) override;
void removeAsync(const spi::Bucket&, spi::Timestamp, const document::DocumentId&, spi::Context&, spi::OperationComplete::UP) override;
void removeIfFoundAsync(const spi::Bucket&, spi::Timestamp, const document::DocumentId&, spi::Context&, spi::OperationComplete::UP) override;
void updateAsync(const spi::Bucket &, spi::Timestamp, spi::DocumentUpdateSP, spi::Context &, spi::OperationComplete::UP) override;
-
+ std::unique_ptr<vespalib::IDestructorCallback> register_executor(std::shared_ptr<spi::BucketExecutor> executor) override;
private:
template <typename ResultType>
ResultType checkResult(ResultType&& result) const;
diff --git a/storage/src/vespa/storage/persistence/splitbitdetector.cpp b/storage/src/vespa/storage/persistence/splitbitdetector.cpp
index fdf86f61639..e004c6ff36b 100644
--- a/storage/src/vespa/storage/persistence/splitbitdetector.cpp
+++ b/storage/src/vespa/storage/persistence/splitbitdetector.cpp
@@ -2,6 +2,7 @@
#include "splitbitdetector.h"
#include "bucketprocessor.h"
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/document/bucket/bucketidfactory.h>
#include <vespa/document/base/documentid.h>
#include <vespa/document/fieldset/fieldsets.h>
diff --git a/storage/src/vespa/storage/persistence/splitbitdetector.h b/storage/src/vespa/storage/persistence/splitbitdetector.h
index 6f1af6c5970..d2c415fc526 100644
--- a/storage/src/vespa/storage/persistence/splitbitdetector.h
+++ b/storage/src/vespa/storage/persistence/splitbitdetector.h
@@ -17,11 +17,14 @@
*/
#pragma once
-#include <vespa/persistence/spi/persistenceprovider.h>
+#include <vespa/persistence/spi/bucket.h>
+#include <vespa/persistence/spi/context.h>
#include <vespa/vespalib/util/printable.h>
namespace storage {
+namespace spi { class PersistenceProvider; }
+
struct SplitBitDetector
{
enum ResultType {
diff --git a/storage/src/vespa/storage/persistence/testandsethelper.cpp b/storage/src/vespa/storage/persistence/testandsethelper.cpp
index 66b8dbd83fc..00a48d83e3a 100644
--- a/storage/src/vespa/storage/persistence/testandsethelper.cpp
+++ b/storage/src/vespa/storage/persistence/testandsethelper.cpp
@@ -4,6 +4,7 @@
#include "testandsethelper.h"
#include "persistenceutil.h"
#include "fieldvisitor.h"
+#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/document/select/parser.h>
#include <vespa/document/repo/documenttyperepo.h>
#include <vespa/vespalib/util/stringfmt.h>
diff --git a/storage/src/vespa/storage/storageserver/servicelayernode.h b/storage/src/vespa/storage/storageserver/servicelayernode.h
index 2d98b8f9345..f75cf867327 100644
--- a/storage/src/vespa/storage/storageserver/servicelayernode.h
+++ b/storage/src/vespa/storage/storageserver/servicelayernode.h
@@ -13,11 +13,12 @@
#include "storagenode.h"
#include <vespa/storage/visiting/visitormessagesessionfactory.h>
#include <vespa/storage/common/visitorfactory.h>
-#include <vespa/persistence/spi/persistenceprovider.h>
#include <vespa/config/config.h>
namespace storage {
+namespace spi { class PersistenceProvider; }
+
class FileStorManager;
class ServiceLayerNode