From e021c8f337d77024b60db8bf2d8d30837e3ef7d4 Mon Sep 17 00:00:00 2001 From: Melvin Tu Date: Wed, 21 Jun 2017 02:09:44 +0800 Subject: [PATCH 1/6] fix a race condition bug that module might crash --- index.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 6b754fd..f132bfb 100644 --- a/index.js +++ b/index.js @@ -222,9 +222,13 @@ Tail = (function(_super) { if (self.fd == null) { fs.exists(self.filename, function(exists) { if (exists) { - self.fd = fs.openSync(self.filename, 'r'); - self.inode = curr.ino; - self.bookmarks[self.fd] = 0; + try { + self.fd = fs.openSync(self.filename, 'r'); + self.inode = curr.ino; + self.bookmarks[self.fd] = 0; + } catch(err) { + // race condition, file is removed between exists function and openSync function + } } callback(); }); From f2f6e505df9f97182a3bf9874ad0bf2755e1e90f Mon Sep 17 00:00:00 2001 From: Melvin Tu Date: Wed, 21 Jun 2017 02:12:03 +0800 Subject: [PATCH 2/6] update version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3bc99a..4ef636d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "always-tail", - "version": "0.2.0", + "version": "0.2.1", "description": "continuous file tail. robust enough to survive rollovers.", "main": "index.js", "scripts": { From 7be6896ddbdc9b57503e087cca42b460613bf8bc Mon Sep 17 00:00:00 2001 From: Melvin Tu Date: Sun, 25 Jun 2017 15:02:46 +0800 Subject: [PATCH 3/6] BUG: start may be undefined --- index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/index.js b/index.js index f132bfb..022c452 100644 --- a/index.js +++ b/index.js @@ -39,6 +39,10 @@ Tail = (function(_super) { if (err) { return next(); }; + if(!start) { + return next(); + } + var start = self.bookmarks[block.fd]; var end = stat.size; From 78ef8b931f7c8d3618d89fe5ac7930f55f4fc8ce Mon Sep 17 00:00:00 2001 From: Melvin Tu Date: Sun, 25 Jun 2017 20:00:58 +0800 Subject: [PATCH 4/6] fix bug --- index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 022c452..de755aa 100644 --- a/index.js +++ b/index.js @@ -39,7 +39,8 @@ Tail = (function(_super) { if (err) { return next(); }; - if(!start) { + // self-protection, start may be undefined, race condition?? + if(typeof start === 'undefined') { return next(); } From f5ba2c22f2c9825ef5eca781bfd4ed364327ccb6 Mon Sep 17 00:00:00 2001 From: Melvin Tu Date: Sun, 2 Jul 2017 11:49:13 +0800 Subject: [PATCH 5/6] add debug info --- index.js | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index de755aa..93f2ae3 100644 --- a/index.js +++ b/index.js @@ -24,7 +24,11 @@ Tail = (function(_super) { var next = function() { if (block.type == 'close') { - fs.close(block.fd); + try { + fs.close(block.fd); + } catch(err) { + console.log("FAILED TO CLOSE FD:", err, err.stack); + } delete self.bookmarks[block.fd]; }; @@ -39,8 +43,8 @@ Tail = (function(_super) { if (err) { return next(); }; - // self-protection, start may be undefined, race condition?? - if(typeof start === 'undefined') { + // self-protection, start may be undefined or NaN, race condition?? + if(typeof start === 'undefined' || isNaN(start)) { return next(); } @@ -166,7 +170,12 @@ Tail = (function(_super) { }; if (self.fd) { - fs.close(self.fd); + try { + fs.close(self.fd); + } catch(err) { + console.log("FAILED TO CLOSE FD:", err, err.stack); + } + self.fd = null; }; @@ -174,7 +183,11 @@ Tail = (function(_super) { for (var i in self.queue) { var item = self.queue[i]; if (item.type == 'close') { - fs.close(item.fd); + try { + fs.close(item.fd); + } catch (err) { + console.log("FAILED TO CLOSE FD:", err, err.stack); + } }; }; From f4e50f27431299894cea2ae7470749d2831ffa38 Mon Sep 17 00:00:00 2001 From: Melvin Tu Date: Mon, 3 Jul 2017 01:42:08 +0800 Subject: [PATCH 6/6] bug fix --- index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 93f2ae3..b830826 100644 --- a/index.js +++ b/index.js @@ -42,15 +42,15 @@ Tail = (function(_super) { fs.fstat(block.fd, function(err, stat) { if (err) { return next(); }; + + var start = self.bookmarks[block.fd]; + var end = stat.size; // self-protection, start may be undefined or NaN, race condition?? if(typeof start === 'undefined' || isNaN(start)) { - return next(); + return next(); } - - var start = self.bookmarks[block.fd]; - var end = stat.size; - + if (end < start) { // file was truncated debug('file was truncated:', self.filename);