void test_func_mongo_sync_max_insert_size (void) { mongo_sync_connection *conn; const bson *docs[10]; bson *b1, *b2, *b3; b1 = bson_new (); bson_append_string (b1, "func_mongo_sync_max_insert_size", "works", -1); bson_finish (b1); b2 = bson_new (); bson_append_int32 (b2, "int32", 1984); bson_finish (b2); b3 = bson_new (); bson_finish (b3); conn = mongo_sync_connect (config.primary_host, config.primary_port, FALSE); /* * cmd_insert_n() */ mongo_sync_conn_set_max_insert_size (conn, bson_size (b1) + bson_size (b3) + 1); docs[0] = b1; docs[1] = b2; docs[2] = b3; ok (mongo_sync_cmd_insert_n (conn, config.ns, 3, docs) == TRUE, "mongo_sync_cmd_insert_n() works with a small max_insert_size"); mongo_sync_conn_set_max_insert_size (conn, 1); errno = 0; ok (mongo_sync_cmd_insert_n (conn, config.ns, 3, docs) == FALSE, "mongo_sync_cmd_insert_n() should fail if any one document is too big"); cmp_ok (errno, "==", EMSGSIZE, "errno is set to EMSGSIZE"); /* * cmd_insert() */ mongo_sync_conn_set_max_insert_size (conn, bson_size (b1) + bson_size (b3) + 1); ok (mongo_sync_cmd_insert (conn, config.ns, b1, b2, b3, NULL) == TRUE, "mongo_sync_cmd_insert() works with a small max_insert_size"); mongo_sync_conn_set_max_insert_size (conn, 1); errno = 0; ok (mongo_sync_cmd_insert (conn, config.ns, b1, b2, b3, NULL) == FALSE, "mongo_sync_cmd_insert() should fail if any one document is too big"); cmp_ok (errno, "==", EMSGSIZE, "errno is set to EMSGSIZE"); mongo_sync_disconnect (conn); bson_free (b1); bson_free (b2); bson_free (b3); }
static gboolean afmongodb_worker_insert (MongoDBDestDriver *self) { gboolean success; guint8 *oid; LogMessage *msg; LogPathOptions path_options = LOG_PATH_OPTIONS_INIT; afmongodb_dd_connect(self, TRUE); success = log_queue_pop_head(self->queue, &msg, &path_options, FALSE, FALSE); if (!success) return TRUE; msg_set_context(msg); bson_reset (self->bson); oid = mongo_util_oid_new_with_time (self->last_msg_stamp, self->seq_num); bson_append_oid (self->bson, "_id", oid); g_free (oid); value_pairs_walk(self->vp, afmongodb_vp_obj_start, afmongodb_vp_process_value, afmongodb_vp_obj_end, msg, self->seq_num, self->bson); bson_finish (self->bson); if (!mongo_sync_cmd_insert_n(self->conn, self->ns, 1, (const bson **)&self->bson)) { msg_error("Network error while inserting into MongoDB", evt_tag_int("time_reopen", self->time_reopen), NULL); success = FALSE; } msg_set_context(NULL); if (success) { stats_counter_inc(self->stored_messages); step_sequence_number(&self->seq_num); log_msg_ack(msg, &path_options); log_msg_unref(msg); } else { log_queue_push_head(self->queue, msg, &path_options); } return success; }
void test_func_mongo_sync_safe_mode (void) { mongo_sync_connection *conn; const bson *docs[10]; bson *b1, *b2, *b3, *b4, *cmd; mongo_packet *p; gchar *error; mongo_util_oid_init (0); b1 = bson_new (); bson_append_string (b1, "func_mongo_sync_safe_mode", "works", -1); bson_finish (b1); b2 = bson_new (); bson_append_int32 (b2, "int32", 1984); bson_finish (b2); b3 = test_bson_generate_full (); b4 = test_bson_generate_full (); docs[0] = b1; docs[1] = b2; docs[2] = b3; docs[3] = b4; conn = mongo_sync_connect (config.primary_host, config.primary_port, FALSE); /* Test inserts */ mongo_sync_conn_set_safe_mode (conn, FALSE); ok (mongo_sync_cmd_insert_n (conn, config.ns, 4, docs) == TRUE, "mongo_sync_cmd_insert_n() should not fail with safe mode off"); mongo_sync_conn_set_safe_mode (conn, TRUE); ok (mongo_sync_cmd_insert_n (conn, config.ns, 4, docs) == FALSE, "mongo_sync_cmd_insert_n() should fail with safe mode on"); /* Test a custom command */ cmd = bson_new (); bson_append_int32 (cmd, "bogusCommand", 1); bson_finish (cmd); mongo_sync_cmd_reset_error (conn, config.db); mongo_sync_conn_set_safe_mode (conn, FALSE); p = mongo_sync_cmd_custom (conn, config.db, cmd); mongo_sync_cmd_get_last_error (conn, config.db, &error); ok (p == NULL && strcmp (error, "no such cmd: bogusCommand") == 0, "mongo_sync_cmd_custom() with a bogus command fails with safe-mode off"); bson_free (cmd); cmd = bson_new (); bson_append_int32 (cmd, "bogusCommand2", 1); bson_finish (cmd); mongo_sync_cmd_reset_error (conn, config.db); mongo_sync_conn_set_safe_mode (conn, TRUE); p = mongo_sync_cmd_custom (conn, config.db, cmd); mongo_sync_cmd_get_last_error (conn, config.db, &error); ok (p == NULL && strcmp (error, "no such cmd: bogusCommand2") == 0, "mongo_sync_cmd_custom() with a bogus command fails with safe-mode on"); bson_free (cmd); mongo_sync_disconnect (conn); bson_free (b1); bson_free (b2); bson_free (b3); bson_free (b4); }
static worker_insert_result_t afmongodb_worker_insert (LogThrDestDriver *s, LogMessage *msg) { MongoDBDestDriver *self = (MongoDBDestDriver *)s; gboolean success; gboolean drop_silently = self->template_options.on_error & ON_ERROR_SILENT; if (!afmongodb_dd_connect(self, TRUE)) return WORKER_INSERT_RESULT_NOT_CONNECTED; bson_reset (self->bson); success = value_pairs_walk(self->vp, afmongodb_vp_obj_start, afmongodb_vp_process_value, afmongodb_vp_obj_end, msg, self->super.seq_num, LTZ_SEND, &self->template_options, self); bson_finish (self->bson); if (!success) { if (!drop_silently) { msg_error("Failed to format message for MongoDB, dropping message", evt_tag_value_pairs("message", self->vp, msg, self->super.seq_num, LTZ_SEND, &self->template_options), evt_tag_str("driver", self->super.super.super.id), NULL); } return WORKER_INSERT_RESULT_DROP; } else { msg_debug("Outgoing message to MongoDB destination", evt_tag_value_pairs("message", self->vp, msg, self->super.seq_num, LTZ_SEND, &self->template_options), evt_tag_str("driver", self->super.super.super.id), NULL); if (!mongo_sync_cmd_insert_n(self->conn, self->ns, 1, (const bson **)&self->bson)) { msg_error("Network error while inserting into MongoDB", evt_tag_int("time_reopen", self->super.time_reopen), evt_tag_str("reason", mongo_sync_conn_get_last_error(self->conn)), evt_tag_str("driver", self->super.super.super.id), NULL); success = FALSE; } } if (!success && (errno == ENOTCONN)) return WORKER_INSERT_RESULT_NOT_CONNECTED; if (!success) return WORKER_INSERT_RESULT_ERROR; return WORKER_INSERT_RESULT_SUCCESS; }