On Fri, 2008-05-30 at 16:19 -0700, Chris Wagner wrote:
lseek before write will work as long as:
1. syslog-ng isn’t multi-threaded 2. there aren’t multiple syslog-ng’s running on the same server pointing at the same file
I tested that out (turning off APPEND and adding an lseek). NFS performance still great. I modified my conf to point all log messages to a single file (well configured multiple destinations to point to the same file) and things seemed to work fine over NFS – no mangling of messages. So with limited testing – seems to be a good solution.
I've pushed this patch to the 2.1 OSE branch, please check if it works for you. diff --git a/src/affile.c b/src/affile.c index 77c23bf..1ed9bd0 100644 --- a/src/affile.c +++ b/src/affile.c @@ -330,7 +330,7 @@ affile_dw_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) if (self->owner->flags & AFFILE_PIPE) flags = O_RDWR | O_NOCTTY | O_NONBLOCK | O_LARGEFILE; else - flags = O_WRONLY | O_CREAT | O_APPEND | O_NOCTTY | O_NONBLOCK | O_LARGEFILE; + flags = O_WRONLY | O_CREAT | O_NOCTTY | O_NONBLOCK | O_LARGEFILE; self->last_open_stamp = time(NULL); if (affile_open_file(self->filename->str, flags, @@ -357,6 +357,7 @@ affile_dw_init(LogPipe *s, GlobalConfig *cfg, PersistentConfig *persist) fdw = fd_write_new(fd); if (self->owner->flags & AFFILE_FSYNC) fdw->fsync = TRUE; + fdw->append = TRUE; log_writer_reopen(self->writer, fdw); } else diff --git a/src/fdwrite.c b/src/fdwrite.c index e668ddb..5597f12 100644 --- a/src/fdwrite.c +++ b/src/fdwrite.c @@ -38,6 +38,8 @@ fd_write_write_method(FDWrite *self, const void *buf, size_t buflen) { if (self->timeout) alarm_set(self->timeout); + if (self->append) + lseek(self->fd, 0, SEEK_END); rc = write(self->fd, buf, buflen); if (self->timeout > 0 && rc == -1 && errno == EINTR && alarm_has_fired()) { diff --git a/src/fdwrite.h b/src/fdwrite.h index c8ba5c8..7a13ec3 100644 --- a/src/fdwrite.h +++ b/src/fdwrite.h @@ -33,7 +33,8 @@ struct _FDWrite { gint fd; GIOCondition cond; - gboolean fsync; + gboolean fsync:1, + append:1; gint timeout; size_t (*write)(FDWrite *self, const void *buf, size_t count); void (*free_fn)(FDWrite *self); -- Bazsi