Skip to content

Commit ed581ec

Browse files
committed
forceParallel to finish on first valid output #5
1 parent 7b3c04e commit ed581ec

File tree

5 files changed

+90
-10
lines changed

5 files changed

+90
-10
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ See [contributing guide](.github/CONTRIBUTING.md)
137137

138138
| Date | Version | Description |
139139
| ----------- | ------- | ----------- |
140-
| 2019-06-21 | v1.2.0 | Added 'forceParallel' option to issue GET in parallel #5 |
140+
| 2019-06-24 | v1.2.1 | Added 'forceParallel' option to issue GET in parallel #5 |
141141
| 2017-07-26 | v1.0.61 | Added all-ready event and allConnected attribute |
142142
| 2017-01-18 | v1.0.29 | setnx type commands now run in sequence and not in parallel |
143143
| 2015-10-22 | v0.0.16 | Timeout child commands (see childCommandTimeout option) |

docs/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
| Date | Version | Description |
22
| ----------- | ------- | ----------- |
3-
| 2019-06-21 | v1.2.0 | Added 'forceParallel' option to issue GET in parallel #5 |
3+
| 2019-06-24 | v1.2.1 | Added 'forceParallel' option to issue GET in parallel #5 |
44
| 2017-07-26 | v1.0.61 | Added all-ready event and allConnected attribute |
55
| 2017-01-18 | v1.0.29 | setnx type commands now run in sequence and not in parallel |
66
| 2015-10-22 | v0.0.16 | Timeout child commands (see childCommandTimeout option) |

lib/multiple-redis.js

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,36 @@ MultiRedisClient.prototype.invokeCommandOnClient = function (input) {
392392
}
393393
};
394394

395+
/**
396+
* Similar to race but stops on the first valid output.
397+
*
398+
* @function
399+
* @memberof! MultiRedisClient
400+
* @alias MultiRedisClient.parallelOnFirstValid
401+
* @private
402+
* @param {Array} actions - Functions array to invoke
403+
* @param {function} callback - Invoked on first valid output.
404+
*/
405+
function parallelOnFirstValid(actions, callback) {
406+
asyncLib.parallel(actions.map(function modifyAction(action) {
407+
return function onAction(cb) {
408+
action(function onActionDone(error, value) {
409+
if (value) {
410+
cb(value);
411+
} else {
412+
cb(null, error);
413+
}
414+
});
415+
};
416+
}), function onParallelDone(value, errors) {
417+
if (value) {
418+
callback(null, value);
419+
} else {
420+
callback(errors);
421+
}
422+
});
423+
}
424+
395425
/**
396426
* Creates and returns a handler function for the given command.
397427
*
@@ -462,7 +492,11 @@ function createCommandFunction(command) {
462492
});
463493

464494
if (runInParallel || self.forceParallel) {
465-
asyncLib.parallel(actions, onRedisFlowEnd);
495+
if (getCommand) {
496+
parallelOnFirstValid(actions, onRedisFlowEnd);
497+
} else {
498+
asyncLib.parallel(actions, onRedisFlowEnd);
499+
}
466500
} else {
467501
asyncLib.series(actions, onRedisFlowEnd);
468502
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "multiple-redis",
3-
"version": "1.2.0",
3+
"version": "1.2.1",
44
"description": "Run redis commands against multiple redis instances.",
55
"author": {
66
"name": "Sagie Gur-Ari",

test/spec/multiple-redis-spec.js

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -847,7 +847,7 @@ describe('MultipleRedis', function () {
847847
});
848848
});
849849

850-
it('second only has data force parallel', function (done) {
850+
it('last only has data force parallel', function (done) {
851851
var count = 0;
852852
var createClient = function () {
853853
return {
@@ -859,17 +859,23 @@ describe('MultipleRedis', function () {
859859
assert.deepEqual(args, ['my key']);
860860
assert.isFunction(callback);
861861

862-
if (count === 2) {
863-
callback(null, 'my value');
864-
} else {
862+
switch (count) {
863+
case 1:
864+
setTimeout(callback, 30000);
865+
break;
866+
case 2:
865867
callback(null, null);
868+
break;
869+
default:
870+
callback(null, 'my value');
866871
}
867872
}
868873
};
869874
};
870875
var client1 = createClient();
871876
var client2 = createClient();
872-
var client = MultipleRedis.createClient([client1, client2], {
877+
var client3 = createClient();
878+
var client = MultipleRedis.createClient([client1, client2, client3], {
873879
forceParallel: true
874880
});
875881

@@ -878,7 +884,47 @@ describe('MultipleRedis', function () {
878884
client.get('my key', function (error, response) {
879885
assert.isNull(error);
880886
assert.equal(response, 'my value');
881-
assert.equal(count, 2);
887+
assert.equal(count, 3);
888+
889+
done();
890+
});
891+
});
892+
893+
it('all no data force parallel', function (done) {
894+
var count = 0;
895+
var createClient = function () {
896+
return {
897+
on: noop,
898+
send_command: function (name, args, callback) {
899+
count++;
900+
901+
assert.equal(name, 'get');
902+
assert.deepEqual(args, ['my key']);
903+
assert.isFunction(callback);
904+
905+
switch (count) {
906+
case 1:
907+
setTimeout(callback, 0);
908+
break;
909+
default:
910+
callback(null, null);
911+
}
912+
}
913+
};
914+
};
915+
var client1 = createClient();
916+
var client2 = createClient();
917+
var client3 = createClient();
918+
var client = MultipleRedis.createClient([client1, client2, client3], {
919+
forceParallel: true
920+
});
921+
922+
assert.isTrue(client.forceParallel);
923+
924+
client.get('my key', function (error, response) {
925+
assert.isDefined(error);
926+
assert.isNull(response);
927+
assert.equal(count, 3);
882928

883929
done();
884930
});

0 commit comments

Comments
 (0)