JS: Hotfix for sequence issue.

This commit is contained in:
Stefan Thomas
2013-02-23 23:25:55 +01:00
parent 4eb29890c0
commit 7882786b1e
2 changed files with 59 additions and 27 deletions

View File

@@ -1082,7 +1082,8 @@ Remote.prototype.account_seq = function (account, advance) {
{ {
seq = account_info.seq; seq = account_info.seq;
if (advance) account_info.seq += 1; if (advance === "ADVANCE") account_info.seq += 1;
if (advance === "REWIND") account_info.seq -= 1;
// console.log("cached: %s current=%d next=%d", account, seq, account_info.seq); // console.log("cached: %s current=%d next=%d", account, seq, account_info.seq);
} }

View File

@@ -312,32 +312,59 @@ Transaction.prototype.submit = function (callback) {
if (self.remote.local_sequence && !self.tx_json.Sequence) { if (self.remote.local_sequence && !self.tx_json.Sequence) {
self.tx_json.Sequence = this.remote.account_seq(self.tx_json.Account, 'ADVANCE'); self.tx_json.Sequence = this.remote.account_seq(self.tx_json.Account, 'ADVANCE');
// console.log("Sequence: %s", self.tx_json.Sequence); // console.log("Sequence: %s", self.tx_json.Sequence);
}
if (self.remote.local_sequence && !self.tx_json.Sequence) { if (!self.tx_json.Sequence) {
// Look in the last closed ledger. // Look in the last closed ledger.
this.remote.account_seq_cache(self.tx_json.Account, false) this.remote.account_seq_cache(self.tx_json.Account, false)
.on('success_account_seq_cache', function () { .on('success_account_seq_cache', function () {
// Try again. // Try again.
self.submit(); self.submit();
}) })
.on('error_account_seq_cache', function (message) { .on('error_account_seq_cache', function (message) {
// XXX Maybe be smarter about this. Don't want to trust an untrusted server for this seq number. // XXX Maybe be smarter about this. Don't want to trust an untrusted server for this seq number.
// Look in the current ledger. // Look in the current ledger.
self.remote.account_seq_cache(self.tx_json.Account, 'CURRENT') self.remote.account_seq_cache(self.tx_json.Account, 'CURRENT')
.on('success_account_seq_cache', function () { .on('success_account_seq_cache', function () {
// Try again. // Try again.
self.submit(); self.submit();
}) })
.on('error_account_seq_cache', function (message) { .on('error_account_seq_cache', function (message) {
// Forward errors. // Forward errors.
self.emit('error', message); self.emit('error', message);
}) })
.request(); .request();
}) })
.request(); .request();
return this; return this;
}
// If the transaction fails we want to either undo incrementing the sequence
// or submit a noop transaction to consume the sequence remotely.
this.on('success', function (res) {
if (!res || "string" !== typeof res.engine_result) return;
switch (res.engine_result.slice(0, 3)) {
// Synchronous local error
case 'tej':
self.remote.account_seq(self.tx_json.Account, 'REWIND');
break;
// XXX: What do we do in case of ter?
case 'tel':
case 'tem':
case 'tef':
// XXX Once we have a transaction submission manager class, we can
// check if there are any other transactions pending. If there are,
// we should submit a dummy transaction to ensure those
// transactions are still valid.
//var noop = self.remote.transaction().account_set(self.tx_json.Account);
//noop.submit();
// XXX Hotfix. This only works if no other transactions are pending.
self.remote.account_seq(self.tx_json.Account, 'REWIND');
break;
}
});
} }
// Prepare request // Prepare request
@@ -345,8 +372,12 @@ Transaction.prototype.submit = function (callback) {
var request = this.remote.request_submit(); var request = this.remote.request_submit();
// Forward successes and errors. // Forward successes and errors.
request.on('success', function (message) { self.emit('success', message); }); request.on('success', function (message) {
request.on('error', function (message) { self.emit('error', message); }); self.emit('success', message);
});
request.on('error', function (message) {
self.emit('error', message);
});
if (!this._secret && !this.tx_json.Signature) { if (!this._secret && !this.tx_json.Signature) {
this.emit('error', { this.emit('error', {