Skip to content

Commit 8dd752c

Browse files
authored
CPP-819 - Ensure port is updated on already assigned contact points (#303)
1 parent 35f9992 commit 8dd752c

4 files changed

Lines changed: 55 additions & 7 deletions

File tree

cpp-driver/gtests/src/unit/tests/test_cluster.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,3 +1029,41 @@ TEST_F(ClusterUnitTest, NoContactPoints) {
10291029
ASSERT_TRUE(connect_future->error());
10301030
EXPECT_EQ(connect_future->error()->code, CASS_ERROR_LIB_NO_HOSTS_AVAILABLE);
10311031
}
1032+
1033+
TEST_F(ClusterUnitTest, PortIsAssignedDuringConnection) {
1034+
mockssandra::SimpleCluster cluster(simple(), 1);
1035+
ASSERT_EQ(cluster.start_all(), 0);
1036+
1037+
AddressVec contact_points;
1038+
contact_points.push_back(Address("127.0.0.1", -1));
1039+
1040+
Future::Ptr connect_future(new Future());
1041+
ClusterConnector::Ptr connector(
1042+
new ClusterConnector(contact_points, PROTOCOL_VERSION,
1043+
bind_callback(on_connection_reconnect, connect_future.get())));
1044+
1045+
ClusterSettings settings; // Default port and metadata resolver
1046+
connector->with_settings(settings)->connect(event_loop());
1047+
1048+
ASSERT_TRUE(connect_future->wait_for(WAIT_FOR_TIME));
1049+
EXPECT_FALSE(connect_future->error());
1050+
}
1051+
1052+
TEST_F(ClusterUnitTest, HostIsResolvedAndPortIsAssignedDuringConnection) {
1053+
mockssandra::SimpleCluster cluster(simple(), 1);
1054+
ASSERT_EQ(cluster.start_all(), 0);
1055+
1056+
AddressVec contact_points;
1057+
contact_points.push_back(Address("localhost", -1));
1058+
1059+
Future::Ptr connect_future(new Future());
1060+
ClusterConnector::Ptr connector(
1061+
new ClusterConnector(contact_points, PROTOCOL_VERSION,
1062+
bind_callback(on_connection_reconnect, connect_future.get())));
1063+
1064+
ClusterSettings settings; // Default port and metadata resolver
1065+
connector->with_settings(settings)->connect(event_loop());
1066+
1067+
ASSERT_TRUE(connect_future->wait_for(WAIT_FOR_TIME));
1068+
EXPECT_FALSE(connect_future->error());
1069+
}

cpp-driver/src/cluster_config.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ CassCluster* cass_cluster_new() { return CassCluster::to(new ClusterConfig()); }
2727
CassError cass_cluster_set_port(CassCluster* cluster, int port) {
2828
if (port <= 0) {
2929
return CASS_ERROR_LIB_BAD_PARAMS;
30+
} else if (cluster->config().cloud_secure_connection_config().is_loaded()) {
31+
LOG_ERROR("Port cannot be overridden with cloud secure connection bundle");
32+
return CASS_ERROR_LIB_BAD_PARAMS;
3033
}
34+
3135
cluster->config().set_port(port);
3236
return CASS_OK;
3337
}
@@ -117,7 +121,7 @@ CassError cass_cluster_set_contact_points_n(CassCluster* cluster, const char* co
117121
explode(String(contact_points, contact_points_length), exploded);
118122
for (Vector<String>::const_iterator it = exploded.begin(), end = exploded.end(); it != end;
119123
++it) {
120-
cluster->config().contact_points().push_back(Address(*it, cluster->config().port()));
124+
cluster->config().contact_points().push_back(Address(*it, -1));
121125
}
122126
}
123127
return CASS_OK;

cpp-driver/src/cluster_metadata_resolver.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,27 @@ namespace {
2525

2626
class DefaultClusterMetadataResolver : public ClusterMetadataResolver {
2727
public:
28-
DefaultClusterMetadataResolver(uint64_t resolve_timeout_ms)
29-
: resolve_timeout_ms_(resolve_timeout_ms) {}
28+
DefaultClusterMetadataResolver(uint64_t resolve_timeout_ms, int port)
29+
: resolve_timeout_ms_(resolve_timeout_ms)
30+
, port_(port) {}
3031

3132
private:
3233
virtual void internal_resolve(uv_loop_t* loop, const AddressVec& contact_points) {
3334
inc_ref();
3435

3536
for (AddressVec::const_iterator it = contact_points.begin(), end = contact_points.end();
3637
it != end; ++it) {
38+
// If the port is not set then use the default port value.
39+
int port = it->port() <= 0 ? port_ : it->port();
40+
3741
if (it->is_resolved()) {
38-
resolved_contact_points_.push_back(*it);
42+
resolved_contact_points_.push_back(Address(it->hostname_or_address(), port));
3943
} else {
4044
if (!resolver_) {
4145
resolver_.reset(
4246
new MultiResolver(bind_callback(&DefaultClusterMetadataResolver::on_resolve, this)));
4347
}
44-
resolver_->resolve(loop, it->hostname_or_address(), it->port(), resolve_timeout_ms_);
48+
resolver_->resolve(loop, it->hostname_or_address(), port, resolve_timeout_ms_);
4549
}
4650
}
4751

@@ -89,12 +93,14 @@ class DefaultClusterMetadataResolver : public ClusterMetadataResolver {
8993
private:
9094
MultiResolver::Ptr resolver_;
9195
const uint64_t resolve_timeout_ms_;
96+
const int port_;
9297
};
9398

9499
} // namespace
95100

96101
ClusterMetadataResolver::Ptr
97102
DefaultClusterMetadataResolverFactory::new_instance(const ClusterSettings& settings) const {
98103
return ClusterMetadataResolver::Ptr(new DefaultClusterMetadataResolver(
99-
settings.control_connection_settings.connection_settings.socket_settings.resolve_timeout_ms));
104+
settings.control_connection_settings.connection_settings.socket_settings.resolve_timeout_ms,
105+
settings.port));
100106
}

cpp-driver/src/cluster_metadata_resolver.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class ClusterMetadataResolverFactory : public RefCounted<ClusterMetadataResolver
7575
};
7676

7777
/**
78-
* This factory creates cluster metaadata resolvers that determine contact points using DNS.
78+
* This factory creates cluster metadata resolvers that determine contact points using DNS.
7979
* Domain names with multiple A-records are expanded into multiple contact points and addresses
8080
* that are already resolved are passed through.
8181
*/

0 commit comments

Comments
 (0)