X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal-remote%2Fjournal-remote-write.c;h=df30049397dd0149106355d1d97baadeac9f3043;hb=7bdb04298fd8b3de7adf2e0e547ef7dd953b809e;hp=449636cd8c3180b389776151e69b179bcad4db5a;hpb=eacbb4d33e2bb5c54311544851140efe3dd0f774;p=elogind.git diff --git a/src/journal-remote/journal-remote-write.c b/src/journal-remote/journal-remote-write.c index 449636cd8..df3004939 100644 --- a/src/journal-remote/journal-remote-write.c +++ b/src/journal-remote/journal-remote-write.c @@ -19,7 +19,7 @@ along with systemd; If not, see . ***/ -#include "journal-remote-write.h" +#include "journal-remote.h" int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) { if (!GREEDY_REALLOC(iovw->iovec, iovw->size_bytes, iovw->count + 1)) @@ -30,8 +30,6 @@ int iovw_put(struct iovec_wrapper *iovw, void* data, size_t len) { } void iovw_free_contents(struct iovec_wrapper *iovw) { - for (size_t j = 0; j < iovw->count; j++) - free(iovw->iovec[j].iov_base); free(iovw->iovec); iovw->iovec = NULL; iovw->size_bytes = iovw->count = 0; @@ -40,12 +38,19 @@ void iovw_free_contents(struct iovec_wrapper *iovw) { size_t iovw_size(struct iovec_wrapper *iovw) { size_t n = 0, i; - for(i = 0; i < iovw->count; i++) + for (i = 0; i < iovw->count; i++) n += iovw->iovec[i].iov_len; return n; } +void iovw_rebase(struct iovec_wrapper *iovw, char *old, char *new) { + size_t i; + + for (i = 0; i < iovw->count; i++) + iovw->iovec[i].iov_base = (char*) iovw->iovec[i].iov_base - old + new; +} + /********************************************************************** ********************************************************************** **********************************************************************/ @@ -54,73 +59,112 @@ static int do_rotate(JournalFile **f, bool compress, bool seal) { int r = journal_file_rotate(f, compress, seal); if (r < 0) { if (*f) - log_error("Failed to rotate %s: %s", (*f)->path, - strerror(-r)); + log_error_errno(r, "Failed to rotate %s: %m", (*f)->path); else - log_error("Failed to create rotated journal: %s", - strerror(-r)); + log_error_errno(r, "Failed to create rotated journal: %m"); } return r; } -int writer_init(Writer *s) { - assert(s); +Writer* writer_new(RemoteServer *server) { + Writer *w; - s->journal = NULL; + w = new0(Writer, 1); + if (!w) + return NULL; - memset(&s->metrics, 0xFF, sizeof(s->metrics)); + memset(&w->metrics, 0xFF, sizeof(w->metrics)); - s->mmap = mmap_cache_new(); - if (!s->mmap) - return log_oom(); + w->mmap = mmap_cache_new(); + if (!w->mmap) { + free(w); + return NULL; + } - s->seqnum = 0; + w->n_ref = 1; + w->server = server; - return 0; + return w; } -int writer_close(Writer *s) { - if (s->journal) { - journal_file_close(s->journal); - log_debug("Journal has been closed."); +Writer* writer_free(Writer *w) { + if (!w) + return NULL; + + if (w->journal) { + log_debug("Closing journal file %s.", w->journal->path); + journal_file_close(w->journal); } - if (s->mmap) - mmap_cache_unref(s->mmap); - return 0; + + if (w->server && w->hashmap_key) + hashmap_remove(w->server->writers, w->hashmap_key); + + free(w->hashmap_key); + + if (w->mmap) + mmap_cache_unref(w->mmap); + + free(w); + + return NULL; +} + +Writer* writer_unref(Writer *w) { + if (w && (-- w->n_ref <= 0)) + writer_free(w); + + return NULL; } -int writer_write(Writer *s, +Writer* writer_ref(Writer *w) { + if (w) + assert_se(++ w->n_ref >= 2); + + return w; +} + +int writer_write(Writer *w, struct iovec_wrapper *iovw, dual_timestamp *ts, bool compress, bool seal) { int r; - assert(s); + assert(w); assert(iovw); assert(iovw->count > 0); - if (journal_file_rotate_suggested(s->journal, 0)) { + if (journal_file_rotate_suggested(w->journal, 0)) { log_info("%s: Journal header limits reached or header out-of-date, rotating", - s->journal->path); - r = do_rotate(&s->journal, compress, seal); + w->journal->path); + r = do_rotate(&w->journal, compress, seal); if (r < 0) return r; } - r = journal_file_append_entry(s->journal, ts, iovw->iovec, iovw->count, - &s->seqnum, NULL, NULL); - if (r >= 0) + r = journal_file_append_entry(w->journal, ts, iovw->iovec, iovw->count, + &w->seqnum, NULL, NULL); + if (r >= 0) { + if (w->server) + w->server->event_count += 1; return 1; + } - log_info("%s: Write failed, rotating", s->journal->path); - r = do_rotate(&s->journal, compress, seal); + log_debug_errno(r, "%s: Write failed, rotating: %m", w->journal->path); + r = do_rotate(&w->journal, compress, seal); if (r < 0) return r; + else + log_info("%s: Successfully rotated journal", w->journal->path); log_debug("Retrying write."); - r = journal_file_append_entry(s->journal, ts, iovw->iovec, iovw->count, - &s->seqnum, NULL, NULL); - return r < 0 ? r : 1; + r = journal_file_append_entry(w->journal, ts, iovw->iovec, iovw->count, + &w->seqnum, NULL, NULL); + if (r < 0) + return r; + + if (w->server) + w->server->event_count += 1; + return 1; }