Don't advance to next rotation time when timeout fires early

Fixes #344
This commit is contained in:
Martijn Schrage 2016-02-01 12:41:59 +01:00 committed by Trent Mick
parent 97a678d8d1
commit d9c5970be2
3 changed files with 12 additions and 2 deletions

View file

@ -34,3 +34,4 @@ Mark Stosberg (https://github.com/markstos)
Alexander Ray (https://github.com/aray12) Alexander Ray (https://github.com/aray12)
Adam Lynch (https://github.com/adam-lynch) Adam Lynch (https://github.com/adam-lynch)
Michael Nisi (https://github.com/michaelnisi) Michael Nisi (https://github.com/michaelnisi)
Martijn Schrage (https://github.com/Oblosys)

View file

@ -8,6 +8,11 @@ Known issues:
## 1.7.1 (not yet released) ## 1.7.1 (not yet released)
- [issue #344] Fix "rotating-file" Bunyan streams to not miss rotations when configured
for a period greater than approximately 25 days. Before this there was an issue
where periods greater than node.js's maximum `setTimeout` length would fail to rotate.
(By Martijn Schrage.)
- [issue #234, pull #345] Improve `bunyan` CLI rendering of "res" field - [issue #234, pull #345] Improve `bunyan` CLI rendering of "res" field
HTTP responses to not show two blank lines for an empty body. HTTP responses to not show two blank lines for an empty body.
(By Michael Nisi.) (By Michael Nisi.)

View file

@ -1219,8 +1219,12 @@ RotatingFileStream = function RotatingFileStream(options) {
util.inherits(RotatingFileStream, EventEmitter); util.inherits(RotatingFileStream, EventEmitter);
RotatingFileStream.prototype._setupNextRot = function () { RotatingFileStream.prototype._setupNextRot = function () {
var self = this;
this.rotAt = this._nextRotTime(); this.rotAt = this._nextRotTime();
this._setRotationTimer();
}
RotatingFileStream.prototype._setRotationTimer = function () {
var self = this;
var delay = this.rotAt - Date.now(); var delay = this.rotAt - Date.now();
// Cap timeout to Node's max setTimeout, see // Cap timeout to Node's max setTimeout, see
// <https://github.com/joyent/node/issues/8656>. // <https://github.com/joyent/node/issues/8656>.
@ -1324,7 +1328,7 @@ RotatingFileStream.prototype.rotate = function rotate() {
// If rotation period is > ~25 days, we have to break into multiple // If rotation period is > ~25 days, we have to break into multiple
// setTimeout's. See <https://github.com/joyent/node/issues/8656>. // setTimeout's. See <https://github.com/joyent/node/issues/8656>.
if (self.rotAt && self.rotAt > Date.now()) { if (self.rotAt && self.rotAt > Date.now()) {
return self._setupNextRot(); return self._setRotationTimer();
} }
if (_DEBUG) { if (_DEBUG) {