@@ -384,9 +384,12 @@ _mongoc_cluster_node_destroy (mongoc_cluster_node_t *node)
384
384
node -> stream = NULL ;
385
385
}
386
386
387
- bson_destroy (& node -> tags );
387
+ if (node -> tags .len ) {
388
+ bson_destroy (& node -> tags );
389
+ memset (& node -> tags , 0 , sizeof node -> tags );
390
+ }
388
391
389
- bson_free (node -> replSet );
392
+ bson_free (node -> replSet );
390
393
node -> replSet = NULL ;
391
394
392
395
EXIT ;
@@ -541,8 +544,9 @@ _mongoc_cluster_init (mongoc_cluster_t *cluster,
541
544
b = mongoc_uri_get_options (uri );
542
545
hosts = mongoc_uri_get_hosts (uri );
543
546
544
- if (bson_iter_init_find_case (& iter , b , "replicaSet" )) {
547
+ if (bson_iter_init_find_case (& iter , b , "replicaSet" )) {
545
548
cluster -> mode = MONGOC_CLUSTER_REPLICA_SET ;
549
+ cluster -> replSet = bson_iter_dup_utf8 (& iter , NULL );
546
550
MONGOC_INFO ("Client initialized in replica set mode." );
547
551
} else if (hosts -> next ) {
548
552
cluster -> mode = MONGOC_CLUSTER_SHARDED_CLUSTER ;
@@ -617,12 +621,13 @@ _mongoc_cluster_destroy (mongoc_cluster_t *cluster) /* INOUT */
617
621
618
622
for (i = 0 ; i < MONGOC_CLUSTER_MAX_NODES ; i ++ ) {
619
623
if (cluster -> nodes [i ].stream ) {
620
- mongoc_stream_destroy (cluster -> nodes [i ].stream );
621
- cluster -> nodes [i ].stream = NULL ;
622
- cluster -> nodes [i ].stamp ++ ;
624
+ _mongoc_cluster_node_destroy (& cluster -> nodes [i ]);
623
625
}
624
626
}
625
627
628
+ bson_free (cluster -> replSet );
629
+ cluster -> replSet = NULL ;
630
+
626
631
_mongoc_cluster_clear_peers (cluster );
627
632
628
633
_mongoc_array_destroy (& cluster -> iov );
@@ -982,8 +987,8 @@ _mongoc_cluster_run_command (mongoc_cluster_t *cluster,
982
987
983
988
static bool
984
989
_mongoc_cluster_ismaster (mongoc_cluster_t * cluster ,
985
- mongoc_cluster_node_t * node ,
986
- bson_error_t * error )
990
+ mongoc_cluster_node_t * node ,
991
+ bson_error_t * error )
987
992
{
988
993
int32_t v32 ;
989
994
bool ret = false;
@@ -1063,19 +1068,14 @@ _mongoc_cluster_ismaster (mongoc_cluster_t *cluster,
1063
1068
1064
1069
if (bson_iter_init_find (& iter , & reply , "msg" ) &&
1065
1070
BSON_ITER_HOLDS_UTF8 (& iter ) &&
1066
- (strcmp ("isdbgrid" , bson_iter_utf8 (& iter , NULL )) == 0 )) {
1067
- /* TODO: is this sufficient to detect sharded clusters? */
1068
-
1069
- cluster -> isdbgrid = true;
1070
- /*
1071
- * TODO: This is actually a sharded cluster!
1072
- */
1071
+ (0 == strcasecmp ("isdbgrid" , bson_iter_utf8 (& iter , NULL )))) {
1072
+ node -> isdbgrid = true;
1073
1073
if (cluster -> mode != MONGOC_CLUSTER_SHARDED_CLUSTER ) {
1074
1074
MONGOC_INFO ("Unexpectedly connected to sharded cluster: %s" ,
1075
1075
node -> host .host_and_port );
1076
1076
}
1077
1077
} else {
1078
- cluster -> isdbgrid = false;
1078
+ node -> isdbgrid = false;
1079
1079
}
1080
1080
1081
1081
/*
@@ -2030,6 +2030,23 @@ _mongoc_cluster_reconnect_sharded_cluster (mongoc_cluster_t *cluster,
2030
2030
2031
2031
_mongoc_cluster_node_track_ping (& cluster -> nodes [i ], ping );
2032
2032
2033
+ /*
2034
+ * If this node is not a mongos, we should fail unless no
2035
+ * replicaSet was specified. If that is the case, we will assume
2036
+ * the caller meant they wanted a replicaSet and migrate to that
2037
+ * reconnection strategy.
2038
+ */
2039
+ if ((i == 0 ) &&
2040
+ !cluster -> nodes [i ].isdbgrid &&
2041
+ !mongoc_uri_get_replica_set (cluster -> uri ) &&
2042
+ cluster -> nodes [i ].replSet ) {
2043
+ MONGOC_WARNING ("Found replicaSet, expected sharded cluster. "
2044
+ "Reconnecting as replicaSet." );
2045
+ cluster -> mode = MONGOC_CLUSTER_REPLICA_SET ;
2046
+ cluster -> replSet = bson_strdup (cluster -> nodes [i ].replSet );
2047
+ return _mongoc_cluster_reconnect_replica_set (cluster , error );
2048
+ }
2049
+
2033
2050
i ++ ;
2034
2051
}
2035
2052
0 commit comments