behaviour in debug mode doesn't match real behaviour

Bug #1320201 reported by Gertjan Oude Lohuis
42
This bug affects 8 people
Affects Status Importance Assigned to Milestone
logrotate (Ubuntu)
Confirmed
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

Tags: patch
Revision history for this message
Launchpad Janitor (janitor) wrote :

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

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

Some news? Bug affects 3.8.7-1ubuntu1 version too

Revision history for this message
Sergey V (sergeyv) wrote :

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

Can anyone review please?

Revision history for this message
Ubuntu Foundations Team Bug Bot (crichton) wrote :

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
Revision history for this message
Sergey V (sergeyv) wrote :

Ping?

Revision history for this message
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?

Revision history for this message
Gertjan Oude Lohuis (gertjan-oudelohuis) wrote :

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!

Revision history for this message
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...

Revision history for this message
Sergey V (sergeyv) wrote :

Upstream release 3.9.1 contains this fix.

Revision history for this message
Sergey V (sergeyv) wrote :

Any news here?

Revision history for this message
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?

Revision history for this message
Gertjan Oude Lohuis (gertjan-oudelohuis) wrote :

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

Revision history for this message
Florent (metz-florent) wrote :

Bumping for a fix on Ubuntu.

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

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.