Permalink
Browse files

Add some logging of activity

  • Loading branch information...
1 parent 1a13571 commit 070308e7a7e39020a5710ea71990dc3ec8b7c07c @evanp evanp committed Nov 6, 2012
Showing with 163 additions and 6 deletions.
  1. +27 −5 lib/schlock.js
  2. +2 −1 package.json
  3. +134 −0 test/logging-test.js
View
@@ -16,7 +16,8 @@
// See the License for the specific language governing permissions and
// limitations under the License.
-var SchlockDoc = function() {
+var SchlockDoc = function(name, log) {
+
var readers = 0,
writers = 0,
readQueue = [],
@@ -37,11 +38,13 @@ var SchlockDoc = function() {
if (writeQueue.length > 0) {
if (readers === 0) {
+ if (log) log.info("Running queued writer for " + name);
writer = writeQueue.shift();
writers++;
runLater(writer);
}
- } else {
+ } else if (readQueue.length > 0) {
+ if (log) log.info("Running " + readQueue.length + " queued reader(s) for " + name);
while (readQueue.length > 0) {
reader = readQueue.shift();
readers++;
@@ -58,26 +61,35 @@ var SchlockDoc = function() {
};
this.readLock = function(callback) {
+ if (log) log.info("Read lock request for " + name);
if (writers > 0 || writeQueue.length > 0) {
+ if (log) log.info("Queueing reader for " + name);
readQueue.push(callback);
} else {
+ if (log) log.info("Running reader immediately for " + name);
readers++;
runLater(callback);
}
};
this.writeLock = function(callback) {
+ if (log) log.info("Write lock request for " + name);
if (writers > 0 || readers > 0 || writeQueue.length > 0) {
+ if (log) log.info("Queueing writer for " + name);
writeQueue.push(callback);
} else {
+ if (log) log.info("Running writer immediately for " + name);
writers++;
runLater(callback);
}
};
this.readUnlock = function(callback) {
+ if (log) log.info("Read unlock request for " + name);
+
if (readers > 0) {
+ if (log) log.info("Decrementing readers for " + name);
readers--;
}
@@ -88,7 +100,10 @@ var SchlockDoc = function() {
this.writeUnlock = function(callback) {
+ if (log) log.info("Write unlock request for " + name);
+
if (writers > 0) {
+ if (log) log.info("Decrementing writers for " + name);
writers--;
}
@@ -98,21 +113,26 @@ var SchlockDoc = function() {
};
};
-var Schlock = function() {
+var Schlock = function(logParent) {
var that = this,
- docs = {};
+ docs = {},
+ log = (logParent) ? logParent.child({component: "schlock"}) : null;
var getDoc = function(name) {
+ if (log) log.info("Getting lock record for " + name);
+
if (!docs.hasOwnProperty(name)) {
- docs[name] = new SchlockDoc();
+ if (log) log.info("New lock record for " + name);
+ docs[name] = new SchlockDoc(name, log);
}
return docs[name];
};
var rmDoc = function(name) {
+ if (log) log.info("Removing lock record for " + name);
delete docs[name];
};
@@ -130,6 +150,7 @@ var Schlock = function() {
var sd = getDoc(name);
sd.readUnlock(callback);
if (sd.idle()) {
+ if (log) log.info("Lock record idle for " + name);
rmDoc(name);
}
};
@@ -138,6 +159,7 @@ var Schlock = function() {
var sd = getDoc(name);
sd.writeUnlock(callback);
if (sd.idle()) {
+ if (log) log.info("Lock record idle for " + name);
rmDoc(name);
}
};
View
@@ -36,7 +36,8 @@
"devDependencies": {
"vows": "0.6.x",
- "step": "0.0.x"
+ "step": "0.0.x",
+ "bunyan": "0.14.x"
},
"dependencies": {
View
@@ -0,0 +1,134 @@
+// logging-test.js
+//
+// Test the logging
+//
+// Copyright 2012, E14N Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+var assert = require("assert"),
+ vows = require("vows"),
+ Step = require("step"),
+ stream = require("stream"),
+ util = require("util"),
+ Logger = require("bunyan");
+
+var suite = vows.describe("schlock logging interface");
+
+var StreamMock = function() {
+ this.writable = true;
+ this.callback = null;
+ this.output = null;
+};
+
+util.inherits(StreamMock, stream.Stream);
+
+StreamMock.prototype.write = function(data) {
+ var cb;
+ this.output = data;
+ if (this.callback) {
+ cb = this.callback;
+ process.nextTick(function() {
+ cb(null, data);
+ });
+ this.callback = null;
+ }
+ return true;
+};
+
+StreamMock.prototype.end = function(data) {
+ var cb;
+ this.output = data;
+ if (this.callback) {
+ cb = this.callback;
+ process.nextTick(function() {
+ cb(null, data);
+ });
+ this.callback = null;
+ }
+};
+
+StreamMock.prototype.setCallback = function(callback) {
+ var mock = this;
+ mock.callback = callback;
+};
+
+suite.addBatch({
+ "When we require the module": {
+ topic: function() {
+ return require("../lib/schlock");
+ },
+ "it works": function(Schlock) {
+ assert.ok(Schlock);
+ },
+ "it returns the Schlock class": function(Schlock) {
+ assert.isFunction(Schlock);
+ },
+ "and we create a new Schlock": {
+ topic: function(Schlock) {
+ var str = new StreamMock(),
+ callback = this.callback,
+ log = new Logger({name: "schlock-test",
+ stream: str});
+
+ callback(null, str, new Schlock(log));
+ },
+ "it works": function(err, str, schlock) {
+ assert.ok(schlock);
+ },
+ "and we do a read lock": {
+ topic: function(str, schlock) {
+ str.setCallback(this.callback);
+ schlock.readLock("target1", function(err) {});
+ },
+ "it writes to the log": function(err, written) {
+ assert.ifError(err);
+ assert.ok(written);
+ },
+ "and we do a read unlock": {
+ topic: function(written, str, schlock) {
+ str.setCallback(this.callback);
+ schlock.readUnlock("target1", function(err) {});
+ },
+ "it writes to the log": function(err, written) {
+ assert.ifError(err);
+ assert.ok(written);
+ }
+ }
+ },
+ "and we do a write lock": {
+ topic: function(str, schlock) {
+ str.setCallback(this.callback);
+ schlock.writeLock("target2", function(err) {});
+ },
+ "it writes to the log": function(err, written) {
+ assert.ifError(err);
+ assert.ok(written);
+ },
+ "and we do a write unlock": {
+ topic: function(written, str, schlock) {
+ str.setCallback(this.callback);
+ schlock.writeUnlock("target2", function(err) {});
+ },
+ "it writes to the log": function(err, written) {
+ assert.ifError(err);
+ assert.ok(written);
+ }
+ }
+ }
+ }
+ }
+});
+
+suite["export"](module);
+

0 comments on commit 070308e

Please sign in to comment.