diff options
author | Geir Storli <geirst@yahoo-inc.com> | 2017-05-18 12:24:00 +0000 |
---|---|---|
committer | Geir Storli <geirst@yahoo-inc.com> | 2017-05-18 12:24:00 +0000 |
commit | 00b14675f816c8b7380eed46a3abd9e611a55088 (patch) | |
tree | 4a438d3a3e0de9c6da7063f4fb7a7b54e0be30ba /searchlib | |
parent | 26bda49c00df11822d3e857350a9bf0753f38a46 (diff) |
Must hold guard when accessing _lidInfo size and return 0 as memory gain when lid space cannot be shrunk.
Diffstat (limited to 'searchlib')
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; |