fix mutex race condition

This commit is contained in:
Manuel Araoz 2015-03-31 18:46:25 -03:00
parent 8121f52c38
commit c58d415655
5 changed files with 35 additions and 13 deletions

View File

@ -1,4 +1,5 @@
BitcoreNode: BitcoreNode:
LevelUp: ./db
network: livenet network: livenet
NetworkMonitor: NetworkMonitor:
host: localhost host: localhost
@ -7,7 +8,6 @@ Reporter: none # none, simple, matrix
BitcoreHTTP: BitcoreHTTP:
host: localhost host: localhost
port: 8080 port: 8080
LevelUp: ./db
RPC: RPC:
user: user user: user
pass: password pass: password

View File

@ -49,6 +49,7 @@ NetworkMonitor.prototype.setupPeer = function(peer) {
}); });
}); });
peer.on('block', function(m) { peer.on('block', function(m) {
console.log('block', m.block.id);
self.bus.process(m.block) self.bus.process(m.block)
.catch(function(err) { .catch(function(err) {
self.abort(err); self.abort(err);

View File

@ -52,7 +52,10 @@ BitcoreNode.create = function(opts) {
var networkMonitor = NetworkMonitor.create(bus, opts.NetworkMonitor); 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 rpc = Promise.promisifyAll(new RPC(config.get('RPC')));
var transactionService = new TransactionService({ var transactionService = new TransactionService({

View File

@ -63,13 +63,19 @@ function BlockService(opts) {
BlockService.prototype.writeLock = function() { BlockService.prototype.writeLock = function() {
var self = this; var self = this;
return new Promise(function(resolve, reject) { return new Promise(function(resolve) {
if (self.lock) { console.log('getting lock');
return reject(); var checkLock = function() {
} else { if (self.lock) {
setImmediate(checkLock);
return;
}
self.lock = true; self.lock = true;
return resolve(); console.log('lock acquired');
} resolve();
};
checkLock();
}); });
}; };
@ -260,40 +266,51 @@ BlockService.prototype._confirmBlock = function(block) {
var ops = []; var ops = [];
return this.writeLock().then(function() { return this.writeLock()
.then(function() {
console.log(1);
return self._setNextBlock(ops, block.header.prevHash, block); return self._setNextBlock(ops, block.header.prevHash, block);
}).then(function() { }).then(function() {
console.log(2);
if (block.header.prevHash.toString('hex') !== NULLBLOCKHASH) { if (block.header.prevHash.toString('hex') !== NULLBLOCKHASH) {
console.log(2.1);
return self.getBlock(block.header.prevHash, { return self.getBlock(block.header.prevHash, {
withoutTransactions: true withoutTransactions: true
}); });
} else { } else {
console.log(2.2);
return GENESISPARENT; return GENESISPARENT;
} }
}).then(function(parent) { }).then(function(parent) {
console.log(3);
return self._setBlockHeight(ops, block, parent.height + 1); return self._setBlockHeight(ops, block, parent.height + 1);
}).then(function() { }).then(function() {
console.log(4);
return self._setBlockByTs(ops, block); return self._setBlockByTs(ops, block);
}).then(function() { }).then(function() {
console.log(5);
return Promise.all(block.transactions.map(function(transaction) { return Promise.all(block.transactions.map(function(transaction) {
return self.transactionService._confirmTransaction(ops, block, transaction); return self.transactionService._confirmTransaction(ops, block, transaction);
})); }));
}).then(function() { }).then(function() {
console.log(6);
return self.database.batchAsync(ops); var p = self.database.batchAsync(ops);
console.log(6.5);
return p;
}) })
.then(this.unlock.bind(this)) .then(this.unlock.bind(this))
.then(function() { .then(function() {
console.log(7);
return block; return block;
}); });
}; };

View File

@ -59,8 +59,9 @@
"express": "4.11.1", "express": "4.11.1",
"glob": "*", "glob": "*",
"js-yaml": "^3.2.7", "js-yaml": "^3.2.7",
"leveldown": "^1.0.1", "leveldown": "~1.0.0",
"levelup": "git://github.com/rvagg/node-levelup", "levelup": "^0.19.0",
"memdown": "^1.0.0",
"moment": "~2.5.0", "moment": "~2.5.0",
"morgan": "^1.5.1", "morgan": "^1.5.1",
"request": "^2.48.0", "request": "^2.48.0",