From 252fa69118954ca2330c18568c3d65211dc85cd3 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Fri, 21 Jan 2022 15:00:42 +0100 Subject: Prepare for throttling of replay. --- .../vespa/searchcore/proton/common/CMakeLists.txt | 1 + .../vespa/searchcore/proton/common/feedtoken.cpp | 6 ++++ .../src/vespa/searchcore/proton/common/feedtoken.h | 24 +++++++++++--- .../proton/common/replay_feedtoken_state.cpp | 37 ++++++++++++++++++++++ .../proton/common/replay_feedtoken_state.h | 24 ++++++++++++++ .../vespa/searchcore/proton/server/feedstates.cpp | 21 ++++++++---- .../proton/server/operationdonecontext.cpp | 13 ++++++-- .../proton/server/operationdonecontext.h | 10 +++--- .../searchcore/proton/server/putdonecontext.cpp | 6 ++-- .../searchcore/proton/server/putdonecontext.h | 4 ++- .../searchcore/proton/server/removedonecontext.cpp | 4 +-- .../searchcore/proton/server/removedonecontext.h | 2 +- .../searchcore/proton/server/storeonlyfeedview.cpp | 32 +++++++++---------- .../searchcore/proton/server/storeonlyfeedview.h | 2 +- .../searchcore/proton/server/updatedonecontext.cpp | 4 +-- .../searchcore/proton/server/updatedonecontext.h | 2 +- 16 files changed, 148 insertions(+), 44 deletions(-) create mode 100644 searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.cpp create mode 100644 searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h diff --git a/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt b/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt index 421e602a9cf..03bad4c7eaf 100644 --- a/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt +++ b/searchcore/src/vespa/searchcore/proton/common/CMakeLists.txt @@ -18,6 +18,7 @@ vespa_add_library(searchcore_pcommon STATIC ipendinglidtracker.cpp operation_rate_tracker.cpp pendinglidtracker.cpp + replay_feedtoken_state.cpp select_utils.cpp selectcontext.cpp selectpruner.cpp diff --git a/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp b/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp index 675dce10be4..c74819577e9 100644 --- a/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp +++ b/searchcore/src/vespa/searchcore/proton/common/feedtoken.cpp @@ -33,6 +33,12 @@ State::setResult(ResultUP result, bool documentWasFound) { _result = std::move(result); } +bool +State::is_replay() const noexcept +{ + return false; +} + void State::fail() { diff --git a/searchcore/src/vespa/searchcore/proton/common/feedtoken.h b/searchcore/src/vespa/searchcore/proton/common/feedtoken.h index 8ccb4863878..53f551999d2 100644 --- a/searchcore/src/vespa/searchcore/proton/common/feedtoken.h +++ b/searchcore/src/vespa/searchcore/proton/common/feedtoken.h @@ -22,19 +22,33 @@ public: virtual void send(ResultUP result, bool documentWasFound) = 0; }; + +/* + * Interface class for feed token state. + */ +class IState : public vespalib::IDestructorCallback { +public: + virtual bool is_replay() const noexcept = 0; + virtual void fail() = 0; + virtual void setResult(ResultUP result, bool documentWasFound) = 0; + virtual const storage::spi::Result &getResult() = 0; +}; + + /** * This holds the result of the feed operation until it is either failed or acked. * Guarantees that the result is propagated back to the invoker via ITransport interface. */ -class State : public vespalib::IDestructorCallback { +class State : public IState { public: State(const State &) = delete; State & operator = (const State &) = delete; State(ITransport & transport); ~State() override; - void fail(); - void setResult(ResultUP result, bool documentWasFound); - const storage::spi::Result &getResult() { return *_result; } + bool is_replay() const noexcept override; + void fail() override; + void setResult(ResultUP result, bool documentWasFound) override; + const storage::spi::Result &getResult() override { return *_result; } protected: void ack(); private: @@ -71,7 +85,7 @@ make(std::shared_ptr transport) { } -using FeedToken = std::shared_ptr; +using FeedToken = std::shared_ptr; } // namespace proton diff --git a/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.cpp b/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.cpp new file mode 100644 index 00000000000..a3a473c9548 --- /dev/null +++ b/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.cpp @@ -0,0 +1,37 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include "replay_feedtoken_state.h" + +namespace proton::feedtoken { + +ReplayState::ReplayState(vespalib::SharedOperationThrottler::Token throttler_token) + : IState(), + _throttler_token(std::move(throttler_token)) +{ +} + +ReplayState::~ReplayState() = default; + +bool +ReplayState::is_replay() const noexcept +{ + return true; +} + +void +ReplayState::fail() +{ +} + +void +ReplayState::setResult(ResultUP, bool) +{ +} + +const storage::spi::Result& +ReplayState::getResult() +{ + abort(); +} + +} diff --git a/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h b/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h new file mode 100644 index 00000000000..e0993beeb67 --- /dev/null +++ b/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h @@ -0,0 +1,24 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#pragma once + +#include "feedtoken.h" +#include + +namespace proton::feedtoken { + +/* + * Feed token state used during replay. + */ +class ReplayState : public IState { + vespalib::SharedOperationThrottler::Token _throttler_token; +public: + ~ReplayState() override; + ReplayState(vespalib::SharedOperationThrottler::Token throttler_token); + bool is_replay() const noexcept override; + void fail() override; + void setResult(ResultUP result, bool documentWasFound) override; + const storage::spi::Result &getResult() override; +}; + +} diff --git a/searchcore/src/vespa/searchcore/proton/server/feedstates.cpp b/searchcore/src/vespa/searchcore/proton/server/feedstates.cpp index d2626a0d9f4..1c8e17fc474 100644 --- a/searchcore/src/vespa/searchcore/proton/server/feedstates.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/feedstates.cpp @@ -8,8 +8,10 @@ #include #include #include +#include #include #include +#include #include #include @@ -69,14 +71,19 @@ public: ~TransactionLogReplayPacketHandler() override = default; + FeedToken make_replay_feed_token() { + vespalib::SharedOperationThrottler::Token throttler_token; + return std::make_shared(std::move(throttler_token)); + } + void replay(const PutOperation &op) override { - _feed_view_ptr->handlePut(FeedToken(), op); + _feed_view_ptr->handlePut(make_replay_feed_token(), op); } void replay(const RemoveOperation &op) override { - _feed_view_ptr->handleRemove(FeedToken(), op); + _feed_view_ptr->handleRemove(make_replay_feed_token(), op); } void replay(const UpdateOperation &op) override { - _feed_view_ptr->handleUpdate(FeedToken(), op); + _feed_view_ptr->handleUpdate(make_replay_feed_token(), op); } void replay(const NoopOperation &) override {} // ignored void replay(const NewConfigOperation &op) override { @@ -84,7 +91,7 @@ public: } void replay(const DeleteBucketOperation &op) override { - _feed_view_ptr->handleDeleteBucket(op, IDestructorCallback::SP()); + _feed_view_ptr->handleDeleteBucket(op, make_replay_feed_token()); } void replay(const SplitBucketOperation &op) override { _bucketDBHandler.handleSplit(op.getSerialNum(), op.getSource(), @@ -95,15 +102,15 @@ public: op.getSource2(), op.getTarget()); } void replay(const PruneRemovedDocumentsOperation &op) override { - _feed_view_ptr->handlePruneRemovedDocuments(op, IDestructorCallback::SP()); + _feed_view_ptr->handlePruneRemovedDocuments(op, make_replay_feed_token()); } void replay(const MoveOperation &op) override { - _feed_view_ptr->handleMove(op, IDestructorCallback::SP()); + _feed_view_ptr->handleMove(op, make_replay_feed_token()); } void replay(const CreateBucketOperation &) override { } void replay(const CompactLidSpaceOperation &op) override { - _feed_view_ptr->handleCompactLidSpace(op, IDestructorCallback::SP()); + _feed_view_ptr->handleCompactLidSpace(op, make_replay_feed_token()); } NewConfigOperation::IStreamHandler &getNewConfigStreamHandler() override { return _config_store; diff --git a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp index 53b12972c44..9b1c6de15df 100644 --- a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.cpp @@ -1,14 +1,23 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "operationdonecontext.h" +#include namespace proton { -OperationDoneContext::OperationDoneContext(IDestructorCallback::SP token) - : _token(std::move(token)) +OperationDoneContext::OperationDoneContext(std::shared_ptr token, std::shared_ptr done_callback) + : _token(std::move(token)), + _done_callback(std::move(done_callback)) { } OperationDoneContext::~OperationDoneContext() = default; +bool +OperationDoneContext::is_replay() const +{ + return (!_token || _token->is_replay()); +} + + } // namespace proton diff --git a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h index 113aae8c9bf..baf0e98d5a4 100644 --- a/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h +++ b/searchcore/src/vespa/searchcore/proton/server/operationdonecontext.h @@ -4,6 +4,8 @@ #include +namespace proton::feedtoken { class IState; } + namespace proton { /** @@ -16,13 +18,13 @@ namespace proton { class OperationDoneContext : public vespalib::IDestructorCallback { public: - using IDestructorCallback = vespalib::IDestructorCallback; - OperationDoneContext(IDestructorCallback::SP token); + OperationDoneContext(std::shared_ptr token, std::shared_ptr done_callback); ~OperationDoneContext() override; - bool hasToken() const { return static_cast(_token); } + bool is_replay() const; private: - IDestructorCallback::SP _token; + std::shared_ptr _token; + std::shared_ptr _done_callback; }; } // namespace proton diff --git a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp index 7801f21c906..695f39c0097 100644 --- a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.cpp @@ -9,9 +9,11 @@ using document::Document; namespace proton { -PutDoneContext::PutDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted, +PutDoneContext::PutDoneContext(std::shared_ptr token, + std::shared_ptr done_callback, + IPendingLidTracker::Token uncommitted, std::shared_ptr doc, uint32_t lid) - : OperationDoneContext(std::move(token)), + : OperationDoneContext(std::move(token), std::move(done_callback)), _uncommitted(std::move(uncommitted)), _lid(lid), _docIdLimit(nullptr), diff --git a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h index 00e8ac46c93..e0f55816314 100644 --- a/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h +++ b/searchcore/src/vespa/searchcore/proton/server/putdonecontext.h @@ -28,7 +28,9 @@ class PutDoneContext : public OperationDoneContext std::shared_ptr _doc; public: - PutDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted, + PutDoneContext(std::shared_ptr token, + std::shared_ptr done_callback, + IPendingLidTracker::Token uncommitted, std::shared_ptr doc, uint32_t lid); ~PutDoneContext() override; diff --git a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp index 558a57bb8c6..0c93992d427 100644 --- a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.cpp @@ -4,8 +4,8 @@ namespace proton { -RemoveDoneContext::RemoveDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted) - : OperationDoneContext(std::move(token)), +RemoveDoneContext::RemoveDoneContext(std::shared_ptr token, std::shared_ptr done_callback, IPendingLidTracker::Token uncommitted) + : OperationDoneContext(std::move(token), std::move(done_callback)), _uncommitted(std::move(uncommitted)) { } diff --git a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h index 28e15389bb2..62db0f20b84 100644 --- a/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h +++ b/searchcore/src/vespa/searchcore/proton/server/removedonecontext.h @@ -19,7 +19,7 @@ class RemoveDoneContext : public OperationDoneContext IPendingLidTracker::Token _uncommitted; public: - RemoveDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted); + RemoveDoneContext(std::shared_ptr, std::shared_ptr done_callback, IPendingLidTracker::Token uncommitted); ~RemoveDoneContext() override; }; diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp index 97bd940b403..3f1d290acf3 100644 --- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp @@ -43,10 +43,10 @@ namespace proton { namespace { std::shared_ptr -createPutDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted, +createPutDoneContext(FeedToken token, std::shared_ptr done_callback, IPendingLidTracker::Token uncommitted, std::shared_ptr doc, uint32_t lid) { - return std::make_shared(std::move(token), std::move(uncommitted), std::move(doc), lid); + return std::make_shared(std::move(token), std::move(done_callback), std::move(uncommitted), std::move(doc), lid); } std::shared_ptr @@ -66,9 +66,9 @@ void setPrev(DocumentOperation &op, const documentmetastore::IStore::Result &res } std::shared_ptr -createRemoveDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted) +createRemoveDoneContext(FeedToken token, std::shared_ptr done_callback, IPendingLidTracker::Token uncommitted) { - return std::make_shared(std::move(token), std::move(uncommitted)); + return std::make_shared(std::move(token), std::move(done_callback), std::move(uncommitted)); } class SummaryPutDoneContext : public OperationDoneContext @@ -80,7 +80,7 @@ public: }; SummaryPutDoneContext::SummaryPutDoneContext(FeedToken token, IPendingLidTracker::Token uncommitted) - : OperationDoneContext(std::move(token)), + : OperationDoneContext(std::move(token), {}), _uncommitted(std::move(uncommitted)) {} @@ -249,7 +249,7 @@ StoreOnlyFeedView::internalPut(FeedToken token, const PutOperation &putOp) if (putOp.changedDbdId() && useDocumentMetaStore(serialNum)) { _gidToLidChangeHandler.notifyPut(token, docId.getGlobalId(), putOp.getLid(), serialNum); } - auto onWriteDone = createPutDoneContext(std::move(token), get_pending_lid_token(putOp), doc, putOp.getLid()); + auto onWriteDone = createPutDoneContext(std::move(token), {}, get_pending_lid_token(putOp), doc, putOp.getLid()); putSummary(serialNum, putOp.getLid(), doc, onWriteDone); putAttributes(serialNum, putOp.getLid(), *doc, onWriteDone); putIndexedFields(serialNum, putOp.getLid(), doc, onWriteDone); @@ -257,7 +257,7 @@ StoreOnlyFeedView::internalPut(FeedToken token, const PutOperation &putOp) if (docAlreadyExists && putOp.changedDbdId()) { //TODO, better to have an else than an assert ? assert(!putOp.getValidDbdId(_params._subDbId)); - internalRemove(std::move(token), _pendingLidsForCommit->produce(putOp.getPrevLid()), serialNum, putOp.getPrevLid()); + internalRemove(std::move(token), {}, _pendingLidsForCommit->produce(putOp.getPrevLid()), serialNum, putOp.getPrevLid()); } } @@ -458,13 +458,13 @@ StoreOnlyFeedView::makeUpdatedDocument(bool useDocStore, Lid lid, const Document Document::UP prevDoc = _summaryAdapter->get(lid, *_repo); Document::UP newDoc; vespalib::nbostream newStream(12345); - assert(!onWriteDone->hasToken() || useDocStore); + assert(onWriteDone->is_replay() || useDocStore); if (useDocStore) { assert(prevDoc); } if (!prevDoc) { // Replaying, document removed later before summary was flushed. - assert(!onWriteDone->hasToken()); + assert(onWriteDone->is_replay()); // If we've passed serial number for flushed index then we could // also check that this operation is marked for ignore by index // proxy. @@ -478,7 +478,7 @@ StoreOnlyFeedView::makeUpdatedDocument(bool useDocStore, Lid lid, const Document } else { // Replaying, document removed and lid reused before summary // was flushed. - assert(!onWriteDone->hasToken() && !useDocStore); + assert(onWriteDone->is_replay() && !useDocStore); } } promisedDoc.set_value(std::move(newDoc)); @@ -552,7 +552,7 @@ StoreOnlyFeedView::internalRemove(FeedToken token, const RemoveOperationWithDocI if (rmOp.changedDbdId()) { //TODO Prefer else over assert ? assert(!rmOp.getValidDbdId(_params._subDbId)); - internalRemove(std::move(token), _pendingLidsForCommit->produce(rmOp.getPrevLid()), serialNum, rmOp.getPrevLid()); + internalRemove(std::move(token), {}, _pendingLidsForCommit->produce(rmOp.getPrevLid()), serialNum, rmOp.getPrevLid()); } } } @@ -569,16 +569,16 @@ StoreOnlyFeedView::internalRemove(FeedToken token, const RemoveOperationWithGid if (rmOp.getValidPrevDbdId(_params._subDbId)) { if (rmOp.changedDbdId()) { assert(!rmOp.getValidDbdId(_params._subDbId)); - internalRemove(std::move(token), _pendingLidsForCommit->produce(rmOp.getPrevLid()), serialNum, rmOp.getPrevLid()); + internalRemove(std::move(token), {}, _pendingLidsForCommit->produce(rmOp.getPrevLid()), serialNum, rmOp.getPrevLid()); } } } void -StoreOnlyFeedView::internalRemove(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted, SerialNum serialNum, Lid lid) +StoreOnlyFeedView::internalRemove(FeedToken token, std::shared_ptr done_callback, IPendingLidTracker::Token uncommitted, SerialNum serialNum, Lid lid) { _lidReuseDelayer.delayReuse(lid); - auto onWriteDone = createRemoveDoneContext(std::move(token), std::move(uncommitted)); + auto onWriteDone = createRemoveDoneContext(std::move(token), std::move(done_callback), std::move(uncommitted)); removeSummary(serialNum, lid, onWriteDone); removeAttributes(serialNum, lid, onWriteDone); removeIndexedFields(serialNum, lid, onWriteDone); @@ -706,13 +706,13 @@ StoreOnlyFeedView::handleMove(const MoveOperation &moveOp, DoneCallback doneCtx) if (moveOp.changedDbdId() && useDocumentMetaStore(serialNum)) { _gidToLidChangeHandler.notifyPut(FeedToken(), docId.getGlobalId(), moveOp.getLid(), serialNum); } - auto onWriteDone = createPutDoneContext(doneCtx, _pendingLidsForCommit->produce(moveOp.getLid()), doc, moveOp.getLid()); + auto onWriteDone = createPutDoneContext({}, doneCtx, _pendingLidsForCommit->produce(moveOp.getLid()), doc, moveOp.getLid()); putSummary(serialNum, moveOp.getLid(), doc, onWriteDone); putAttributes(serialNum, moveOp.getLid(), *doc, onWriteDone); putIndexedFields(serialNum, moveOp.getLid(), doc, onWriteDone); } if (docAlreadyExists && moveOp.changedDbdId()) { - internalRemove(doneCtx, _pendingLidsForCommit->produce(moveOp.getPrevLid()), serialNum, moveOp.getPrevLid()); + internalRemove({}, doneCtx, _pendingLidsForCommit->produce(moveOp.getPrevLid()), serialNum, moveOp.getPrevLid()); } } diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h index c25accaf4a4..bd8509fa796 100644 --- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h +++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h @@ -180,7 +180,7 @@ private: // returns the number of documents removed. size_t removeDocuments(const RemoveDocumentsOperation &op, bool remove_index_and_attribute_fields, DoneCallback onDone); - void internalRemove(IDestructorCallbackSP token, IPendingLidTracker::Token uncommitted, SerialNum serialNum, Lid lid); + void internalRemove(FeedToken token, std::shared_ptr done_callback,IPendingLidTracker::Token uncommitted, SerialNum serialNum, Lid lid); IPendingLidTracker::Token get_pending_lid_token(const DocumentOperation &op); diff --git a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp index 5842965a18a..16099700980 100644 --- a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.cpp @@ -7,8 +7,8 @@ using document::Document; namespace proton { -UpdateDoneContext::UpdateDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted, const document::DocumentUpdate::SP &upd) - : OperationDoneContext(std::move(token)), +UpdateDoneContext::UpdateDoneContext(std::shared_ptr token, IPendingLidTracker::Token uncommitted, const document::DocumentUpdate::SP &upd) + : OperationDoneContext(std::move(token), {}), _uncommitted(std::move(uncommitted)), _upd(upd), _doc() diff --git a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h index 62448102f30..7dd6c4a61f2 100644 --- a/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h +++ b/searchcore/src/vespa/searchcore/proton/server/updatedonecontext.h @@ -24,7 +24,7 @@ class UpdateDoneContext : public OperationDoneContext document::DocumentUpdate::SP _upd; std::shared_future> _doc; public: - UpdateDoneContext(IDestructorCallback::SP token, IPendingLidTracker::Token uncommitted, const document::DocumentUpdate::SP &upd); + UpdateDoneContext(std::shared_ptr token, IPendingLidTracker::Token uncommitted, const document::DocumentUpdate::SP &upd); ~UpdateDoneContext() override; const document::DocumentUpdate &getUpdate() { return *_upd; } -- cgit v1.2.3 From bac56d3fd2a822a2971ff4fb32c9804392b54fb6 Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Fri, 21 Jan 2022 15:53:25 +0100 Subject: Update class comment. --- .../src/vespa/searchcore/proton/common/replay_feedtoken_state.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h b/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h index e0993beeb67..512f12a50af 100644 --- a/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h +++ b/searchcore/src/vespa/searchcore/proton/common/replay_feedtoken_state.h @@ -8,7 +8,9 @@ namespace proton::feedtoken { /* - * Feed token state used during replay. + * Feed token state used during replay. It contains a throttler token + * which allows the related shared operation throttler to track the completion + * of the feed operation. */ class ReplayState : public IState { vespalib::SharedOperationThrottler::Token _throttler_token; -- cgit v1.2.3