1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-06 02:15:48 +03:00

Fix execution order

If the command_queue and the offline_queue holds commands,
the offline_queue should be choosen instead of the command_queue.
This commit is contained in:
Ruben Bridgewater
2016-04-13 04:04:03 +02:00
parent 8e24380d53
commit aff765adf0
2 changed files with 14 additions and 8 deletions

View File

@@ -91,7 +91,8 @@ function callbackOrEmit (self, callback, err, res) {
} }
function replyInOrder (self, callback, err, res) { function replyInOrder (self, callback, err, res) {
var command_obj = self.command_queue.peekBack() || self.offline_queue.peekBack(); // The offline queue has to be checked first, as there might be commands in both queues at the same time
var command_obj = self.offline_queue.peekBack() || self.command_queue.peekBack();
if (!command_obj) { if (!command_obj) {
process.nextTick(function () { process.nextTick(function () {
callbackOrEmit(self, callback, err, res); callbackOrEmit(self, callback, err, res);

View File

@@ -107,7 +107,7 @@ describe('utils.js', function () {
emitted = false; emitted = false;
}); });
it('no elements in either queue. Reply in the next tick', function (done) { it('no elements in either queue. Reply in the next tick with callback', function (done) {
var called = false; var called = false;
utils.reply_in_order(clientMock, function () { utils.reply_in_order(clientMock, function () {
called = true; called = true;
@@ -116,7 +116,7 @@ describe('utils.js', function () {
assert(!called); assert(!called);
}); });
it('no elements in either queue. Reply in the next tick', function (done) { it('no elements in either queue. Reply in the next tick without callback', function (done) {
assert(!emitted); assert(!emitted);
utils.reply_in_order(clientMock, null, new Error('tada')); utils.reply_in_order(clientMock, null, new Error('tada'));
assert(!emitted); assert(!emitted);
@@ -153,16 +153,21 @@ describe('utils.js', function () {
} }
}); });
it('elements in the offline queue. Reply after the offline queue is empty and respect the command_obj', function (done) { it('elements in the offline queue and the command_queue. Reply all other commands got handled respect the command_obj', function (done) {
clientMock.command_queue.push(create_command_obj(), {}); clientMock.command_queue.push(create_command_obj(), create_command_obj());
utils.reply_in_order(clientMock, function () { clientMock.offline_queue.push(create_command_obj(), {});
utils.reply_in_order(clientMock, function (err, res) {
assert.strictEqual(clientMock.command_queue.length, 0); assert.strictEqual(clientMock.command_queue.length, 0);
assert.strictEqual(clientMock.offline_queue.length, 0);
assert(!emitted); assert(!emitted);
assert.strictEqual(res_count, 1); assert.strictEqual(res_count, 3);
done(); done();
}, null, null); }, null, null);
while (clientMock.offline_queue.length) {
clientMock.command_queue.push(clientMock.offline_queue.shift());
}
while (clientMock.command_queue.length) { while (clientMock.command_queue.length) {
clientMock.command_queue.shift().callback(null, 'bar'); clientMock.command_queue.shift().callback(null, 'hello world');
} }
}); });
}); });