chaindb: ready for migration.
This commit is contained in:
parent
4a0eaa6b34
commit
0765f44b5b
@ -299,7 +299,7 @@ ChainDB.prototype._open = function open(callback) {
|
||||
utils.btc(self.state.value)
|
||||
);
|
||||
|
||||
self.db.checkVersion('V', 0, callback);
|
||||
self.db.checkVersion('V', 1, callback);
|
||||
}
|
||||
|
||||
this.db.open(function(err) {
|
||||
@ -1834,12 +1834,9 @@ ChainState.fromRaw = function fromRaw(data) {
|
||||
var state = new ChainState();
|
||||
var p = new BufferReader(data);
|
||||
state.tip = p.readHash();
|
||||
// XXX Allow just a hash until I write a migration.
|
||||
if (p.left() > 0) {
|
||||
state.tx = p.readU53();
|
||||
state.coin = p.readU53();
|
||||
state.value = p.readU53();
|
||||
}
|
||||
state.tx = p.readU53();
|
||||
state.coin = p.readU53();
|
||||
state.value = p.readU53();
|
||||
return state;
|
||||
};
|
||||
|
||||
@ -1863,9 +1860,7 @@ function pair(prefix, hash) {
|
||||
function ipair(prefix, num) {
|
||||
var key = new Buffer(5);
|
||||
key[0] = prefix;
|
||||
// TODO: Change this to big
|
||||
// endian for saner sorting.
|
||||
key.writeUInt32LE(num, 1, true);
|
||||
key.writeUInt32BE(num, 1, true);
|
||||
return key;
|
||||
}
|
||||
|
||||
|
||||
112
migrate/chaindb0to1.js
Normal file
112
migrate/chaindb0to1.js
Normal file
@ -0,0 +1,112 @@
|
||||
var bcoin = require('bcoin');
|
||||
var assert = require('assert');
|
||||
var file = process.argv[2];
|
||||
|
||||
assert(typeof file === 'string', 'Please pass in a database path.');
|
||||
|
||||
var db = bcoin.ldb({
|
||||
location: file,
|
||||
db: 'leveldb',
|
||||
compression: true,
|
||||
cacheSize: 16 << 20,
|
||||
writeBufferSize: 8 << 20,
|
||||
createIfMissing: false,
|
||||
bufferKeys: true
|
||||
});
|
||||
|
||||
function makeKey(data) {
|
||||
var height = data.readUInt32LE(1, true);
|
||||
var key = new Buffer(5);
|
||||
key[0] = 0x48;
|
||||
key.writeUInt32BE(height, 1, true);
|
||||
return key;
|
||||
}
|
||||
|
||||
function updateState(callback) {
|
||||
var hash, batch, ver, p;
|
||||
|
||||
console.log('Updating chain state.');
|
||||
|
||||
db.get('R', function(err, data) {
|
||||
if (err)
|
||||
return callback(err);
|
||||
|
||||
if (!data || data.length < 32)
|
||||
return callback(new Error('No chain state.'));
|
||||
|
||||
hash = data.slice(0, 32);
|
||||
|
||||
p = new bcoin.writer();
|
||||
p.writeHash(hash);
|
||||
p.writeU64(0);
|
||||
p.writeU64(0);
|
||||
p.writeU64(0);
|
||||
p = p.render();
|
||||
|
||||
batch = db.batch();
|
||||
|
||||
batch.put('R', p);
|
||||
|
||||
ver = new Buffer(4);
|
||||
ver.writeUInt32LE(1, 0, true);
|
||||
batch.put('V', ver);
|
||||
|
||||
batch.write(function(err) {
|
||||
if (err)
|
||||
return callback(err);
|
||||
console.log('Updated chain state.');
|
||||
callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function updateEndian(callback) {
|
||||
var lo = new Buffer('4800000000', 'hex');
|
||||
var hi = new Buffer('48ffffffff', 'hex');
|
||||
var batch = db.batch();
|
||||
var total = 0;
|
||||
|
||||
console.log('Updating endianness.');
|
||||
console.log('Iterating...');
|
||||
|
||||
db.iterate({
|
||||
gte: lo,
|
||||
lte: hi,
|
||||
values: true,
|
||||
parse: function(key, value) {
|
||||
batch.del(key);
|
||||
batch.put(makeKey(key), value);
|
||||
total++;
|
||||
}
|
||||
}, function(err) {
|
||||
if (err)
|
||||
throw err;
|
||||
|
||||
console.log('Migrating %d items.', total);
|
||||
|
||||
batch.write(function(err) {
|
||||
if (err)
|
||||
throw err;
|
||||
console.log('Migrated endianness.');
|
||||
callback();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
db.open(function(err) {
|
||||
if (err)
|
||||
throw err;
|
||||
|
||||
console.log('Opened %s.', file);
|
||||
|
||||
updateState(function(err) {
|
||||
if (err)
|
||||
throw err;
|
||||
updateEndian(function(err) {
|
||||
if (err)
|
||||
throw err;
|
||||
console.log('Migration complete.');
|
||||
process.exit(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
Loading…
Reference in New Issue
Block a user