[2018-12-12 19:39] Dmitry Bogatov <kact...@debian.org>
> I managed to reproduce bug. Seems that .u file appears when svlogd is
> restarted and there is some .s files, but not always. I plan to debug
> it this weekend.
> 
> Thank you for report. If you have some ideas, how to reproduce bug
> more reliable, it would be great!

Offending .u file is created by rename(2) call at line 532, in
logdir_open() function. It happens, when 'current' file exists,
non-executable and non-empty.

Well, this is quite normal state of affairs. When `svlogd' is running,
`current' file is getting appended, when its size reaches `ld->sizemax'
(or something like this), it gets renames to @timestamp, and new
`current' is created.

So, if I interrupt `svlogd' at any time, but just after rotation, I
will get this leftover .u file. I am not perfectly sure, but seems that
`struct logdir` has `size' field, that means current size of log file.

I believe following patch would solve current issue. But wouldn't
it cause another problems? There must be reason, why this logic was
implemented. Gerrit, some input, please?

diff --git a/runit-2.1.2/src/svlogd.c b/runit-2.1.2/src/svlogd.c
index fab8441..3f8ead4 100644
--- a/runit-2.1.2/src/svlogd.c
+++ b/runit-2.1.2/src/svlogd.c
@@ -521,20 +521,7 @@ unsigned int logdir_open(struct logdir *ld, const char 
*fn) {
 
   /* open current */
   if ((i =stat("current", &st)) != -1) {
-    if (st.st_size && ! (st.st_mode & S_IXUSR)) {
-      ld->fnsave[25] ='.'; ld->fnsave[26] ='u'; ld->fnsave[27] =0;
-      do {
-        taia_now(&now);
-        fmt_taia(ld->fnsave, &now);
-        errno =0;
-      } while ((stat(ld->fnsave, &st) != -1) || (errno != error_noent));
-      while (rename("current", ld->fnsave) == -1)
-        pause2("unable to rename current", ld->name);
-      rmoldest(ld);
-      i =-1;
-    }
-    else
-      ld->size =st.st_size;
+    ld->size =st.st_size;
   }
   else
     if (errno != error_noent) {

Reply via email to