fix mutex race condition
This commit is contained in:
parent
8121f52c38
commit
c58d415655
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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({
|
||||||
|
|||||||
@ -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;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user