diff options
author | Tor Egge <Tor.Egge@online.no> | 2021-11-18 20:01:35 +0100 |
---|---|---|
committer | Tor Egge <Tor.Egge@online.no> | 2021-11-18 20:01:35 +0100 |
commit | 673f7324d93137cf781c2a0475017ed5d8121803 (patch) | |
tree | 8d9625ee6cbb41b0fed34dc6e16fdd1abc010d95 /searchcore/src/tests/proton/reference | |
parent | 0654fa7787092a5f101572629c11860f5480e058 (diff) |
Add a vector of gids to remove to ReferenceAttribute::populateTargetLids()
signature. These gids represent the target documents removed since the last
feed view force commit where the live gid to lid mapping in the document
meta store was made available as a frozen tree.
Diffstat (limited to 'searchcore/src/tests/proton/reference')
3 files changed, 45 insertions, 7 deletions
diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp index b64e972c4cf..3474a4297c7 100644 --- a/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_handler/gid_to_lid_change_handler_test.cpp @@ -38,6 +38,7 @@ class ListenerStats { uint32_t _createdListeners; uint32_t _registeredListeners; uint32_t _destroyedListeners; + std::vector<GlobalId> _initial_removes; public: ListenerStats() noexcept @@ -46,7 +47,8 @@ public: _removeChanges(0u), _createdListeners(0u), _registeredListeners(0u), - _destroyedListeners(0u) + _destroyedListeners(0u), + _initial_removes() { } @@ -64,7 +66,7 @@ public: ++_removeChanges; } void markCreatedListener() { lock_guard guard(_lock); ++_createdListeners; } - void markRegisteredListener() { lock_guard guard(_lock); ++_registeredListeners; } + void markRegisteredListener(const std::vector<GlobalId>& removes) { lock_guard guard(_lock); ++_registeredListeners; _initial_removes = removes; } void markDestroyedListener() { lock_guard guard(_lock); ++_destroyedListeners; } uint32_t getCreatedListeners() const { return _createdListeners; } @@ -84,6 +86,7 @@ public: EXPECT_EQUAL(expPutChanges, _putChanges); EXPECT_EQUAL(expRemoveChanges, _removeChanges); } + const std::vector<GlobalId>& get_initial_removes() const noexcept { return _initial_removes; } }; class MyListener : public IGidToLidChangeListener @@ -105,7 +108,7 @@ public: ~MyListener() override { _stats.markDestroyedListener(); } void notifyPutDone(IDestructorCallbackSP, GlobalId, uint32_t) override { _stats.notifyPutDone(); } void notifyRemove(IDestructorCallbackSP, GlobalId) override { _stats.notifyRemove(); } - void notifyRegistered() override { _stats.markRegisteredListener(); } + void notifyRegistered(const std::vector<GlobalId>& removes) override { _stats.markRegisteredListener(removes); } const vespalib::string &getName() const override { return _name; } const vespalib::string &getDocTypeName() const override { return _docTypeName; } }; @@ -233,6 +236,16 @@ TEST_F("Test that we keep old listener when registering duplicate", Fixture) TEST_DO(stats.assertListeners(2, 1, 1)); } +TEST_F("Test that pending removes are passed on to new listener", Fixture) +{ + auto& stats = f.addStats(); + auto listener = std::make_unique<MyListener>(stats, "test1", "testdoc"); + f.notifyRemove(toGid(doc1), 20); + f.addListener(std::move(listener)); + EXPECT_TRUE((std::vector<GlobalId>{ toGid(doc1) }) == stats.get_initial_removes()); + f.commit(); +} + class StatsFixture : public Fixture { ListenerStats &_stats; diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp index 15281563b93..e3b1fd3aa15 100644 --- a/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_listener/gid_to_lid_change_listener_test.cpp @@ -103,8 +103,8 @@ struct Fixture gate.await(); } - void notifyListenerRegistered() { - _listener->notifyRegistered(); + void notifyListenerRegistered(const std::vector<GlobalId>& removes) { + _listener->notifyRegistered(removes); } }; @@ -144,7 +144,7 @@ TEST_F("Test that target lids are populated when listener is registered", Fixtur std::make_shared<MyGidToLidMapperFactory>(); f._attr->setGidToLidMapperFactory(factory); f.allocListener(); - f.notifyListenerRegistered(); + f.notifyListenerRegistered({}); TEST_DO(f.assertTargetLid(10, 1)); TEST_DO(f.assertTargetLid(17, 2)); TEST_DO(f.assertTargetLid(10, 3)); @@ -152,6 +152,31 @@ TEST_F("Test that target lids are populated when listener is registered", Fixtur TEST_DO(f.assertNoTargetLid(5)); } +TEST_F("Test that removed target lids are pruned when listener is registered", Fixture) +{ + f.ensureDocIdLimit(6); + f.set(1, toGid(doc1)); + f.set(2, toGid(doc2)); + f.set(3, toGid(doc1)); + f.set(4, toGid(doc3)); + f.commit(); + TEST_DO(f.assertTargetLid(0, 1)); + TEST_DO(f.assertTargetLid(0, 2)); + TEST_DO(f.assertTargetLid(0, 3)); + TEST_DO(f.assertTargetLid(0, 4)); + TEST_DO(f.assertNoTargetLid(5)); + std::shared_ptr<search::IGidToLidMapperFactory> factory = + std::make_shared<MyGidToLidMapperFactory>(); + f._attr->setGidToLidMapperFactory(factory); + f.allocListener(); + f.notifyListenerRegistered({ toGid(doc1) }); + TEST_DO(f.assertTargetLid(0, 1)); + TEST_DO(f.assertTargetLid(17, 2)); + TEST_DO(f.assertTargetLid(0, 3)); + TEST_DO(f.assertTargetLid(0, 4)); + TEST_DO(f.assertNoTargetLid(5)); +} + } TEST_MAIN() diff --git a/searchcore/src/tests/proton/reference/gid_to_lid_change_registrator/gid_to_lid_change_registrator_test.cpp b/searchcore/src/tests/proton/reference/gid_to_lid_change_registrator/gid_to_lid_change_registrator_test.cpp index 8cff0b1ea6c..c2efa8c2389 100644 --- a/searchcore/src/tests/proton/reference/gid_to_lid_change_registrator/gid_to_lid_change_registrator_test.cpp +++ b/searchcore/src/tests/proton/reference/gid_to_lid_change_registrator/gid_to_lid_change_registrator_test.cpp @@ -26,7 +26,7 @@ public: ~MyListener() override { } void notifyPutDone(IDestructorCallbackSP, document::GlobalId, uint32_t) override { } void notifyRemove(IDestructorCallbackSP, document::GlobalId) override { } - void notifyRegistered() override { } + void notifyRegistered(const std::vector<document::GlobalId>&) override { } const vespalib::string &getName() const override { return _name; } const vespalib::string &getDocTypeName() const override { return _docTypeName; } }; |