Skip to content

Commit eee05fe

Browse files
committed
improved trim of old revisions
1 parent be6d96b commit eee05fe

File tree

3 files changed

+87
-27
lines changed

3 files changed

+87
-27
lines changed

lib/redis.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,9 @@ module.exports = CoreObject.extend({
6262
},
6363

6464
fetchRevisions: function(keyPrefix) {
65-
var currentKey = keyPrefix + ':current';
66-
6765
return Promise.hash({
6866
revisions: this._listRevisions(keyPrefix),
69-
current: this._client.get(currentKey)
67+
current: this._activeRevision(keyPrefix)
7068
}).then(function(results) {
7169
return results.revisions.map(function(revision) {
7270
return {
@@ -106,7 +104,7 @@ module.exports = CoreObject.extend({
106104
})
107105
.then(function() {
108106
return client.set(redisKey, value);
109-
})
107+
});
110108
},
111109

112110
_updateRecentUploadsList: function(keyPrefix, revisionKey) {
@@ -115,8 +113,29 @@ module.exports = CoreObject.extend({
115113
return client.zadd(keyPrefix, score, revisionKey);
116114
},
117115

116+
_activeRevision: function(keyPrefix) {
117+
var currentKey = keyPrefix + ':current';
118+
return this._client.get(currentKey);
119+
},
120+
118121
_trimRecentUploadsList: function(keyPrefix, maxEntries) {
119122
var client = this._client;
120-
return client.zremrangebyrank(keyPrefix, 0, -(maxEntries + 1));
123+
124+
return Promise.hash({
125+
revisionsToBeRemoved: client.zrange(keyPrefix, 0, -(maxEntries + 1)),
126+
current: this._activeRevision(keyPrefix)
127+
}).then(function(results) {
128+
var revisions = results.revisionsToBeRemoved;
129+
var current = results.current;
130+
if (!revisions) {
131+
return;
132+
}
133+
revisions.forEach(function(revision) {
134+
if (revision !== current) {
135+
client.del(keyPrefix + ":" + revision);
136+
client.zrem(keyPrefix, revision);
137+
}
138+
});
139+
});
121140
}
122141
});

tests/helpers/fake-redis-client.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ module.exports = CoreObject.extend({
88
return Promise.resolve('some-other-value');
99
},
1010
set: function() { },
11-
lpush: function() { },
12-
ltrim: function() { }
11+
del: function() { },
12+
zadd: function(key, score, tag) {
13+
},
14+
zrem: function() {
15+
},
16+
zrange: function() {
17+
},
18+
zrevrange: function() {
19+
}
1320
});

tests/unit/lib/redis-nodetest.js

Lines changed: 54 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,6 @@ describe('redis', function() {
3232
},
3333
set: function(key, value) {
3434
fileUploaded = true;
35-
},
36-
zadd: function(key, score, tag) {
37-
},
38-
zremrangebyrank: function() {
3935
}
4036
})));
4137

@@ -54,10 +50,6 @@ describe('redis', function() {
5450
}, new FakeRedis(FakeClient.extend({
5551
set: function(key, value) {
5652
fileUploaded = true;
57-
},
58-
zadd: function(key, score, tag) {
59-
},
60-
zremrangebyrank: function() {
6153
}
6254
})));
6355

@@ -77,8 +69,6 @@ describe('redis', function() {
7769
},
7870
zadd: function(key, score , tag) {
7971
recentUploads.push(key + tag);
80-
},
81-
zremrangebyrank: function() {
8272
}
8373
})));
8474

@@ -90,25 +80,71 @@ describe('redis', function() {
9080
});
9181
});
9282

93-
it('trims the list of recent uploads', function() {
94-
var recentUploads = ['a', 'b', 'c'];
83+
it('trims the list of recent uploads and removes the index key', function() {
84+
var recentUploads = ['1','2','3','4','5','6','7','8','9','10','11'];
85+
var finalUploads = ['3','4','5','6','7','8','9','10','11','12'];
9586

9687
var redis = new Redis({}, new FakeRedis(FakeClient.extend({
9788
get: function(key) {
9889
return Promise.resolve(null);
9990
},
100-
zadd: function(key, tag) {
101-
recentUploads.push(key + tag);
91+
set: function(key, value) {
92+
},
93+
zadd: function(key, score, revisionKey) {
94+
recentUploads.push(revisionKey);
10295
},
103-
zremrangebyrank: function() {
104-
recentUploads.pop();
96+
zrem: function(val,revision) {
97+
var i = recentUploads.indexOf(revision)
98+
recentUploads.splice(i,1);
99+
},
100+
zrange: function() {
101+
return recentUploads.slice(0,2);
102+
},
103+
del: function(key) {
104+
assert(key === 'key:1' || key === 'key:2');
105105
}
106106
})));
107107

108-
var promise = redis.upload('key', 'value');
108+
var promise = redis.upload('key', '12', 'value');
109+
return assert.isFulfilled(promise)
110+
.then(function() {
111+
assert.equal(recentUploads.length, 10);
112+
assert.deepEqual(recentUploads, finalUploads);
113+
});
114+
});
115+
116+
it('trims the list of recent uploads but leaves the active one', function() {
117+
var recentUploads = ['1','2','3','4','5','6','7','8','9','10','11'];
118+
var finalUploads = ['1','3','4','5','6','7','8','9','10','11','12'];
119+
120+
var redis = new Redis({}, new FakeRedis(FakeClient.extend({
121+
get: function(key) {
122+
if (key == 'key:current') {
123+
return Promise.resolve('1');
124+
}
125+
return Promise.resolve(null);
126+
},
127+
set: function(key, value) {
128+
},
129+
zadd: function(key, score, revisionKey) {
130+
recentUploads.push(revisionKey);
131+
},
132+
zrem: function(val,revision) {
133+
var i = recentUploads.indexOf(revision)
134+
recentUploads.splice(i,1);
135+
},
136+
zrange: function() {
137+
return recentUploads.slice(0,2);
138+
},
139+
del: function(key) {
140+
}
141+
})));
142+
143+
var promise = redis.upload('key', '12', 'value');
109144
return assert.isFulfilled(promise)
110145
.then(function() {
111-
assert.equal(recentUploads.length, 3);
146+
assert.equal(recentUploads.length, 11);
147+
assert.deepEqual(recentUploads, finalUploads);
112148
});
113149
});
114150

@@ -196,8 +232,6 @@ describe('redis', function() {
196232
var redis = new Redis({}, new FakeRedis(FakeClient.extend({
197233
zrevrange: function() {
198234
return recentRevisions;
199-
},
200-
get: function() {
201235
}
202236
})));
203237

0 commit comments

Comments
 (0)