diff options
author | Benety Goh <benety@mongodb.com> | 2016-11-28 19:55:44 -0500 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2016-11-28 19:55:44 -0500 |
commit | 5313489266e75c5d40d1b7aae382d3e3fc8997a0 (patch) | |
tree | 9d0995c05462c7dbed1c68c646ac601bc089f8ef /src/mongo/db/repl | |
parent | 647ebfac9ebf1c5fc431a2ba813bf9c97b9bdab9 (diff) | |
download | mongo-5313489266e75c5d40d1b7aae382d3e3fc8997a0.tar.gz |
SERVER-27052 moved SyncSourceSelectorMock to its own library
Diffstat (limited to 'src/mongo/db/repl')
-rw-r--r-- | src/mongo/db/repl/SConscript | 15 | ||||
-rw-r--r-- | src/mongo/db/repl/data_replicator_test.cpp | 25 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_source_resolver_test.cpp | 130 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_source_selector_mock.cpp | 80 | ||||
-rw-r--r-- | src/mongo/db/repl/sync_source_selector_mock.h | 99 |
5 files changed, 249 insertions, 100 deletions
diff --git a/src/mongo/db/repl/SConscript b/src/mongo/db/repl/SConscript index 383514fa7db..0ce2f74901d 100644 --- a/src/mongo/db/repl/SConscript +++ b/src/mongo/db/repl/SConscript @@ -770,11 +770,25 @@ env.Library( ], ) +env.Library( + target='sync_source_selector_mock', + source=[ + 'sync_source_selector_mock.cpp', + ], + LIBDEPS=[ + 'optime', + '$BUILD_DIR/mongo/base', + '$BUILD_DIR/mongo/rpc/metadata', + '$BUILD_DIR/mongo/util/net/hostandport', + ], +) + env.CppUnitTest( target='sync_source_resolver_test', source='sync_source_resolver_test.cpp', LIBDEPS=[ 'sync_source_resolver', + 'sync_source_selector_mock', '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture', '$BUILD_DIR/mongo/unittest/task_executor_proxy', ], @@ -1051,6 +1065,7 @@ env.CppUnitTest( 'data_replicator', 'data_replicator_external_state_mock', 'replication_executor_test_fixture', + 'sync_source_selector_mock', '$BUILD_DIR/mongo/db/query/command_request_response', '$BUILD_DIR/mongo/executor/thread_pool_task_executor_test_fixture', '$BUILD_DIR/mongo/unittest/concurrency', diff --git a/src/mongo/db/repl/data_replicator_test.cpp b/src/mongo/db/repl/data_replicator_test.cpp index 3a451783597..08ff6cd744a 100644 --- a/src/mongo/db/repl/data_replicator_test.cpp +++ b/src/mongo/db/repl/data_replicator_test.cpp @@ -45,6 +45,7 @@ #include "mongo/db/repl/storage_interface_mock.h" #include "mongo/db/repl/sync_source_resolver.h" #include "mongo/db/repl/sync_source_selector.h" +#include "mongo/db/repl/sync_source_selector_mock.h" #include "mongo/db/repl/update_position_args.h" #include "mongo/executor/network_interface_mock.h" #include "mongo/executor/thread_pool_task_executor_test_fixture.h" @@ -79,28 +80,6 @@ struct CollectionCloneInfo { Status status{ErrorCodes::NotYetInitialized, ""}; }; -class SyncSourceSelectorMock : public SyncSourceSelector { - MONGO_DISALLOW_COPYING(SyncSourceSelectorMock); - -public: - SyncSourceSelectorMock(const HostAndPort& syncSource) : _syncSource(syncSource) {} - void clearSyncSourceBlacklist() override {} - HostAndPort chooseNewSyncSource(const OpTime& ot) override { - HostAndPort result = _syncSource; - return result; - } - void blacklistSyncSource(const HostAndPort& host, Date_t until) override { - _blacklistedSource = host; - } - bool shouldChangeSyncSource(const HostAndPort& currentSource, - const rpc::ReplSetMetadata& metadata) override { - return false; - } - - HostAndPort _syncSource; - HostAndPort _blacklistedSource; -}; - class DataReplicatorTest : public executor::ThreadPoolExecutorTest, public SyncSourceSelector { public: DataReplicatorTest() {} @@ -113,7 +92,7 @@ public: void reset() { _setMyLastOptime = [this](const OpTime& opTime) { _myLastOpTime = opTime; }; _myLastOpTime = OpTime(); - _syncSourceSelector.reset(new SyncSourceSelectorMock(HostAndPort("localhost", -1))); + _syncSourceSelector = stdx::make_unique<SyncSourceSelectorMock>(); } // SyncSourceSelector diff --git a/src/mongo/db/repl/sync_source_resolver_test.cpp b/src/mongo/db/repl/sync_source_resolver_test.cpp index 1022ef54e26..82ae8ab528c 100644 --- a/src/mongo/db/repl/sync_source_resolver_test.cpp +++ b/src/mongo/db/repl/sync_source_resolver_test.cpp @@ -34,6 +34,7 @@ #include "mongo/db/namespace_string.h" #include "mongo/db/repl/sync_source_resolver.h" #include "mongo/db/repl/sync_source_selector.h" +#include "mongo/db/repl/sync_source_selector_mock.h" #include "mongo/executor/network_interface_mock.h" #include "mongo/executor/thread_pool_task_executor_test_fixture.h" #include "mongo/stdx/functional.h" @@ -67,30 +68,6 @@ private: ShouldFailRequestFn _shouldFailRequest; }; -class SyncSourceSelectorMock : public SyncSourceSelector { -public: - void clearSyncSourceBlacklist() override {} - HostAndPort chooseNewSyncSource(const OpTime& ot) override { - chooseNewSyncSourceHook(); - lastOpTimeFetched = ot; - return syncSource; - } - void blacklistSyncSource(const HostAndPort& host, Date_t until) override { - blacklistHost = host; - blacklistUntil = until; - } - bool shouldChangeSyncSource(const HostAndPort&, const rpc::ReplSetMetadata&) { - return false; - } - - HostAndPort syncSource = HostAndPort("host1", 1234); - OpTime lastOpTimeFetched; - stdx::function<void()> chooseNewSyncSourceHook = []() {}; - - HostAndPort blacklistHost; - Date_t blacklistUntil; -}; - class SyncSourceResolverTest : public executor::ThreadPoolExecutorTest { private: void setUp() override; @@ -241,7 +218,7 @@ TEST_F(SyncSourceResolverTest, StartupReturnsIllegalOperationIfAlreadyActive) { } TEST_F(SyncSourceResolverTest, StartupReturnsShutdownInProgressIfResolverIsShuttingDown) { - _selector->syncSource = HostAndPort("node1", 12345); + _selector->setChooseNewSyncSourceResult_forTest(HostAndPort("node1", 12345)); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(executor::NetworkInterfaceMock::InNetworkGuard(getNet())->hasReadyRequests()); _resolver->shutdown(); @@ -258,13 +235,13 @@ TEST_F(SyncSourceResolverTest, StartupReturnsShutdownInProgressIfExecutorIsShutd TEST_F(SyncSourceResolverTest, SyncSourceResolverReturnsStatusOkAndAnEmptyHostWhenNoViableHostExists) { - _selector->syncSource = HostAndPort(); + _selector->setChooseNewSyncSourceResult_forTest(HostAndPort()); ASSERT_OK(_resolver->startup()); // Resolver invokes callback with empty host and becomes inactive immediately. ASSERT_FALSE(_resolver->isActive()); ASSERT_EQUALS(HostAndPort(), unittest::assertGet(_response.syncSourceStatus)); - ASSERT_EQUALS(lastOpTimeFetched, _selector->lastOpTimeFetched); + ASSERT_EQUALS(lastOpTimeFetched, _selector->getChooseNewSyncSourceOpTime_forTest()); // Cannot restart a completed resolver. ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, _resolver->startup()); @@ -273,17 +250,16 @@ TEST_F(SyncSourceResolverTest, TEST_F( SyncSourceResolverTest, SyncSourceResolverReturnsCallbackCanceledIfResolverIsShutdownBeforeReturningEmptySyncSource) { - _selector->syncSource = HostAndPort(); - _selector->chooseNewSyncSourceHook = [this]() { _resolver->shutdown(); }; + _selector->setChooseNewSyncSourceResult_forTest(HostAndPort()); + _selector->setChooseNewSyncSourceHook_forTest([this]() { _resolver->shutdown(); }); ASSERT_EQUALS(ErrorCodes::CallbackCanceled, _resolver->startup()); ASSERT_EQUALS(ErrorCodes::CallbackCanceled, _response.syncSourceStatus); } TEST_F(SyncSourceResolverTest, SyncSourceResolverConvertsExceptionToStatusIfChoosingViableSyncSourceThrowsException) { - _selector->chooseNewSyncSourceHook = [this]() { - uassert(ErrorCodes::InternalError, "", false); - }; + _selector->setChooseNewSyncSourceHook_forTest( + [this]() { uassert(ErrorCodes::InternalError, "", false); }); ASSERT_EQUALS(ErrorCodes::InternalError, _resolver->startup()); ASSERT_EQUALS(ErrorCodes::InternalError, _response.syncSourceStatus); } @@ -313,7 +289,7 @@ void _scheduleFirstOplogEntryFetcherResponse(executor::NetworkInterfaceMock* net ASSERT_BSONOBJ_EQ(BSON("$natural" << 1), request.cmdObj.getObjectField("sort")); // Change next sync source candidate before delivering scheduled response. - selector->syncSource = nextSyncSource; + selector->setChooseNewSyncSourceResult_forTest(nextSyncSource); net->runReadyNetworkOperations(); } @@ -330,7 +306,7 @@ void _scheduleFirstOplogEntryFetcherResponse(executor::NetworkInterfaceMock* net TEST_F(SyncSourceResolverTest, SyncSourceResolverReturnsStatusOkAndTheFoundHostWhenAnEligibleSyncSourceExists) { HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -345,7 +321,7 @@ TEST_F(SyncSourceResolverTest, TEST_F(SyncSourceResolverTest, SyncSourceResolverTransitionsToCompleteWhenFinishCallbackThrowsException) { HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); _onCompletion = [this](const SyncSourceResolverResponse& response) { _response = response; uassert(ErrorCodes::InternalError, "", false); @@ -391,7 +367,7 @@ TEST_F(SyncSourceResolverTest, SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeDoesNotHaveOldEnoughData) { HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -400,9 +376,9 @@ TEST_F(SyncSourceResolverTest, getNet(), _selector.get(), candidate1, candidate2, Timestamp(200, 2)); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kTooStaleBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2)); @@ -417,7 +393,7 @@ TEST_F(SyncSourceResolverTest, HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); HostAndPort candidate3("node3", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -448,7 +424,7 @@ void _scheduleNetworkErrorForFirstNode(executor::NetworkInterfaceMock* net, ASSERT_EQUALS(currentSyncSource, request.target); // Change next sync source candidate before delivering error to callback. - selector->syncSource = nextSyncSource; + selector->setChooseNewSyncSourceResult_forTest(nextSyncSource); net->runReadyNetworkOperations(); } @@ -457,7 +433,7 @@ TEST_F(SyncSourceResolverTest, SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeHasANetworkError) { HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -465,9 +441,9 @@ TEST_F(SyncSourceResolverTest, _scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, candidate2); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2)); @@ -480,7 +456,7 @@ TEST_F(SyncSourceResolverTest, TEST_F(SyncSourceResolverTest, SyncSourceResolverReturnsEmptyHostWhenNoViableNodeExistsAfterNetworkErrorOnFirstNode) { HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -488,9 +464,9 @@ TEST_F(SyncSourceResolverTest, _scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, HostAndPort()); ASSERT_FALSE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); ASSERT_EQUALS(HostAndPort(), unittest::assertGet(_response.syncSourceStatus)); } @@ -499,7 +475,7 @@ TEST_F(SyncSourceResolverTest, SyncSourceResolverReturnsScheduleErrorWhenTheSchedulingCommandToSecondNodeFails) { HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -511,9 +487,9 @@ TEST_F(SyncSourceResolverTest, _scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, candidate2); ASSERT_FALSE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); ASSERT_EQUALS(ErrorCodes::OperationFailed, _response.syncSourceStatus); } @@ -522,7 +498,7 @@ TEST_F(SyncSourceResolverTest, SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeHasAnEmptyOplog) { HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -530,9 +506,9 @@ TEST_F(SyncSourceResolverTest, getNet(), _selector.get(), candidate1, candidate2, std::vector<BSONObj>()); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kOplogEmptyBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2)); @@ -546,7 +522,7 @@ TEST_F(SyncSourceResolverTest, SyncSourceResolverWillTryOtherSourcesWhenTheFirstNodeHasAnEmptyFirstOplogEntry) { HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -554,9 +530,9 @@ TEST_F(SyncSourceResolverTest, getNet(), _selector.get(), candidate1, candidate2, {BSONObj()}); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFirstOplogEntryEmptyBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2)); @@ -570,7 +546,7 @@ TEST_F(SyncSourceResolverTest, SyncSourceResolverWillTryOtherSourcesWhenFirstNodeContainsOplogEntryWithNullTimestamp) { HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -578,10 +554,10 @@ TEST_F(SyncSourceResolverTest, getNet(), _selector.get(), candidate1, candidate2, Timestamp(0, 0)); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFirstOplogEntryNullTimestampBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 2)); @@ -646,7 +622,7 @@ TEST_F( _resolver = _makeResolver(lastOpTimeFetched, requiredOpTime); HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -668,7 +644,7 @@ TEST_F(SyncSourceResolverTest, HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -685,9 +661,9 @@ TEST_F(SyncSourceResolverTest, {BSON("ts" << requiredOpTime.getTimestamp() << "t" << OpTime::kUninitializedTerm)}); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0)); @@ -707,7 +683,7 @@ TEST_F( HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -719,9 +695,9 @@ TEST_F( _scheduleRequiredOpTimeFetcherResponse(getNet(), _selector.get(), candidate1, requiredOpTime); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0)); @@ -739,7 +715,7 @@ TEST_F(SyncSourceResolverTest, HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -752,9 +728,9 @@ TEST_F(SyncSourceResolverTest, getNet(), _selector.get(), candidate1, requiredOpTime, {}); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0)); @@ -771,7 +747,7 @@ TEST_F(SyncSourceResolverTest, HostAndPort candidate1("node1", 12345); HostAndPort candidate2("node2", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -788,9 +764,9 @@ TEST_F(SyncSourceResolverTest, {BSON("ts" << requiredOpTime.getTimestamp() << "t" << requiredOpTime.getTerm() + 1)}); ASSERT_TRUE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kNoRequiredOpTimeBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _scheduleFirstOplogEntryFetcherResponse( getNet(), _selector.get(), candidate2, HostAndPort(), Timestamp(10, 0)); @@ -810,7 +786,7 @@ TEST_F(SyncSourceResolverTest, }; HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -828,7 +804,7 @@ TEST_F( _resolver = _makeResolver(lastOpTimeFetched, requiredOpTime); HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -851,7 +827,7 @@ TEST_F( _resolver = _makeResolver(lastOpTimeFetched, requiredOpTime); HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -873,7 +849,7 @@ TEST_F( _resolver = _makeResolver(lastOpTimeFetched, requiredOpTime); HostAndPort candidate1("node1", 12345); - _selector->syncSource = candidate1; + _selector->setChooseNewSyncSourceResult_forTest(candidate1); ASSERT_OK(_resolver->startup()); ASSERT_TRUE(_resolver->isActive()); @@ -883,9 +859,9 @@ TEST_F( _scheduleNetworkErrorForFirstNode(getNet(), _selector.get(), candidate1, HostAndPort()); ASSERT_FALSE(_resolver->isActive()); - ASSERT_EQUALS(candidate1, _selector->blacklistHost); + ASSERT_EQUALS(candidate1, _selector->getLastBlacklistedSyncSource_forTest()); ASSERT_EQUALS(getExecutor().now() + SyncSourceResolver::kFetcherErrorBlacklistDuration, - _selector->blacklistUntil); + _selector->getLastBlacklistExpiration_forTest()); _resolver->join(); ASSERT_FALSE(_resolver->isActive()); diff --git a/src/mongo/db/repl/sync_source_selector_mock.cpp b/src/mongo/db/repl/sync_source_selector_mock.cpp new file mode 100644 index 00000000000..0b697a2e234 --- /dev/null +++ b/src/mongo/db/repl/sync_source_selector_mock.cpp @@ -0,0 +1,80 @@ +/** + * Copyright (C) 2016 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#include "mongo/platform/basic.h" + +#include "mongo/db/repl/sync_source_selector_mock.h" + +namespace mongo { +namespace repl { + +SyncSourceSelectorMock::SyncSourceSelectorMock() {} + +SyncSourceSelectorMock::~SyncSourceSelectorMock() {} + +void SyncSourceSelectorMock::clearSyncSourceBlacklist() {} + +HostAndPort SyncSourceSelectorMock::chooseNewSyncSource(const OpTime& ot) { + _chooseNewSyncSourceHook(); + _chooseNewSyncSourceOpTime = ot; + return _chooseNewSyncSourceResult; +} + +void SyncSourceSelectorMock::blacklistSyncSource(const HostAndPort& host, Date_t until) { + _lastBlacklistedSyncSource = host; + _lastBlacklistExpiration = until; +} + +void SyncSourceSelectorMock::setChooseNewSyncSourceHook_forTest( + const ChooseNewSyncSourceHook& hook) { + _chooseNewSyncSourceHook = hook; +} + +bool SyncSourceSelectorMock::shouldChangeSyncSource(const HostAndPort&, + const rpc::ReplSetMetadata&) { + return false; +} + +void SyncSourceSelectorMock::setChooseNewSyncSourceResult_forTest(const HostAndPort& syncSource) { + _chooseNewSyncSourceResult = syncSource; +} + +OpTime SyncSourceSelectorMock::getChooseNewSyncSourceOpTime_forTest() const { + return _chooseNewSyncSourceOpTime; +} + +HostAndPort SyncSourceSelectorMock::getLastBlacklistedSyncSource_forTest() const { + return _lastBlacklistedSyncSource; +} + +Date_t SyncSourceSelectorMock::getLastBlacklistExpiration_forTest() const { + return _lastBlacklistExpiration; +} + +} // namespace repl +} // namespace mongo diff --git a/src/mongo/db/repl/sync_source_selector_mock.h b/src/mongo/db/repl/sync_source_selector_mock.h new file mode 100644 index 00000000000..b53dfb6dd49 --- /dev/null +++ b/src/mongo/db/repl/sync_source_selector_mock.h @@ -0,0 +1,99 @@ +/** + * Copyright (C) 2016 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#pragma once + +#include "mongo/base/disallow_copying.h" +#include "mongo/db/repl/optime.h" +#include "mongo/db/repl/sync_source_selector.h" +#include "mongo/stdx/functional.h" + +namespace mongo { +namespace repl { + +/** + * Mock implementation of SyncSourceSelector interface for testing. + */ +class SyncSourceSelectorMock : public SyncSourceSelector { + MONGO_DISALLOW_COPYING(SyncSourceSelectorMock); + +public: + using ChooseNewSyncSourceHook = stdx::function<void()>; + + SyncSourceSelectorMock(); + virtual ~SyncSourceSelectorMock(); + + void clearSyncSourceBlacklist() override; + HostAndPort chooseNewSyncSource(const OpTime& ot) override; + void blacklistSyncSource(const HostAndPort& host, Date_t until) override; + bool shouldChangeSyncSource(const HostAndPort&, const rpc::ReplSetMetadata&) override; + + /** + * Sets a function that will be run every time chooseNewSyncSource() is called. + */ + void setChooseNewSyncSourceHook_forTest(const ChooseNewSyncSourceHook& hook); + + /** + * Sets the result for subsequent chooseNewSyncSource() invocations. + */ + void setChooseNewSyncSourceResult_forTest(const HostAndPort&); + + /** + * Returns most recent optime passed to chooseNewSyncSource(). + */ + OpTime getChooseNewSyncSourceOpTime_forTest() const; + + /** + * Returns most recently blacklisted sync source. + */ + HostAndPort getLastBlacklistedSyncSource_forTest() const; + + /** + * Returns the expiration associated with the most recently blacklisted sync source. + */ + Date_t getLastBlacklistExpiration_forTest() const; + +private: + // This is the sync source that chooseNewSyncSource returns. + HostAndPort _chooseNewSyncSourceResult = HostAndPort("localhost", -1); + + // This is the most recent optime passed to chooseNewSyncSource(). + OpTime _chooseNewSyncSourceOpTime; + + // This is run every time chooseNewSyncSource() is called. + ChooseNewSyncSourceHook _chooseNewSyncSourceHook = []() {}; + + // This is the most recently blacklisted sync source passed to blacklistSyncSource(). + HostAndPort _lastBlacklistedSyncSource; + + // This is the most recent 'util' argument value passed to blacklistSyncSource(). + Date_t _lastBlacklistExpiration; +}; + +} // namespace repl +} // namespace mongo |