From b275087c2a110a1dc9aca0662f7ed01e2e7928ec Mon Sep 17 00:00:00 2001 From: Henning Baldersheim Date: Thu, 14 Jan 2021 15:46:56 +0000 Subject: - 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. --- .../persistence/spi/abstractpersistenceprovider.h | 2 ++ .../src/vespa/persistence/spi/bucketexecutor.h | 31 ++++++++++++++++++++++ .../src/vespa/persistence/spi/operationcomplete.h | 4 +-- persistence/src/vespa/persistence/spi/package.json | 6 +++++ .../vespa/persistence/spi/persistenceprovider.h | 7 +++++ .../src/vespa/persistence/spi/providerfactory.h | 27 ------------------- 6 files changed, 48 insertions(+), 29 deletions(-) create mode 100644 persistence/src/vespa/persistence/spi/bucketexecutor.h create mode 100644 persistence/src/vespa/persistence/spi/package.json delete mode 100644 persistence/src/vespa/persistence/spi/providerfactory.h (limited to 'persistence') 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 register_executor(std::shared_ptr) 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 onComplete) = 0; +}; + +/** + * Interface for running a BucketTask + */ +struct BucketExecutor { + virtual ~BucketExecutor() = default; + virtual void execute(const Bucket & bucket, std::unique_ptr 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 namespace document { class FieldSet; } namespace vespalib { class IDestructorCallback; } @@ -384,6 +386,11 @@ struct PersistenceProvider */ virtual std::unique_ptr 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 register_executor(std::shared_ptr 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 - - -- cgit v1.2.3