aboutsummaryrefslogtreecommitdiffstats
path: root/storage/src/vespa/storageapi/message/visitor.h
diff options
context:
space:
mode:
Diffstat (limited to 'storage/src/vespa/storageapi/message/visitor.h')
-rw-r--r--storage/src/vespa/storageapi/message/visitor.h244
1 files changed, 244 insertions, 0 deletions
diff --git a/storage/src/vespa/storageapi/message/visitor.h b/storage/src/vespa/storageapi/message/visitor.h
new file mode 100644
index 00000000000..e6835405768
--- /dev/null
+++ b/storage/src/vespa/storageapi/message/visitor.h
@@ -0,0 +1,244 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+/**
+ * @file storageapi/message/visitor.h
+ *
+ * Messages related to visitors, used by the visitor manager.
+ */
+
+#pragma once
+
+#include <vespa/storageapi/defs.h>
+#include <vespa/document/bucket/bucketid.h>
+#include <vespa/vdslib/container/parameters.h>
+#include <vespa/vdslib/container/visitorstatistics.h>
+#include <vespa/storageapi/messageapi/storagecommand.h>
+#include <vespa/storageapi/messageapi/storagereply.h>
+
+namespace storage::api {
+
+/**
+ * @class CreateVisitorCommand
+ * @ingroup message
+ *
+ * @brief Command for creating a visitor.
+ */
+class CreateVisitorCommand : public StorageCommand {
+private:
+ document::BucketSpace _bucketSpace;
+ vespalib::string _libName; // Name of visitor library to use, ie. DumpVisitor.so
+ vdslib::Parameters _params;
+
+ vespalib::string _controlDestination;
+ vespalib::string _dataDestination;
+
+ vespalib::string _docSelection;
+ std::vector<document::BucketId> _buckets;
+ Timestamp _fromTime;
+ Timestamp _toTime;
+
+ uint32_t _visitorCmdId;
+ vespalib::string _instanceId;
+ VisitorId _visitorId; // Set on storage node
+
+ bool _visitRemoves;
+ vespalib::string _fieldSet;
+ bool _visitInconsistentBuckets;
+
+ duration _queueTimeout;
+ uint32_t _maxPendingReplyCount;
+ uint32_t _version;
+
+ uint32_t _maxBucketsPerVisitor;
+
+public:
+ CreateVisitorCommand(document::BucketSpace bucketSpace,
+ vespalib::stringref libraryName,
+ vespalib::stringref instanceId,
+ vespalib::stringref docSelection);
+
+ /** Create another command with similar visitor settings. */
+ CreateVisitorCommand(const CreateVisitorCommand& template_);
+ ~CreateVisitorCommand();
+
+ void setVisitorCmdId(uint32_t id) { _visitorCmdId = id; }
+ void setControlDestination(vespalib::stringref d) { _controlDestination = d; }
+ void setDataDestination(vespalib::stringref d) { _dataDestination = d; }
+ void setParameters(const vdslib::Parameters& params) { _params = params; }
+ void setMaximumPendingReplyCount(uint32_t count) { _maxPendingReplyCount = count; }
+ void setFieldSet(vespalib::stringref fieldSet) { _fieldSet = fieldSet; }
+ void setVisitRemoves(bool value = true) { _visitRemoves = value; }
+ void setVisitInconsistentBuckets(bool visitInconsistent = true) { _visitInconsistentBuckets = visitInconsistent; }
+ void addBucketToBeVisited(const document::BucketId& id) { _buckets.push_back(id); }
+ void setVisitorId(const VisitorId id) { _visitorId = id; }
+ void setInstanceId(vespalib::stringref id) { _instanceId = id; }
+ void setQueueTimeout(duration milliSecs) { _queueTimeout = milliSecs; }
+ void setFromTime(Timestamp ts) { _fromTime = ts; }
+ void setToTime(Timestamp ts) { _toTime = ts; }
+
+ VisitorId getVisitorId() const { return _visitorId; }
+ uint32_t getVisitorCmdId() const { return _visitorCmdId; }
+ document::BucketSpace getBucketSpace() const { return _bucketSpace; }
+ document::Bucket getBucket() const override;
+ document::BucketId super_bucket_id() const;
+ const vespalib::string & getLibraryName() const { return _libName; }
+ const vespalib::string & getInstanceId() const { return _instanceId; }
+ const vespalib::string & getControlDestination() const { return _controlDestination; }
+ const vespalib::string & getDataDestination() const { return _dataDestination; }
+ const vespalib::string & getDocumentSelection() const { return _docSelection; }
+ const vdslib::Parameters& getParameters() const { return _params; }
+ vdslib::Parameters& getParameters() { return _params; }
+ uint32_t getMaximumPendingReplyCount() const { return _maxPendingReplyCount; }
+ const std::vector<document::BucketId>& getBuckets() const { return _buckets; }
+ Timestamp getFromTime() const { return _fromTime; }
+ Timestamp getToTime() const { return _toTime; }
+ std::vector<document::BucketId>& getBuckets() { return _buckets; }
+ bool visitRemoves() const { return _visitRemoves; }
+ const vespalib::string& getFieldSet() const { return _fieldSet; }
+ bool visitInconsistentBuckets() const { return _visitInconsistentBuckets; }
+ duration getQueueTimeout() const { return _queueTimeout; }
+
+ void setVisitorDispatcherVersion(uint32_t version) { _version = version; }
+ uint32_t getVisitorDispatcherVersion() const { return _version; }
+
+ void setMaxBucketsPerVisitor(uint32_t max) { _maxBucketsPerVisitor = max; }
+ uint32_t getMaxBucketsPerVisitor() const { return _maxBucketsPerVisitor; }
+
+ void print(std::ostream& out, bool verbose, const std::string& indent) const override;
+ DECLARE_STORAGECOMMAND(CreateVisitorCommand, onCreateVisitor)
+};
+
+/**
+ * @class CreateVisitorReply
+ * @ingroup message
+ *
+ * @brief Response to a create visitor command.
+ */
+class CreateVisitorReply : public StorageReply {
+private:
+ document::BucketId _super_bucket_id;
+ document::BucketId _lastBucket;
+ vdslib::VisitorStatistics _visitorStatistics;
+
+public:
+ explicit CreateVisitorReply(const CreateVisitorCommand& cmd);
+
+ void print(std::ostream& out, bool verbose, const std::string& indent) const override;
+
+ void setLastBucket(const document::BucketId& lastBucket) { _lastBucket = lastBucket; }
+
+ const document::BucketId& super_bucket_id() const { return _super_bucket_id; }
+ const document::BucketId& getLastBucket() const { return _lastBucket; }
+
+ void setVisitorStatistics(const vdslib::VisitorStatistics& stats) { _visitorStatistics = stats; }
+
+ const vdslib::VisitorStatistics& getVisitorStatistics() const { return _visitorStatistics; }
+
+ DECLARE_STORAGEREPLY(CreateVisitorReply, onCreateVisitorReply)
+};
+
+/**
+ * @class DestroyVisitorCommand
+ * @ingroup message
+ *
+ * @brief Command for removing a visitor.
+ */
+class DestroyVisitorCommand : public StorageCommand {
+private:
+ vespalib::string _instanceId;
+
+public:
+ explicit DestroyVisitorCommand(vespalib::stringref instanceId);
+
+ const vespalib::string & getInstanceId() const { return _instanceId; }
+
+ void print(std::ostream& out, bool verbose, const std::string& indent) const override;
+
+ DECLARE_STORAGECOMMAND(DestroyVisitorCommand, onDestroyVisitor)
+};
+
+/**
+ * @class DestroyVisitorReply
+ * @ingroup message
+ *
+ * @brief Response to a destroy visitor command.
+ */
+class DestroyVisitorReply : public StorageReply {
+public:
+ explicit DestroyVisitorReply(const DestroyVisitorCommand& cmd);
+
+ void print(std::ostream& out, bool verbose, const std::string& indent) const override;
+
+ DECLARE_STORAGEREPLY(DestroyVisitorReply, onDestroyVisitorReply)
+};
+
+/**
+ * @class VisitorInfoCommand
+ * @ingroup message
+ *
+ * @brief Sends status information of an ongoing visitor.
+ *
+ * Includes three different kinds of data.
+ * - Notification when visiting is complete.
+ * - Notification when individual buckets have been completely visited.
+ * (Including the timestamp of the newest document visited)
+ * - Notification that some error condition arose during visiting.
+ */
+class VisitorInfoCommand : public StorageCommand {
+public:
+ struct BucketTimestampPair {
+ document::BucketId bucketId;
+ Timestamp timestamp;
+
+ BucketTimestampPair() noexcept : bucketId(), timestamp(0) {}
+ BucketTimestampPair(const document::BucketId& bucket, const Timestamp& ts) noexcept
+ : bucketId(bucket), timestamp(ts)
+ {}
+
+ bool operator==(const BucketTimestampPair& other) const noexcept {
+ return (bucketId == other.bucketId && timestamp && other.timestamp);
+ }
+ };
+
+private:
+ bool _completed;
+ std::vector<BucketTimestampPair> _bucketsCompleted;
+ ReturnCode _error;
+
+public:
+ VisitorInfoCommand();
+ ~VisitorInfoCommand() override;
+
+ void setErrorCode(ReturnCode && code) { _error = std::move(code); }
+ void setCompleted() { _completed = true; }
+ void setBucketCompleted(const document::BucketId& id, Timestamp lastVisited) {
+ _bucketsCompleted.push_back(BucketTimestampPair(id, lastVisited));
+ }
+ void setBucketsCompleted(const std::vector<BucketTimestampPair>& bc) {
+ _bucketsCompleted = bc;
+ }
+
+ const ReturnCode& getErrorCode() const { return _error; }
+ const std::vector<BucketTimestampPair>& getCompletedBucketsList() const {
+ return _bucketsCompleted;
+ }
+ bool visitorCompleted() const { return _completed; }
+
+ void print(std::ostream& out, bool verbose, const std::string& indent) const override;
+
+ DECLARE_STORAGECOMMAND(VisitorInfoCommand, onVisitorInfo)
+};
+
+std::ostream& operator<<(std::ostream& out, const VisitorInfoCommand::BucketTimestampPair& pair);
+
+class VisitorInfoReply : public StorageReply {
+ bool _completed;
+
+public:
+ VisitorInfoReply(const VisitorInfoCommand& cmd);
+ bool visitorCompleted() const { return _completed; }
+ void print(std::ostream& out, bool verbose, const std::string& indent) const override;
+
+ DECLARE_STORAGEREPLY(VisitorInfoReply, onVisitorInfoReply)
+};
+
+}