/** * afsql_dd_database_thread: * * This is the thread inserting records into the database. **/ static void afsql_dd_database_thread(gpointer arg) { AFSqlDestDriver *self = (AFSqlDestDriver *) arg; msg_verbose("Database thread started", evt_tag_str("driver", self->super.super.id), NULL); while (!self->db_thread_terminate) { g_mutex_lock(self->db_thread_mutex); if (self->db_thread_suspended) { afsql_dd_wait_for_suspension_wakeup(self); /* we loop back to check if the thread was requested to terminate */ } else if (!log_queue_check_items(self->queue, NULL, afsql_dd_message_became_available_in_the_queue, self, NULL)) { /* we have nothing to INSERT into the database, let's wait we get some new stuff */ if (self->flush_lines_queued > 0) { if (!afsql_dd_commit_txn(self)) { afsql_dd_disconnect(self); afsql_dd_suspend(self); g_mutex_unlock(self->db_thread_mutex); continue; } } else if (!self->db_thread_terminate) { g_cond_wait(self->db_thread_wakeup_cond, self->db_thread_mutex); } /* we loop back to check if the thread was requested to terminate */ } g_mutex_unlock(self->db_thread_mutex); if (self->db_thread_terminate) break; if (!afsql_dd_insert_db(self)) { afsql_dd_disconnect(self); afsql_dd_suspend(self); } } while (log_queue_get_length(self->queue) > 0) { if (!afsql_dd_insert_db(self)) { goto exit; } } if (self->flush_lines_queued > 0) { /* we can't do anything with the return value here. if commit isn't * successful, we get our backlog back, but we have no chance * submitting that back to the SQL engine. */ afsql_dd_commit_txn(self); } exit: afsql_dd_disconnect(self); msg_verbose("Database thread finished", evt_tag_str("driver", self->super.super.id), NULL); }
/** * afsql_dd_database_thread: * * This is the thread inserting records into the database. **/ static gpointer afsql_dd_database_thread(gpointer arg) { AFSqlDestDriver *self = (AFSqlDestDriver *) arg; msg_verbose("Database thread started", evt_tag_str("driver", self->super.super.id), NULL); while (!self->db_thread_terminate) { g_mutex_lock(self->db_thread_mutex); if (self->db_thread_suspended) { /* we got suspended, probably because of a connection error, * during this time we only get wakeups if we need to be * terminated. */ if (!self->db_thread_terminate) g_cond_timed_wait(self->db_thread_wakeup_cond, self->db_thread_mutex, &self->db_thread_suspend_target); self->db_thread_suspended = FALSE; g_mutex_unlock(self->db_thread_mutex); /* we loop back to check if the thread was requested to terminate */ } else if (log_queue_get_length(self->queue) == 0) { /* we have nothing to INSERT into the database, let's wait we get some new stuff */ if (self->flush_lines_queued > 0 && self->flush_timeout > 0) { GTimeVal flush_target; g_get_current_time(&flush_target); g_time_val_add(&flush_target, self->flush_timeout * 1000); if (!self->db_thread_terminate && !g_cond_timed_wait(self->db_thread_wakeup_cond, self->db_thread_mutex, &flush_target)) { /* timeout elapsed */ if (!afsql_dd_commit_txn(self, FALSE)) { afsql_dd_disconnect(self); afsql_dd_suspend(self); g_mutex_unlock(self->db_thread_mutex); continue; } } } else if (!self->db_thread_terminate) { g_cond_wait(self->db_thread_wakeup_cond, self->db_thread_mutex); } g_mutex_unlock(self->db_thread_mutex); /* we loop back to check if the thread was requested to terminate */ } else g_mutex_unlock(self->db_thread_mutex); if (self->db_thread_terminate) break; if (!afsql_dd_insert_db(self)) { afsql_dd_disconnect(self); afsql_dd_suspend(self); } } if (self->flush_lines_queued > 0) { /* we can't do anything with the return value here. if commit isn't * successful, we get our backlog back, but we have no chance * submitting that back to the SQL engine. */ afsql_dd_commit_txn(self, TRUE); } afsql_dd_disconnect(self); msg_verbose("Database thread finished", evt_tag_str("driver", self->super.super.id), NULL); return NULL; }