You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-06 02:15:48 +03:00
Handle very big pipelines without crashing
This commit is contained in:
11
index.js
11
index.js
@@ -106,7 +106,7 @@ function RedisClient (options) {
|
|||||||
this.times_connected = 0;
|
this.times_connected = 0;
|
||||||
this.options = options;
|
this.options = options;
|
||||||
// Init parser
|
// Init parser
|
||||||
this.reply_parser = new Parser({
|
this.reply_parser = Parser({
|
||||||
returnReply: function (data) {
|
returnReply: function (data) {
|
||||||
self.return_reply(data);
|
self.return_reply(data);
|
||||||
},
|
},
|
||||||
@@ -786,8 +786,13 @@ RedisClient.prototype.send_command = function (command, args, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
RedisClient.prototype.writeDefault = RedisClient.prototype.writeStrings = function (data) {
|
RedisClient.prototype.writeDefault = RedisClient.prototype.writeStrings = function (data) {
|
||||||
var command, str = '';
|
var str = '';
|
||||||
while (command = this.pipeline_queue.shift()) {
|
for (var command = this.pipeline_queue.shift(); command; command = this.pipeline_queue.shift()) {
|
||||||
|
// Write to stream if the string is bigger than 4mb. The biggest string may be Math.pow(2, 28) - 15 chars long
|
||||||
|
if (str.length + command.length > 4 * 1024 * 1024) {
|
||||||
|
this.stream.write(str);
|
||||||
|
str = '';
|
||||||
|
}
|
||||||
str += command;
|
str += command;
|
||||||
}
|
}
|
||||||
this.should_buffer = !this.stream.write(str + data);
|
this.should_buffer = !this.stream.write(str + data);
|
||||||
|
@@ -70,6 +70,28 @@ describe("The 'multi' method", function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('pipeline limit', function () {
|
||||||
|
|
||||||
|
it('do not exceed maximum string size', function (done) {
|
||||||
|
this.timeout(12000); // Windows tests on 0.10 are slow
|
||||||
|
// Triggers a RangeError: Invalid string length if not handled properly
|
||||||
|
client = redis.createClient();
|
||||||
|
var multi = client.multi();
|
||||||
|
var i = Math.pow(2, 28);
|
||||||
|
while (i > 0) {
|
||||||
|
i -= 10230;
|
||||||
|
multi.set('foo' + i, 'bar' + new Array(1024).join('1234567890'));
|
||||||
|
}
|
||||||
|
client.on('ready', function () {
|
||||||
|
multi.exec(function (err, res) {
|
||||||
|
assert.strictEqual(res.length, 26241);
|
||||||
|
});
|
||||||
|
client.flushdb(done);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
helper.allTests(function(parser, ip, args) {
|
helper.allTests(function(parser, ip, args) {
|
||||||
|
|
||||||
describe("using " + parser + " and " + ip, function () {
|
describe("using " + parser + " and " + ip, function () {
|
||||||
|
Reference in New Issue
Block a user