behaviour in debug mode doesn't match real behaviour

Bug #1320201 reported by Gertjan Oude Lohuis on 2014-05-16
42
This bug affects 8 people
Affects Status Importance Assigned to Milestone
logrotate (Ubuntu)
High
Unassigned

Bug Description

Situation: a single log file (no earlier rotates) and a logrotate status that says it is time to rotate.

# ls -l /var/log/mail.log*
-rw-r----- 1 syslog adm 287 May 16 11:27 /var/log/mail.log

# cat /var/lib/logrotate/status
logrotate state -- version 2
"/var/log/mail.log" 2012-3-31

# cat /tmp/test.conf
/var/log/mail.log
{
 rotate 4
 weekly
 missingok
 notifempty
 compress
 delaycompress
 sharedscripts
 postrotate
  reload rsyslog >/dev/null 2>&1 || true
 endscript
}

logrotate in debug mode will fail, because it simulates removing a non-existing mail.log.5.gz:

# logrotate -d /tmp/test.conf; echo $?
reading config file /tmp/test.conf
reading config info for /var/log/mail.log

Handling 1 logs

rotating pattern: /var/log/mail.log
 weekly (4 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/mail.log
  log needs rotating
rotating log /var/log/mail.log, log->rotateCount is 4
dateext suffix '-20140516'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log /var/log/mail.log.1 does not exist
renaming /var/log/mail.log.4.gz to /var/log/mail.log.5.gz (rotatecount 4, logstart 1, i 4),
renaming /var/log/mail.log.3.gz to /var/log/mail.log.4.gz (rotatecount 4, logstart 1, i 3),
renaming /var/log/mail.log.2.gz to /var/log/mail.log.3.gz (rotatecount 4, logstart 1, i 2),
renaming /var/log/mail.log.1.gz to /var/log/mail.log.2.gz (rotatecount 4, logstart 1, i 1),
renaming /var/log/mail.log.0.gz to /var/log/mail.log.1.gz (rotatecount 4, logstart 1, i 0),
renaming /var/log/mail.log to /var/log/mail.log.1
running postrotate script
running script (multiple) with arg /var/log/mail.log
: "
  reload rsyslog >/dev/null 2>&1 || true
"
removing old log /var/log/mail.log.5.gz
error: error opening /var/log/mail.log.5.gz: No such file or directory
1

logrotate's real behaviour handles this situation correctly:

# logrotate -v /tmp/test.conf; echo $?
reading config file /tmp/test.conf
reading config info for /var/log/mail.log

Handling 1 logs

rotating pattern: /var/log/mail.log
 weekly (4 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/mail.log
  log needs rotating
rotating log /var/log/mail.log, log->rotateCount is 4
dateext suffix '-20140516'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log /var/log/mail.log.1 does not exist
renaming /var/log/mail.log.4.gz to /var/log/mail.log.5.gz (rotatecount 4, logstart 1, i 4),
old log /var/log/mail.log.4.gz does not exist
renaming /var/log/mail.log.3.gz to /var/log/mail.log.4.gz (rotatecount 4, logstart 1, i 3),
old log /var/log/mail.log.3.gz does not exist
renaming /var/log/mail.log.2.gz to /var/log/mail.log.3.gz (rotatecount 4, logstart 1, i 2),
old log /var/log/mail.log.2.gz does not exist
renaming /var/log/mail.log.1.gz to /var/log/mail.log.2.gz (rotatecount 4, logstart 1, i 1),
old log /var/log/mail.log.1.gz does not exist
renaming /var/log/mail.log.0.gz to /var/log/mail.log.1.gz (rotatecount 4, logstart 1, i 0),
old log /var/log/mail.log.0.gz does not exist
log /var/log/mail.log.5.gz doesn't exist -- won't try to dispose of it
renaming /var/log/mail.log to /var/log/mail.log.1
running postrotate script
0

Summary:

# logrotate -d /tmp/test.conf; echo $?
[..]
removing old log /var/log/mail.log.5.gz
error: error opening /var/log/mail.log.5.gz: No such file or directory

exitcode: 1

# logrotate -v /tmp/test.conf; echo $?
[..]
log /var/log/mail.log.5.gz doesn't exist -- won't try to dispose of it

exitcode: 0

1) The release of Ubuntu you are using, via 'lsb_release -rd' or System -> About Ubuntu
Description: Ubuntu 12.04.3 LTS
Release: 12.04

2) The version of the package you are using, via 'apt-cache policy pkgname' or by checking in Software Center
logrotate:
  Installed: 3.7.8-6ubuntu5
  Candidate: 3.7.8-6ubuntu5

3) What you expected to happen
debug mode should not output an error and should have exitcode 0

4) What happened instead
debug mode prints an error and has exitcode 1

Launchpad Janitor (janitor) wrote :

Status changed to 'Confirmed' because the bug affects multiple users.

Changed in logrotate (Ubuntu):
status: New → Confirmed
Алексей (f-mail-r) wrote :

Some news? Bug affects 3.8.7-1ubuntu1 version too

Sergey V (sergeyv) wrote :

I prepared a patch to fix this issue (atteched).

