fix "end" emitting before last "data" resulting in missing a few keys occasionally (races)

indiachan-spamvector
Thomas Lynch 2 years ago
parent 6ecb519f77
commit 3038e6c279
  1. 41
      redis.js

@ -101,29 +101,26 @@ module.exports = {
const stream = sharedClient.scanStream({
match: pattern
});
const dataMap = {};
stream.on('data', async (keys) => {
if (keys.length > 0) {
stream.pause(); //dont want end() called during this, its async
const pipeline = sharedClient.pipeline();
for (let i = 0; i < keys.length; i++) {
pipeline.get(keys[i]);
}
let results;
try {
results = await pipeline.exec();
} catch (e) {
stream.destroy();
reject(e);
}
for (let i = 0; i < results.length; i++) {
dataMap[keys[i]] = JSON.parse(results[i][1]);
}
stream.resume();
}
let allKeys = [];
stream.on('data', (keys) => {
allKeys = allKeys.concat(keys);
});
stream.on('end', () => {
resolve(dataMap);
stream.on('end', async () => {
const pipeline = sharedClient.pipeline();
for (let i = 0; i < allKeys.length; i++) {
pipeline.get(allKeys[i]);
}
let results;
try {
results = await pipeline.exec();
} catch(e) {
reject(e);
}
const data = {};
for (let i = 0; i < results.length; i++) {
data[allKeys[i]] = JSON.parse(results[i][1]);
}
resolve(data);
});
stream.on('error', (err) => {
reject(err);

Loading…
Cancel
Save