diff options
Diffstat (limited to 'searchcore/src/tests')
8 files changed, 269 insertions, 0 deletions
diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/CMakeLists.txt b/searchcore/src/tests/proton/reference/document_db_referent_registry/CMakeLists.txt new file mode 100644 index 00000000000..d30602ce8e5 --- /dev/null +++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchcore_document_db_referent_registry_test_app TEST + SOURCES + document_db_referent_registry_test.cpp + DEPENDS + searchcore_reference + searchcore_documentmetastore + searchcore_bucketdb +) +vespa_add_test(NAME searchcore_document_db_referent_registry_test_app COMMAND searchcore_document_db_referent_registry_test_app) diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/DESC b/searchcore/src/tests/proton/reference/document_db_referent_registry/DESC new file mode 100644 index 00000000000..03d7d0f167a --- /dev/null +++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/DESC @@ -0,0 +1 @@ +document_db_referent_registry test. Take a look at document_db_referent_registry_test.cpp for details. diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/FILES b/searchcore/src/tests/proton/reference/document_db_referent_registry/FILES new file mode 100644 index 00000000000..6ba8e0632f0 --- /dev/null +++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/FILES @@ -0,0 +1 @@ +document_db_referent_registry_test.cpp diff --git a/searchcore/src/tests/proton/reference/document_db_referent_registry/document_db_referent_registry_test.cpp b/searchcore/src/tests/proton/reference/document_db_referent_registry/document_db_referent_registry_test.cpp new file mode 100644 index 00000000000..dd2b14cca16 --- /dev/null +++ b/searchcore/src/tests/proton/reference/document_db_referent_registry/document_db_referent_registry_test.cpp @@ -0,0 +1,101 @@ +// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/stllike/string.h> +#include <vespa/searchcore/proton/reference/document_db_referent_registry.h> +#include <vespa/searchcore/proton/reference/i_document_db_referent.h> +#include <thread> +#include <vespa/log/log.h> +LOG_SETUP("document_db_reference_registry_test"); + +namespace proton +{ + +namespace +{ + + +std::mutex lock; +std::shared_ptr<IDocumentDBReferent> getFooResult; + +void getFooTask(const IDocumentDBReferentRegistry *registry) +{ + auto result = registry->getDocumentDBReferent("foo"); + std::lock_guard<std::mutex> guard(lock); + getFooResult = result; +} + +std::shared_ptr<IDocumentDBReferent> checkFooResult() +{ + std::lock_guard<std::mutex> guard(lock); + return getFooResult; +} + +} + +struct MyDocumentDBReferent : public IDocumentDBReferent +{ + MyDocumentDBReferent() + { + } + virtual ~MyDocumentDBReferent() { } + virtual std::shared_ptr<search::AttributeVector> getAttribute(vespalib::stringref name) override { + (void) name; + return std::shared_ptr<search::AttributeVector>(); + } + virtual std::shared_ptr<search::IGidToLidMapperFactory> getGidToLidMapperFactory() override { + return std::shared_ptr<search::IGidToLidMapperFactory>(); + } +}; + +struct Fixture +{ + + DocumentDBReferentRegistry _registry; + + Fixture() + : _registry() + { + } + + std::shared_ptr<MyDocumentDBReferent> + add(vespalib::string name) { + auto referent = std::make_shared<MyDocumentDBReferent>(); + _registry.addDocumentDBReferent(name, referent); + return referent; + } +}; + +TEST_F("Test that we can instantiate registry with two referents", Fixture) +{ + auto referentFoo = f.add("foo"); + auto referentBar = f.add("bar"); + EXPECT_NOT_EQUAL(referentFoo.get(), referentBar.get()); + auto referent = f._registry.getDocumentDBReferent("foo"); + EXPECT_EQUAL(referentFoo.get(), referent.get()); + referent = f._registry.getDocumentDBReferent("bar"); + EXPECT_EQUAL(referentBar.get(), referent.get()); +} + +TEST_F("Test that we block get until related add is completed", Fixture) +{ + const IDocumentDBReferentRegistry ®istry = f._registry; + std::thread getFooThread(getFooTask, ®istry); + sleep(1); + std::shared_ptr<IDocumentDBReferent> nullResult; + EXPECT_EQUAL(nullResult.get(), checkFooResult().get()); + auto referentFoo = f.add("foo"); + std::shared_ptr<IDocumentDBReferent> checkResult; + for (int retry = 0; retry < 60 && !checkResult; ++retry) { + sleep(1); + checkResult = checkFooResult(); + } + EXPECT_EQUAL(referentFoo.get(), checkResult.get()); + getFooThread.join(); +} + +} + +TEST_MAIN() +{ + TEST_RUN_ALL(); +} diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/CMakeLists.txt b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/CMakeLists.txt new file mode 100644 index 00000000000..259f44e101d --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +vespa_add_executable(searchcore_gid_to_lid_mapper_test_app TEST + SOURCES + gid_to_lid_mapper_test.cpp + DEPENDS + searchcore_reference + searchcore_documentmetastore + searchcore_bucketdb +) +vespa_add_test(NAME searchcore_gid_to_lid_mapper_test_app COMMAND searchcore_gid_to_lid_mapper_test_app) diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/DESC b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/DESC new file mode 100644 index 00000000000..f251a0c3ac2 --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/DESC @@ -0,0 +1 @@ +gid_to_lid_mapper test. Take a look at gid_to_lid_mapper_test.cpp for details. diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/FILES b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/FILES new file mode 100644 index 00000000000..13c38a92974 --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/FILES @@ -0,0 +1 @@ +gid_to_lid_mapper_test.cpp diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_mapper/gid_to_lid_mapper_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/gid_to_lid_mapper_test.cpp new file mode 100644 index 00000000000..3506e88cea5 --- /dev/null +++ b/searchcore/src/tests/proton/reference/gid_to_lid_mapper/gid_to_lid_mapper_test.cpp @@ -0,0 +1,144 @@ +// Copyright 2017 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/searchcore/proton/bucketdb/bucket_db_owner.h> +#include <vespa/searchcore/proton/documentmetastore/documentmetastore.h> +#include <vespa/vespalib/stllike/string.h> +#include <vespa/document/base/documentid.h> +#include <vespa/document/bucket/bucketid.h> +#include <vespa/searchcore/proton/reference/gid_to_lid_mapper.h> +#include <vespa/searchcore/proton/reference/gid_to_lid_mapper_factory.h> +#include <vespa/log/log.h> +LOG_SETUP("gid_to_lid_mapper_test"); + +using document::GlobalId; +using document::BucketId; +using document::DocumentId; +using storage::spi::Timestamp; +using vespalib::GenerationHandler; + +namespace proton { + +namespace { + +GlobalId toGid(vespalib::stringref docId) { + return DocumentId(docId).getGlobalId(); +} + +vespalib::string doc1("id:test:music::1"); +vespalib::string doc2("id:test:music::2"); +vespalib::string doc3("id:test:music::3"); + +static constexpr uint32_t numBucketBits = UINT32_C(20); + +BucketId toBucketId(const GlobalId &gid) { + BucketId bucketId(gid.convertToBucketId()); + bucketId.setUsedBits(numBucketBits); + return bucketId; +} + +void assertLid(const std::unique_ptr<search::IGidToLidMapper> &mapper, const vespalib::string &docId, uint32_t lid) { + EXPECT_EQUAL(lid, mapper->mapGidToLid(toGid(docId))); +} + +} + +struct Fixture +{ + + BucketDBOwner::SP _bucketDB; + std::shared_ptr<DocumentMetaStore> _dms; + Timestamp _timestamp; + using generation_t = GenerationHandler::generation_t; + + Fixture() + : _bucketDB(std::make_shared<BucketDBOwner>()), + _dms(std::make_shared<DocumentMetaStore>(_bucketDB)) + { + populate(); + } + + void bumpTimeStamp() { + _timestamp = Timestamp(_timestamp.getValue() + 1); + } + + void put(vespalib::stringref docId, uint32_t lid) { + bumpTimeStamp(); + const GlobalId gid(toGid(docId)); + _dms->put(gid, toBucketId(gid), _timestamp, lid); + _dms->commit(); + } + + uint32_t put(vespalib::stringref docId) { + auto inspectRes = _dms->inspect(toGid(docId)); + uint32_t lid = inspectRes.getLid(); + put(docId, lid); + return lid; + } + + void remove(uint32_t lid) { + _dms->remove(lid); + _dms->removeComplete(lid); + _dms->commit(); + } + + + void populate() { + put(doc1, 4); + put(doc2, 7); + _dms->constructFreeList(); + } + + std::shared_ptr<search::IGidToLidMapperFactory> getGidToLidMapperFactory() { + return std::make_shared<GidToLidMapperFactory>(_dms); + } + + void assertGenerations(generation_t currentGeneration, generation_t firstUsedGeneration) + { + (void) currentGeneration; + (void) firstUsedGeneration; +#if 1 + const GenerationHandler &handler = _dms->getGenerationHandler(); + EXPECT_EQUAL(currentGeneration, handler.getCurrentGeneration()); + EXPECT_EQUAL(firstUsedGeneration, handler.getFirstUsedGeneration()); +#endif + } +}; + +TEST_F("Test that we can use gid mapper to get lids", Fixture) +{ + auto factory = f.getGidToLidMapperFactory(); + auto mapper = factory->getMapper(); + TEST_DO(assertLid(mapper, doc1, 4)); + TEST_DO(assertLid(mapper, doc2, 7)); + TEST_DO(assertLid(mapper, doc3, 0)); +} + +TEST_F("Test that mapper holds read guard", Fixture) +{ + TEST_DO(f.assertGenerations(3, 3)); + auto factory = f.getGidToLidMapperFactory(); + uint32_t lid3 = f.put(doc3); + EXPECT_EQUAL(1u, lid3); + TEST_DO(assertLid(factory->getMapper(), doc3, 1)); + TEST_DO(f.assertGenerations(4, 4)); + // Remove and readd withoug guard, old docid can be reused + f.remove(lid3); + lid3 = f.put(doc3); + EXPECT_EQUAL(1u, lid3); + TEST_DO(assertLid(factory->getMapper(), doc3, 1)); + TEST_DO(f.assertGenerations(7, 7)); + // Remove and readd withoug guard, old docid cannot be reused + auto mapper = factory->getMapper(); + f.remove(lid3); + lid3 = f.put(doc3); + EXPECT_EQUAL(2u, lid3); + TEST_DO(assertLid(mapper, doc3, 2)); + TEST_DO(f.assertGenerations(10, 7)); +} + +} + +TEST_MAIN() +{ + TEST_RUN_ALL(); +} |