summaryrefslogtreecommitdiffstats
path: root/searchlib
diff options
context:
space:
mode:
authorGeir Storli <geirst@yahoo-inc.com>2017-05-18 12:24:00 +0000
committerGeir Storli <geirst@yahoo-inc.com>2017-05-18 12:24:00 +0000
commit00b14675f816c8b7380eed46a3abd9e611a55088 (patch)
tree4a438d3a3e0de9c6da7063f4fb7a7b54e0be30ba /searchlib
parent26bda49c00df11822d3e857350a9bf0753f38a46 (diff)
Must hold guard when accessing _lidInfo size and return 0 as memory gain when lid space cannot be shrunk.
Diffstat (limited to 'searchlib')
-rw-r--r--searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp1
-rw-r--r--searchlib/src/vespa/searchlib/docstore/logdatastore.cpp15
-rw-r--r--searchlib/src/vespa/searchlib/docstore/logdatastore.h1
3 files changed, 15 insertions, 2 deletions
diff --git a/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp b/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp
index 99259b109b2..1952cf2b9ea 100644
--- a/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp
+++ b/searchlib/src/tests/docstore/logdatastore/logdatastore_test.cpp
@@ -913,6 +913,7 @@ TEST_F("require that lid space can be compacted and shrunk", Fixture)
{
f.write(1).write(2);
EXPECT_FALSE(f.store.canShrinkLidSpace());
+ EXPECT_EQUAL(0u, f.store.getEstimatedShrinkLidSpaceGain());
f.compactLidSpace(2);
MemoryUsage before = f.store.getMemoryUsage();
diff --git a/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp b/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp
index e7b80fbe1cb..69a11b31ec1 100644
--- a/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp
+++ b/searchlib/src/vespa/searchlib/docstore/logdatastore.cpp
@@ -1138,6 +1138,13 @@ LogDataStore::compactLidSpace(uint32_t wantedDocLidLimit)
bool
LogDataStore::canShrinkLidSpace() const
{
+ LockGuard guard(_updateLock);
+ return canShrinkLidSpace(guard);
+}
+
+bool
+LogDataStore::canShrinkLidSpace(const vespalib::LockGuard &) const
+{
return getDocIdLimit() < _lidInfo.size() &&
_compactLidSpaceGeneration < _genHandler.getFirstUsedGeneration();
}
@@ -1145,16 +1152,20 @@ LogDataStore::canShrinkLidSpace() const
size_t
LogDataStore::getEstimatedShrinkLidSpaceGain() const
{
+ LockGuard guard(_updateLock);
+ if (!canShrinkLidSpace(guard)) {
+ return 0;
+ }
return (_lidInfo.size() - getDocIdLimit()) * sizeof(uint64_t);
}
void
LogDataStore::shrinkLidSpace()
{
- if (!canShrinkLidSpace()) {
+ LockGuard guard(_updateLock);
+ if (!canShrinkLidSpace(guard)) {
return;
}
- LockGuard guard(_updateLock);
_lidInfo.shrink(getDocIdLimit());
incGeneration();
}
diff --git a/searchlib/src/vespa/searchlib/docstore/logdatastore.h b/searchlib/src/vespa/searchlib/docstore/logdatastore.h
index 45b0d6e5f50..9325baf14aa 100644
--- a/searchlib/src/vespa/searchlib/docstore/logdatastore.h
+++ b/searchlib/src/vespa/searchlib/docstore/logdatastore.h
@@ -306,6 +306,7 @@ private:
bool shouldCompactToActiveFile(size_t compactedSize) const;
std::pair<bool, FileId> findNextToCompact();
void incGeneration();
+ bool canShrinkLidSpace(const vespalib::LockGuard &guard) const;
typedef std::vector<FileId> FileIdxVector;
Config _config;