summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-10-27 14:19:25 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-10-27 14:19:25 +0000
commit150054b42a7dcd7166fc5e63881a623687734f83 (patch)
tree34d6e3c8b0f1586380810f1ac994225d0752756e /searchcore
parentb8a721b2dfedd10ede9cf571fb3fb8060449b14a (diff)
Wait for trackers to drain.
Diffstat (limited to 'searchcore')
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/combiningfeedview.cpp11
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/combiningfeedview.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentdb.cpp27
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/documentdb.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/ifeedview.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp6
-rw-r--r--searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h1
-rw-r--r--searchcore/src/vespa/searchcore/proton/test/dummy_feed_view.h1
8 files changed, 36 insertions, 13 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.cpp b/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.cpp
index a5efb0a66e9..5f7f26dfadd 100644
--- a/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.cpp
@@ -248,6 +248,17 @@ CombiningFeedView::getUncommittedLidsTracker() {
LOG_ABORT("CombiningFeedView::getUncommittedLidsTracker should never be called.");
}
+bool
+CombiningFeedView::isDrained() const
+{
+ for (const auto &view : _views) {
+ if ( ! view->isDrained()) {
+ return false;
+ }
+ }
+ return true;
+}
+
void
CombiningFeedView::
handlePruneRemovedDocuments(const PruneRemovedDocumentsOperation &pruneOp)
diff --git a/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.h b/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.h
index 3a37fdc37cb..15bbf73ac04 100644
--- a/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.h
+++ b/searchcore/src/vespa/searchcore/proton/server/combiningfeedview.h
@@ -80,6 +80,7 @@ public:
void handlePruneRemovedDocuments(const PruneRemovedDocumentsOperation &pruneOp) override;
void handleCompactLidSpace(const CompactLidSpaceOperation &op) override;
ILidCommitState & getUncommittedLidsTracker() override;
+ bool isDrained() const override;
// Called by document db executor
void setCalculator(const IBucketStateCalculator::SP &newCalc);
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp b/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp
index b452c9335c1..3e3ed260a90 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/documentdb.cpp
@@ -493,15 +493,6 @@ DocumentDB::applyConfig(DocumentDBConfig::SP configSnapshot, SerialNum serialNum
}
}
-
-namespace {
-void
-doNothing(IFeedView::SP)
-{
- // Called by index executor, delays when feed view is dropped.
-}
-} // namespace
-
void
DocumentDB::performDropFeedView(IFeedView::SP feedView)
{
@@ -517,15 +508,25 @@ DocumentDB::performDropFeedView(IFeedView::SP feedView)
void
-DocumentDB::performDropFeedView2(IFeedView::SP feedView)
-{
+DocumentDB::performDropFeedView2(IFeedView::SP feedView) {
// Called by executor task, delays when feed view is dropped.
// Also called by DocumentDB::receive() method to keep feed view alive
_writeService.indexFieldInverter().sync();
_writeService.indexFieldWriter().sync();
+ masterExecute([this, feedView]() { performDropFeedView3(feedView, 10); });
+}
- // Feed view is kept alive in the closure's shared ptr.
- masterExecute([feedView] () { doNothing(feedView); });
+void
+DocumentDB::performDropFeedView3(IFeedView::SP feedView, uint32_t numRetries) {
+ // We must keep the feedView allive until all operations are drained.
+ // TODO: This is a very brittle appraoch that we should reconsider.
+ if (feedView && ! feedView->isDrained()) {
+ LOG(warning, "FeedView for document type '%s' has not been drained. Reposting to check again. %d retries left",
+ getName().c_str(), numRetries);
+ if (numRetries > 0) {
+ masterExecute([this, feedView, numRetries]() { performDropFeedView3(feedView, numRetries - 1); });
+ }
+ }
}
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentdb.h b/searchcore/src/vespa/searchcore/proton/server/documentdb.h
index ef0ed729622..4c4840446fe 100644
--- a/searchcore/src/vespa/searchcore/proton/server/documentdb.h
+++ b/searchcore/src/vespa/searchcore/proton/server/documentdb.h
@@ -192,6 +192,7 @@ private:
*/
void performDropFeedView(IFeedView::SP feedView);
void performDropFeedView2(IFeedView::SP feedView);
+ void performDropFeedView3(IFeedView::SP feedView, uint32_t numRetries);
/**
* Implements IFeedHandlerOwner
diff --git a/searchcore/src/vespa/searchcore/proton/server/ifeedview.h b/searchcore/src/vespa/searchcore/proton/server/ifeedview.h
index 8dd7ae8474e..d575b08e47b 100644
--- a/searchcore/src/vespa/searchcore/proton/server/ifeedview.h
+++ b/searchcore/src/vespa/searchcore/proton/server/ifeedview.h
@@ -66,6 +66,7 @@ public:
virtual void handleCompactLidSpace(const CompactLidSpaceOperation &op) = 0;
virtual ILidCommitState & getUncommittedLidsTracker() = 0;
virtual bool allowEarlyAck() const = 0;
+ virtual bool isDrained() const = 0;
};
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
index 186c321d920..cac32e3a7ed 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.cpp
@@ -879,4 +879,10 @@ StoreOnlyFeedView::getDocumentMetaStorePtr() const
return &_documentMetaStoreContext->get();
}
+bool
+StoreOnlyFeedView::isDrained() const
+{
+ return _pendingLidsForDocStore.getState() == ILidCommitState::State::COMPLETED;
+}
+
} // namespace proton
diff --git a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
index da1459d521c..93803e3300e 100644
--- a/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
+++ b/searchcore/src/vespa/searchcore/proton/server/storeonlyfeedview.h
@@ -245,6 +245,7 @@ public:
void heartBeat(search::SerialNum serialNum) override;
void sync() override;
void forceCommit(SerialNum serialNum, DoneCallback onDone) override;
+ bool isDrained() const override;
/**
* Prune lids present in operation. Caller must call doneSegment()
diff --git a/searchcore/src/vespa/searchcore/proton/test/dummy_feed_view.h b/searchcore/src/vespa/searchcore/proton/test/dummy_feed_view.h
index b96fd77409c..59afbb8f197 100644
--- a/searchcore/src/vespa/searchcore/proton/test/dummy_feed_view.h
+++ b/searchcore/src/vespa/searchcore/proton/test/dummy_feed_view.h
@@ -35,6 +35,7 @@ struct DummyFeedView : public IFeedView
void forceCommit(search::SerialNum, DoneCallback) override { }
ILidCommitState & getUncommittedLidsTracker() override;
bool allowEarlyAck() const override { return false; }
+ bool isDrained() const override { return true; }
};
}