@@ -195,6 +195,37 @@ class SessionUnitTest : public EventLoopTest {
195195 uv_mutex_t mutex_;
196196 EventQueue events_;
197197 };
198+
199+ class LocalDcClusterMetadataResolver : public ClusterMetadataResolver {
200+ public:
201+ LocalDcClusterMetadataResolver (const String& local_dc)
202+ : desired_local_dc_(local_dc) {}
203+
204+ private:
205+ virtual void internal_resolve (uv_loop_t * loop, const AddressVec& contact_points) {
206+ resolved_contact_points_ = contact_points;
207+ local_dc_ = desired_local_dc_;
208+ callback_ (this );
209+ }
210+
211+ virtual void internal_cancel () {}
212+
213+ private:
214+ String desired_local_dc_;
215+ };
216+
217+ class LocalDcClusterMetadataResolverFactory : public ClusterMetadataResolverFactory {
218+ public:
219+ LocalDcClusterMetadataResolverFactory (const String& local_dc)
220+ : local_dc_(local_dc) {}
221+
222+ virtual ClusterMetadataResolver::Ptr new_instance (const ClusterSettings& settings) const {
223+ return ClusterMetadataResolver::Ptr (new LocalDcClusterMetadataResolver (local_dc_));
224+ }
225+
226+ private:
227+ String local_dc_;
228+ };
198229};
199230
200231TEST_F (SessionUnitTest, ExecuteQueryNotConnected) {
@@ -610,3 +641,50 @@ TEST_F(SessionUnitTest, HostListenerNodeDown) {
610641
611642 ASSERT_EQ (0u , listener->event_count ());
612643}
644+
645+ TEST_F (SessionUnitTest, LocalDcUpdatedOnPolicy) {
646+ mockssandra::SimpleCluster cluster (simple (), 3 , 2 );
647+ ASSERT_EQ (cluster.start_all (), 0 );
648+
649+ TestHostListener::Ptr listener (new TestHostListener ());
650+
651+ Config config;
652+ config.contact_points ().push_back (Address (" 127.0.0.1" , 9042 ));
653+ config.set_use_randomized_contact_points (
654+ false ); // Ensure round robin order over DC for query execution
655+ config.set_token_aware_routing (false );
656+ config.set_load_balancing_policy (new DCAwarePolicy (" dc1" ));
657+ config.set_cluster_metadata_resolver_factory (
658+ ClusterMetadataResolverFactory::Ptr (new LocalDcClusterMetadataResolverFactory (" dc2" )));
659+ config.set_host_listener (listener);
660+
661+ Session session;
662+ connect (config, &session);
663+
664+ { // Initial nodes available from peers table (should skip DC1)
665+ EXPECT_EQ (HostEventFuture::Event (HostEventFuture::ADD_NODE, Address (" 127.0.0.4" , 9042 )),
666+ listener->wait_for_event (WAIT_FOR_TIME));
667+ EXPECT_EQ (HostEventFuture::Event (HostEventFuture::START_NODE, Address (" 127.0.0.4" , 9042 )),
668+ listener->wait_for_event (WAIT_FOR_TIME));
669+ EXPECT_EQ (HostEventFuture::Event (HostEventFuture::ADD_NODE, Address (" 127.0.0.5" , 9042 )),
670+ listener->wait_for_event (WAIT_FOR_TIME));
671+ EXPECT_EQ (HostEventFuture::Event (HostEventFuture::START_NODE, Address (" 127.0.0.5" , 9042 )),
672+ listener->wait_for_event (WAIT_FOR_TIME));
673+ }
674+
675+ for (int i = 0 ; i < 20 ; ++i) { // Validate the request processors are using DC2 only
676+ QueryRequest::Ptr request (new QueryRequest (" blah" , 0 ));
677+
678+ ResponseFuture::Ptr future = session.execute (request, NULL );
679+ EXPECT_TRUE (future->wait_for (WAIT_FOR_TIME));
680+ EXPECT_FALSE (future->error ());
681+
682+ String expected_address = " 127.0.0." ;
683+ expected_address.append ((i % 2 == 0 ) ? " 4" : " 5" );
684+ EXPECT_EQ (expected_address, future->address ().to_string ());
685+ }
686+
687+ close (&session);
688+
689+ ASSERT_EQ (0u , listener->event_count ());
690+ }
0 commit comments