static inline gboolean _has_movable_message(LogQueueDiskNonReliable *self) { return self->qoverflow->length > 0 && ((HAS_SPACE_IN_QUEUE(self->qout) && qdisk_get_length (self->super.qdisk) == 0) || qdisk_is_space_avail (self->super.qdisk, 4096)); }
static gint64 _get_length (LogQueueDisk *s) { LogQueueDiskNonReliable *self = (LogQueueDiskNonReliable *) s; return _get_message_number_in_queue(self->qout) + qdisk_get_length (s->qdisk) + _get_message_number_in_queue(self->qoverflow); }
static LogMessage * _get_next_message(LogQueueDiskNonReliable *self, LogPathOptions *path_options) { LogMessage *result = NULL; path_options->ack_needed = TRUE; if (qdisk_get_length (self->super.qdisk) > 0) { result = self->super.read_message(&self->super, path_options); path_options->ack_needed = FALSE; } else if (self->qoverflow->length > 0) { result = g_queue_pop_head (self->qoverflow); POINTER_TO_LOG_PATH_OPTIONS (g_queue_pop_head (self->qoverflow), path_options); } return result; }
static gboolean _push_tail (LogQueueDisk *s, LogMessage *msg, LogPathOptions *local_options, const LogPathOptions *path_options) { LogQueueDiskNonReliable *self = (LogQueueDiskNonReliable *) s; if (HAS_SPACE_IN_QUEUE(self->qout) && qdisk_get_length (self->super.qdisk) == 0) { /* simple push never generates flow-control enabled entries to qout, they only get there * when rewinding the backlog */ g_queue_push_tail (self->qout, msg); g_queue_push_tail (self->qout, LOG_PATH_OPTIONS_FOR_BACKLOG); log_msg_ref (msg); } else { if (self->qoverflow->length != 0 || !s->write_message(s, msg)) { if (HAS_SPACE_IN_QUEUE(self->qoverflow)) { g_queue_push_tail (self->qoverflow, msg); g_queue_push_tail (self->qoverflow, LOG_PATH_OPTIONS_TO_POINTER (path_options)); log_msg_ref (msg); local_options->ack_needed = FALSE; } else { msg_debug ("Destination queue full, dropping message", evt_tag_str ("filename", qdisk_get_filename (self->super.qdisk)), evt_tag_int ("queue_len", _get_length(s)), evt_tag_int ("mem_buf_length", self->qoverflow_size), evt_tag_int ("size", qdisk_get_size (self->super.qdisk)), evt_tag_str ("persist_name", self->super.super.persist_name)); return FALSE; } } } return TRUE; }
static LogMessage * _read_message(LogQueueDisk *self, LogPathOptions *path_options) { LogMessage *msg = NULL; do { if (qdisk_get_length (self->qdisk) == 0) { break; } if (!_pop_disk (self, &msg)) { msg_error("Error reading from disk-queue file, dropping disk queue", evt_tag_str ("filename", qdisk_get_filename (self->qdisk)), NULL); self->restart_corrupted(self); if (msg) log_msg_unref (msg); msg = NULL; return NULL; } } while (msg == NULL); return msg; }
static void _move_messages_from_overflow(LogQueueDiskNonReliable *self) { LogMessage *msg; LogPathOptions path_options; /* move away as much entries from the overflow area as possible */ while (_has_movable_message(self)) { msg = g_queue_pop_head (self->qoverflow); POINTER_TO_LOG_PATH_OPTIONS (g_queue_pop_head (self->qoverflow), &path_options); if (qdisk_get_length (self->super.qdisk) == 0 && HAS_SPACE_IN_QUEUE(self->qout)) { /* we can skip qdisk, go straight to qout */ g_queue_push_tail (self->qout, msg); g_queue_push_tail (self->qout, LOG_PATH_OPTIONS_FOR_BACKLOG); log_msg_ref (msg); } else { if (!self->super.write_message(&self->super, msg)) { /* oops, altough there seemed to be some free space available, * we failed saving this message, (it might have needed more * than 4096 bytes than we ensured), push back and break */ g_queue_push_head (self->qoverflow, LOG_PATH_OPTIONS_TO_POINTER (&path_options)); g_queue_push_head (self->qoverflow, msg); log_msg_ref (msg); break; } } log_msg_ack (msg, &path_options, AT_PROCESSED); log_msg_unref (msg); } }