[ADD] replacement for current aborter/abort_last hack: UDP-style handler of mis-ordered requests
* By default, ignores (refuses to resolve) mis-ordered request when they come back * Optionally, fails them bzr revid: xmo@openerp.com-20120301152315-67kbkdwpy7cdh25y
This commit is contained in:
@@ -1190,6 +1190,46 @@ openerp.web.CompoundDomain = openerp.web.Class.extend({
|
||||
return this.__eval_context;
|
||||
}
|
||||
});
|
||||
|
||||
openerp.web.DropMisordered = openerp.web.Class.extend(/** @lends openerp.web.DropMisordered# */{
|
||||
/**
|
||||
* @constructs openerp.web.DropMisordered
|
||||
* @extends openerp.web.Class
|
||||
*
|
||||
* @param {Boolean} [failMisordered=false] whether mis-ordered responses should be failed or just ignored
|
||||
*/
|
||||
init: function (failMisordered) {
|
||||
// local sequence number, for requests sent
|
||||
this.lsn = 0;
|
||||
// remote sequence number, seqnum of last received request
|
||||
this.rsn = -1;
|
||||
this.failMisordered = failMisordered || false;
|
||||
},
|
||||
/**
|
||||
* Adds a deferred (usually an async request) to the sequencer
|
||||
*
|
||||
* @param {$.Deferred} deferred to ensure add
|
||||
* @returns {$.Deferred}
|
||||
*/
|
||||
add: function (deferred) {
|
||||
var res = $.Deferred();
|
||||
|
||||
var self = this, seq = this.lsn++;
|
||||
deferred.then(function () {
|
||||
if (seq > self.rsn) {
|
||||
self.rsn = seq;
|
||||
res.resolve.apply(res, arguments);
|
||||
} else if (self.failMisordered) {
|
||||
res.reject();
|
||||
}
|
||||
}, function () {
|
||||
res.reject.apply(res, arguments);
|
||||
});
|
||||
|
||||
return res.promise();
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
// vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:
|
||||
|
||||
@@ -0,0 +1,130 @@
|
||||
$(document).ready(function () {
|
||||
var openerp;
|
||||
|
||||
module('Misordered resolution management', {
|
||||
setup: function () {
|
||||
openerp = window.openerp.init();
|
||||
window.openerp.web.core(openerp);
|
||||
window.openerp.web.data(openerp);
|
||||
}
|
||||
});
|
||||
test('Resolve all correctly ordered, sync', function () {
|
||||
var dm = new openerp.web.DropMisordered(), flag = false;
|
||||
|
||||
var d1 = $.Deferred(), d2 = $.Deferred(),
|
||||
r1 = dm.add(d1), r2 = dm.add(d2);
|
||||
|
||||
$.when(r1, r2).done(function () {
|
||||
flag = true;
|
||||
});
|
||||
d1.resolve();
|
||||
d2.resolve();
|
||||
|
||||
ok(flag);
|
||||
});
|
||||
test("Don't resolve mis-ordered, sync", function () {
|
||||
var dm = new openerp.web.DropMisordered(),
|
||||
done1 = false, done2 = false,
|
||||
fail1 = false, fail2 = false;
|
||||
|
||||
var d1 = $.Deferred(), d2 = $.Deferred();
|
||||
dm.add(d1).then(function () { done1 = true; },
|
||||
function () { fail1 = true; });
|
||||
dm.add(d2).then(function () { done2 = true; },
|
||||
function () { fail2 = true; });
|
||||
|
||||
d2.resolve();
|
||||
d1.resolve();
|
||||
|
||||
// d1 is in limbo
|
||||
ok(!done1);
|
||||
ok(!fail1);
|
||||
// d2 is resolved
|
||||
ok(done2);
|
||||
ok(!fail2);
|
||||
});
|
||||
test('Fail mis-ordered flag, sync', function () {
|
||||
var dm = new openerp.web.DropMisordered(true),
|
||||
done1 = false, done2 = false,
|
||||
fail1 = false, fail2 = false;
|
||||
|
||||
var d1 = $.Deferred(), d2 = $.Deferred();
|
||||
dm.add(d1).then(function () { done1 = true; },
|
||||
function () { fail1 = true; });
|
||||
dm.add(d2).then(function () { done2 = true; },
|
||||
function () { fail2 = true; });
|
||||
|
||||
d2.resolve();
|
||||
d1.resolve();
|
||||
|
||||
// d1 is failed
|
||||
ok(!done1);
|
||||
ok(fail1);
|
||||
// d2 is resolved
|
||||
ok(done2);
|
||||
ok(!fail2);
|
||||
});
|
||||
|
||||
asyncTest('Resolve all correctly ordered, sync', 1, function () {
|
||||
var dm = new openerp.web.DropMisordered();
|
||||
|
||||
var d1 = $.Deferred(), d2 = $.Deferred(),
|
||||
r1 = dm.add(d1), r2 = dm.add(d2);
|
||||
|
||||
setTimeout(function () { d1.resolve(); }, 100);
|
||||
setTimeout(function () { d2.resolve(); }, 200);
|
||||
|
||||
$.when(r1, r2).done(function () {
|
||||
start();
|
||||
ok(true);
|
||||
});
|
||||
});
|
||||
asyncTest("Don't resolve mis-ordered, sync", 4, function () {
|
||||
var dm = new openerp.web.DropMisordered(),
|
||||
done1 = false, done2 = false,
|
||||
fail1 = false, fail2 = false;
|
||||
|
||||
var d1 = $.Deferred(), d2 = $.Deferred();
|
||||
dm.add(d1).then(function () { done1 = true; },
|
||||
function () { fail1 = true; });
|
||||
dm.add(d2).then(function () { done2 = true; },
|
||||
function () { fail2 = true; });
|
||||
|
||||
setTimeout(function () { d1.resolve(); }, 200);
|
||||
setTimeout(function () { d2.resolve(); }, 100);
|
||||
|
||||
setTimeout(function () {
|
||||
start();
|
||||
// d1 is in limbo
|
||||
ok(!done1);
|
||||
ok(!fail1);
|
||||
// d2 is resolved
|
||||
ok(done2);
|
||||
ok(!fail2);
|
||||
}, 400);
|
||||
});
|
||||
asyncTest('Fail mis-ordered flag, sync', 4, function () {
|
||||
var dm = new openerp.web.DropMisordered(true),
|
||||
done1 = false, done2 = false,
|
||||
fail1 = false, fail2 = false;
|
||||
|
||||
var d1 = $.Deferred(), d2 = $.Deferred();
|
||||
dm.add(d1).then(function () { done1 = true; },
|
||||
function () { fail1 = true; });
|
||||
dm.add(d2).then(function () { done2 = true; },
|
||||
function () { fail2 = true; });
|
||||
|
||||
setTimeout(function () { d1.resolve(); }, 200);
|
||||
setTimeout(function () { d2.resolve(); }, 100);
|
||||
|
||||
setTimeout(function () {
|
||||
start();
|
||||
// d1 is failed
|
||||
ok(!done1);
|
||||
ok(fail1);
|
||||
// d2 is resolved
|
||||
ok(done2);
|
||||
ok(!fail2);
|
||||
}, 400);
|
||||
});
|
||||
});
|
||||
@@ -51,4 +51,5 @@
|
||||
<script type="text/javascript" src="/web/static/test/list-utils.js"></script>
|
||||
<script type="text/javascript" src="/web/static/test/formats.js"></script>
|
||||
<script type="text/javascript" src="/web/static/test/onchange.js"></script>
|
||||
<script type="text/javascript" src="/web/static/test/rpc.js"></script>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user