void test_func_mongo_sync_auto_reconnect_cache (void) { mongo_sync_conn_recovery_cache *cache; mongo_sync_connection *conn; bson *b; mongo_packet *p; GList *hosts; gchar *primary_addr; const gchar *error_msg; primary_addr = g_strdup_printf ("%s:%d", config.primary_host, config.primary_port); b = bson_new (); bson_append_int32 (b, "f_sync_auto_reconnect", 1); bson_finish (b); cache = mongo_sync_conn_recovery_cache_new (); mongo_sync_conn_recovery_cache_seed_add (cache, config.primary_host, config.primary_port); conn = mongo_sync_connect_recovery_cache (cache, TRUE); ok (mongo_sync_cmd_insert (conn, config.ns, b, NULL) == TRUE); shutdown (conn->super.fd, SHUT_RDWR); sleep (1); ok (mongo_sync_cmd_insert (conn, config.ns, b, NULL) == FALSE, "Inserting fails with auto-reconnect turned off, and a broken " "connection"); error_msg = mongo_sync_conn_get_last_error (conn); ok (error_msg != NULL, "We have an error msg when insert fails."); mongo_sync_conn_set_auto_reconnect (conn, TRUE); ok (mongo_sync_cmd_insert (conn, config.ns, b, NULL) == TRUE, "Inserting works with auto-reconnect turned on, and a broken " "connection"); error_msg = mongo_sync_conn_get_last_error (conn); ok (error_msg == NULL, "After a succesful insert we shouldn't have an error msg."); mongo_sync_conn_set_auto_reconnect (conn, FALSE); shutdown (conn->super.fd, SHUT_RDWR); sleep (1); ok (mongo_sync_cmd_insert (conn, config.ns, b, NULL) == FALSE, "Turning off auto-reconnect works"); skip (!config.secondary_host, 7, "Secondary host not set up"); shutdown (conn->super.fd, SHUT_RDWR); sleep (1); p = mongo_sync_cmd_query (conn, config.ns, 0, 0, 1, b, NULL); ok (p == NULL, "Query fails with auto-reconnect turned off"); error_msg = mongo_sync_conn_get_last_error(conn); ok (error_msg != NULL, "We have an error msg after a failure query."); mongo_sync_conn_set_auto_reconnect (conn, TRUE); p = mongo_sync_cmd_query (conn, config.ns, 0, 0, 1, b, NULL); ok (p != NULL, "Query does reconnect with auto-reconnect turned on"); ok (mongo_sync_conn_get_last_error(conn) == NULL, "We shouldn't have any error messages after a successful operation."); mongo_wire_packet_free (p); hosts = conn->rs.hosts; ok (cache->rs.hosts == NULL, "cache is discarded due to connect replace during auto-reconnect"); ok ((conn->rs.hosts != NULL) && (g_list_length (conn->rs.hosts) > 0), "hosts is filled in mongo_sync_connection"); mongo_sync_disconnect (conn); ok ((cache->rs.hosts != NULL) && (cache->rs.hosts == hosts) && (g_list_length (cache->rs.hosts) > 0), "cache is filled by disconnect()"); mongo_sync_conn_recovery_cache_free (cache); endskip; g_free (primary_addr); }
static gboolean afmongodb_dd_init(LogPipe *s) { MongoDBDestDriver *self = (MongoDBDestDriver *)s; GlobalConfig *cfg = log_pipe_get_config(s); if (!log_dest_driver_init_method(s)) return FALSE; log_template_options_init(&self->template_options, cfg); if (!afmongodb_dd_check_auth_options(self)) return FALSE; afmongodb_dd_init_value_pairs_dot_to_underscore_transformation(self); if (self->port != MONGO_CONN_LOCAL) { if (self->address) { gchar *srv = g_strdup_printf ("%s:%d", self->address, (self->port) ? self->port : 27017); self->servers = g_list_prepend (self->servers, srv); g_free (self->address); } if (self->servers) { GList *l; for (l=self->servers; l; l = g_list_next(l)) { gchar *host = NULL; gint port = 27017; if (!mongo_util_parse_addr(l->data, &host, &port)) { msg_warning("Cannot parse MongoDB server address, ignoring", evt_tag_str("address", l->data), evt_tag_str("driver", self->super.super.super.id), NULL); continue; } mongo_sync_conn_recovery_cache_seed_add (self->recovery_cache, host, port); msg_verbose("Added MongoDB server seed", evt_tag_str("host", host), evt_tag_int("port", port), evt_tag_str("driver", self->super.super.super.id), NULL); g_free(host); } } else { afmongodb_dd_set_servers((LogDriver *)self, g_list_append (NULL, g_strdup ("127.0.0.1:27017"))); mongo_sync_conn_recovery_cache_seed_add (self->recovery_cache, "127.0.0.1", 27017); } self->address = NULL; self->port = 27017; if (!mongo_util_parse_addr(g_list_nth_data(self->servers, 0), &self->address, &self->port)) { msg_error("Cannot parse the primary host", evt_tag_str("primary", g_list_nth_data(self->servers, 0)), evt_tag_str("driver", self->super.super.super.id), NULL); return FALSE; } } else { mongo_sync_conn_recovery_cache_seed_add (self->recovery_cache, self->address, self->port); } if (self->port == MONGO_CONN_LOCAL) msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), evt_tag_str("driver", self->super.super.super.id), NULL); else msg_verbose("Initializing MongoDB destination", evt_tag_str("address", self->address), evt_tag_int("port", self->port), evt_tag_str("database", self->db), evt_tag_str("collection", self->coll), evt_tag_str("driver", self->super.super.super.id), NULL); return log_threaded_dest_driver_start(s); }