From c58d4156557f0d6789b7cd1702789fb47dcadfe3 Mon Sep 17 00:00:00 2001 From: Manuel Araoz Date: Tue, 31 Mar 2015 18:46:25 -0300 Subject: [PATCH] fix mutex race condition --- config/default.yml | 2 +- lib/networkmonitor.js | 1 + lib/node.js | 5 ++++- lib/services/block.js | 35 ++++++++++++++++++++++++++--------- package.json | 5 +++-- 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/config/default.yml b/config/default.yml index fb60e8e2..48ddb954 100644 --- a/config/default.yml +++ b/config/default.yml @@ -1,4 +1,5 @@ BitcoreNode: + LevelUp: ./db network: livenet NetworkMonitor: host: localhost @@ -7,7 +8,6 @@ Reporter: none # none, simple, matrix BitcoreHTTP: host: localhost port: 8080 -LevelUp: ./db RPC: user: user pass: password diff --git a/lib/networkmonitor.js b/lib/networkmonitor.js index 2d161614..85a5acd5 100644 --- a/lib/networkmonitor.js +++ b/lib/networkmonitor.js @@ -49,6 +49,7 @@ NetworkMonitor.prototype.setupPeer = function(peer) { }); }); peer.on('block', function(m) { + console.log('block', m.block.id); self.bus.process(m.block) .catch(function(err) { self.abort(err); diff --git a/lib/node.js b/lib/node.js index 37ee068f..30ba9549 100644 --- a/lib/node.js +++ b/lib/node.js @@ -52,7 +52,10 @@ BitcoreNode.create = function(opts) { var networkMonitor = NetworkMonitor.create(bus, opts.NetworkMonitor); - var database = Promise.promisifyAll(new LevelUp(opts.LevelUp || config.get('LevelUp'))); + console.log(opts.LevelUp); + var database = Promise.promisifyAll( + new LevelUp(opts.LevelUp || config.get('LevelUp')) + ); var rpc = Promise.promisifyAll(new RPC(config.get('RPC'))); var transactionService = new TransactionService({ diff --git a/lib/services/block.js b/lib/services/block.js index 90e8d8c9..b49e5b09 100644 --- a/lib/services/block.js +++ b/lib/services/block.js @@ -63,13 +63,19 @@ function BlockService(opts) { BlockService.prototype.writeLock = function() { var self = this; - return new Promise(function(resolve, reject) { - if (self.lock) { - return reject(); - } else { + return new Promise(function(resolve) { + console.log('getting lock'); + var checkLock = function() { + if (self.lock) { + setImmediate(checkLock); + return; + } self.lock = true; - return resolve(); - } + console.log('lock acquired'); + resolve(); + + }; + checkLock(); }); }; @@ -260,40 +266,51 @@ BlockService.prototype._confirmBlock = function(block) { var ops = []; - return this.writeLock().then(function() { + return this.writeLock() + .then(function() { + console.log(1); return self._setNextBlock(ops, block.header.prevHash, block); }).then(function() { + console.log(2); if (block.header.prevHash.toString('hex') !== NULLBLOCKHASH) { + console.log(2.1); return self.getBlock(block.header.prevHash, { withoutTransactions: true }); } else { + console.log(2.2); return GENESISPARENT; } }).then(function(parent) { + console.log(3); return self._setBlockHeight(ops, block, parent.height + 1); }).then(function() { + console.log(4); return self._setBlockByTs(ops, block); }).then(function() { + console.log(5); return Promise.all(block.transactions.map(function(transaction) { return self.transactionService._confirmTransaction(ops, block, transaction); })); }).then(function() { - - return self.database.batchAsync(ops); + console.log(6); + var p = self.database.batchAsync(ops); + console.log(6.5); + return p; }) .then(this.unlock.bind(this)) .then(function() { + console.log(7); return block; }); }; diff --git a/package.json b/package.json index 8799a9b2..a5cfec7d 100644 --- a/package.json +++ b/package.json @@ -59,8 +59,9 @@ "express": "4.11.1", "glob": "*", "js-yaml": "^3.2.7", - "leveldown": "^1.0.1", - "levelup": "git://github.com/rvagg/node-levelup", + "leveldown": "~1.0.0", + "levelup": "^0.19.0", + "memdown": "^1.0.0", "moment": "~2.5.0", "morgan": "^1.5.1", "request": "^2.48.0",