Can anyone review please?

The attachment "0001-If-the-last-rotation-doesn-t-exist-that-s-okay-even-.patch" seems to be a patch. If it isn't, please remove the "patch" flag from the attachment, remove the "patch" tag, and if you are a member of the ~ubuntu-reviewers, unsubscribe the team.

[This is an automated message performed by a Launchpad user owned by ~brian-murray, for any issues please contact him.]

tags: added: patch
Sergey V (sergeyv) wrote :

Ping?

Sergey V (sergeyv) wrote :

Well, now patch is applied to upstream in r477 (svn repo: http://svn.fedorahosted.org/svn/logrotate/trunk ).

Any chances to get it in ubuntu?

Sorry for not responding earlier, haven't had a chance to test the new behaviour. Great that this bug is fixed, will test it shortly. Thanks!

Sergey V (sergeyv) wrote :
Download full text (9.1 KiB)

I tested the patch, and seems it works as expected.

#old version, reproduce bug

hostname:~/logrotate# for i in `seq 1 100000` ; do echo some entry $i >> /tmp/some.log; done

hostname:~/logrotate# cat /tmp/some.conf
/tmp/some.log
{
 rotate 4
 weekly
 size 10
 missingok
 notifempty
 compress
 delaycompress
 sharedscripts
 postrotate
  reload rsyslog >/dev/null 2>&1 || true
 endscript
}

hostname:~/logrotate# ./logrotate -d /tmp/some.conf ; echo $?
reading config file /tmp/some.conf

Handling 1 logs

rotating pattern: /tmp/some.log
 10 bytes (4 rotations)
empty log files are not rotated, old logs are removed
considering log /tmp/some.log
  log needs rotating
rotating log /tmp/some.log, log->rotateCount is 4
dateext suffix '-20150317'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log /tmp/some.log.1 does not exist
renaming /tmp/some.log.4.gz to /tmp/some.log.5.gz (rotatecount 4, logstart 1, i 4),
renaming /tmp/some.log.3.gz to /tmp/some.log.4.gz (rotatecount 4, logstart 1, i 3),
renaming /tmp/some.log.2.gz to /tmp/some.log.3.gz (rotatecount 4, logstart 1, i 2),
renaming /tmp/some.log.1.gz to /tmp/some.log.2.gz (rotatecount 4, logstart 1, i 1),
renaming /tmp/some.log.0.gz to /tmp/some.log.1.gz (rotatecount 4, logstart 1, i 0),
renaming /tmp/some.log to /tmp/some.log.1
running postrotate script
running script with arg /tmp/some.log
: "
  reload rsyslog >/dev/null 2>&1 || true
"
removing old log /tmp/some.log.5.gz
error: error opening /tmp/some.log.5.gz: No such file or directory
1

hostname:~/logrotate# ./logrotate -v /tmp/some.conf ; echo $?
reading config file /tmp/some.conf

Handling 1 logs

rotating pattern: /tmp/some.log
 10 bytes (4 rotations)
empty log files are not rotated, old logs are removed
considering log /tmp/some.log
  log needs rotating
rotating log /tmp/some.log, log->rotateCount is 4
dateext suffix '-20150317'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log /tmp/some.log.1 does not exist
renaming /tmp/some.log.4.gz to /tmp/some.log.5.gz (rotatecount 4, logstart 1, i 4),
old log /tmp/some.log.4.gz does not exist
renaming /tmp/some.log.3.gz to /tmp/some.log.4.gz (rotatecount 4, logstart 1, i 3),
old log /tmp/some.log.3.gz does not exist
renaming /tmp/some.log.2.gz to /tmp/some.log.3.gz (rotatecount 4, logstart 1, i 2),
old log /tmp/some.log.2.gz does not exist
renaming /tmp/some.log.1.gz to /tmp/some.log.2.gz (rotatecount 4, logstart 1, i 1),
old log /tmp/some.log.1.gz does not exist
renaming /tmp/some.log.0.gz to /tmp/some.log.1.gz (rotatecount 4, logstart 1, i 0),
old log /tmp/some.log.0.gz does not exist
log /tmp/some.log.5.gz doesn't exist -- won't try to dispose of it
renaming /tmp/some.log to /tmp/some.log.1
running postrotate script
0

# after applying patch, compile new version and check

hostname:~/logrotate# ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether ...

Read more...

Sergey V (sergeyv) wrote :

Upstream release 3.9.1 contains this fix.

Sergey V (sergeyv) wrote :

Any news here?

Voidenko Ekaterina (katyavoid) wrote :

This bug affects me too. Thank you, Sergey.
Please add this patch to Ubuntu.

You have stupid bug and simple fix for it. Why not?

I'm not sure if you're waiting for a confirmation from me, but this patch seems to work perfectly! Merge away :).

Florent (metz-florent) wrote :

Bumping for a fix on Ubuntu.

Matt Fischer (mfisch) on 2016-06-23
Changed in logrotate (Ubuntu):
importance: Undecided → High
To post a comment you must log in.
This report contains Public information  Edit
Everyone can see this information.

Other bug subscribers