static mongo_connection *mongo_get_read_write_connection_replicaset(mongo_con_manager *manager, mongo_servers *servers, int connection_flags, char **error_message) { mongo_connection *con = NULL; mongo_connection *tmp; mcon_collection *collection; char *con_error_message = NULL; int i; int found_connected_server = 0; /* Create a connection to all of the servers in the seed list */ for (i = 0; i < servers->count; i++) { tmp = mongo_get_connection_single(manager, servers->server[i], &servers->options, connection_flags, (char **) &con_error_message); if (tmp) { found_connected_server = 1; } else if (!(connection_flags & MONGO_CON_FLAG_DONT_CONNECT)) { mongo_manager_log(manager, MLOG_CON, MLOG_WARN, "Couldn't connect to '%s:%d': %s", servers->server[i]->host, servers->server[i]->port, con_error_message); free(con_error_message); } } if (!found_connected_server && (connection_flags & MONGO_CON_FLAG_DONT_CONNECT)) { return NULL; } /* Discover more nodes. This also adds a connection to "servers" for each * new node */ mongo_discover_topology(manager, servers); /* Depending on whether we want a read or a write connection, run the correct algorithms */ if (connection_flags & MONGO_CON_FLAG_WRITE) { mongo_read_preference tmp_rp; mongo_read_preference_copy(&servers->read_pref, &tmp_rp); tmp_rp.type = MONGO_RP_PRIMARY; collection = mongo_find_candidate_servers(manager, &tmp_rp, servers); mongo_read_preference_dtor(&tmp_rp); } else { collection = mongo_find_candidate_servers(manager, &servers->read_pref, servers); } if (!collection) { *error_message = strdup("No candidate servers found"); return NULL; } if (collection->count == 0) { *error_message = strdup("No candidate servers found"); mcon_collection_free(collection); return NULL; } collection = mongo_sort_servers(manager, collection, &servers->read_pref); collection = mongo_select_nearest_servers(manager, collection, &servers->read_pref); con = mongo_pick_server_from_set(manager, collection, &servers->read_pref); /* Cleaning up */ mcon_collection_free(collection); return con; }
void mongo_read_preference_replace(mongo_read_preference *from, mongo_read_preference *to) { mongo_read_preference_dtor(to); mongo_read_preference_copy(from, to); }
static mongo_connection *mongo_get_read_write_connection_replicaset(mongo_con_manager *manager, mongo_servers *servers, int connection_flags, char **error_message) { mongo_connection *con = NULL; mongo_connection *tmp; mcon_collection *collection; char *con_error_message = NULL; int i; int found_connected_server = 0; /* Create a connection to all of the servers in the seed list */ for (i = 0; i < servers->count; i++) { tmp = mongo_get_connection_single(manager, servers->server[i], &servers->options, connection_flags, (char **) &con_error_message); if (tmp) { found_connected_server++; } else if (!(connection_flags & MONGO_CON_FLAG_DONT_CONNECT)) { mongo_manager_log(manager, MLOG_CON, MLOG_WARN, "Couldn't connect to '%s:%d': %s", servers->server[i]->host, servers->server[i]->port, con_error_message); free(con_error_message); } } if (!found_connected_server && (connection_flags & MONGO_CON_FLAG_DONT_CONNECT)) { return NULL; } /* Discover more nodes. This also adds a connection to "servers" for each * new node */ if (!mongo_discover_topology(manager, servers)) { /* Total failure, we cannot proceed */ *error_message = strdup("Incompatible server detected. This driver release is not compatible with one of the connected servers"); return NULL; } /* Depending on whether we want a read or a write connection, run the correct algorithms */ if (connection_flags & MONGO_CON_FLAG_WRITE) { mongo_read_preference tmp_rp; tmp_rp.type = MONGO_RP_PRIMARY; tmp_rp.tagsets = NULL; tmp_rp.tagset_count = 0; collection = mongo_find_candidate_servers(manager, &tmp_rp, servers); mongo_read_preference_dtor(&tmp_rp); } else if (connection_flags & MONGO_CON_FLAG_DONT_FILTER) { /* We just want to know if we have something to talk to, irregardless of RP */ mongo_read_preference tmp_rp; tmp_rp.type = MONGO_RP_NEAREST; tmp_rp.tagsets = NULL; tmp_rp.tagset_count = 0; collection = mongo_find_candidate_servers(manager, &tmp_rp, servers); mongo_read_preference_dtor(&tmp_rp); } else { collection = mongo_find_candidate_servers(manager, &servers->read_pref, servers); } if (!collection) { *error_message = strdup("No candidate servers found"); return NULL; } if (collection->count == 0) { *error_message = strdup("No candidate servers found"); mcon_collection_free(collection); return NULL; } collection = mongo_sort_servers(manager, collection, &servers->read_pref); collection = mongo_select_nearest_servers(manager, collection, &servers->options, &servers->read_pref); con = mongo_pick_server_from_set(manager, collection, &servers->read_pref); /* Cleaning up */ mcon_collection_free(collection); return con; }