void log_reader_reopen(LogPipe *s, LogProto *proto, LogPipe *control, LogReaderOptions *options, gint stats_level, gint stats_source, const gchar *stats_id, const gchar *stats_instance, gboolean immediate_check) { LogReader *self = (LogReader *) s; gpointer args[] = { s, proto }; log_source_deinit(s); main_loop_call((MainLoopTaskFunc) log_reader_reopen_deferred, args, TRUE); if (!main_loop_is_main_thread()) { g_static_mutex_lock(&self->pending_proto_lock); while (self->pending_proto_present) { g_cond_wait(self->pending_proto_cond, g_static_mutex_get_mutex(&self->pending_proto_lock)); } g_static_mutex_unlock(&self->pending_proto_lock); } if (immediate_check) { log_reader_set_immediate_check(&self->super.super); } log_reader_set_options(s, control, options, stats_level, stats_source, stats_id, stats_instance); log_reader_set_follow_filename(s, stats_instance); log_source_init(s); }
/* NOTE: runs in the main thread */ static void affile_sd_notify(LogPipe *s, LogPipe *sender, gint notify_code, gpointer user_data) { AFFileSourceDriver *self = (AFFileSourceDriver *) s; GlobalConfig *cfg = log_pipe_get_config(s); gint fd; switch (notify_code) { case NC_FILE_MOVED: { msg_verbose("Follow-mode file source moved, tracking of the new file is started", evt_tag_str("filename", self->filename->str), NULL); log_pipe_deinit(self->reader); log_pipe_unref(self->reader); if (affile_sd_open_file(self, self->filename->str, &fd)) { LogTransport *transport; LogProto *proto; transport = log_transport_plain_new(fd, 0); transport->timeout = 10; proto = affile_sd_construct_proto(self, transport); self->reader = log_reader_new(proto); log_reader_set_options(self->reader, s, &self->reader_options, 1, SCS_FILE, self->super.super.id, self->filename->str); log_reader_set_follow_filename(self->reader, self->filename->str); log_reader_set_immediate_check(self->reader); log_pipe_append(self->reader, s); if (!log_pipe_init(self->reader, cfg)) { msg_error("Error initializing log_reader, closing fd", evt_tag_int("fd", fd), NULL); log_pipe_unref(self->reader); self->reader = NULL; close(fd); } affile_sd_recover_state(s, cfg, proto); } else { self->reader = NULL; } break; } default: break; } }
static gboolean affile_sd_init(LogPipe *s) { AFFileSourceDriver *self = (AFFileSourceDriver *) s; GlobalConfig *cfg = log_pipe_get_config(s); gint fd; gboolean file_opened, open_deferred = FALSE; log_reader_options_init(&self->reader_options, cfg, self->super.group); file_opened = affile_sd_open_file(self, self->filename->str, &fd); if (!file_opened && self->reader_options.follow_freq > 0) { msg_info("Follow-mode file source not found, deferring open", evt_tag_str("filename", self->filename->str), NULL); open_deferred = TRUE; fd = -1; } if (file_opened || open_deferred) { LogTransport *transport; transport = log_transport_plain_new(fd, self->filename, NULL, 0); transport->timeout = 10; /* FIXME: we shouldn't use reader_options to store log protocol parameters */ self->reader = log_reader_new( log_proto_plain_new_server(transport, self->reader_options.padding, self->reader_options.msg_size, ((self->reader_options.follow_freq > 0) ? LPPF_IGNORE_EOF : LPPF_NOMREAD) ), LR_LOCAL); log_reader_set_options(self->reader, s, &self->reader_options, 1, SCS_FILE, self->super.id, self->filename->str); log_reader_set_follow_filename(self->reader, self->filename->str); /* NOTE: if the file could not be opened, we ignore the last * remembered file position, if the file is created in the future * we're going to read from the start. */ affile_sd_load_pos(s, cfg); log_pipe_append(self->reader, s); if (!log_pipe_init(self->reader, NULL)) { msg_error("Error initializing log_reader, closing fd", evt_tag_int("fd", fd), NULL); log_pipe_unref(self->reader); self->reader = NULL; close(fd); return FALSE; } } else { msg_error("Error opening file for reading", evt_tag_str("filename", self->filename->str), evt_tag_errno(EVT_TAG_OSERROR, errno), NULL); return self->super.optional; } return TRUE; }