Skip to content

Commit 5751435

Browse files
committed
fixup! fixup! fix(cache): update cache with O(1) data structures
1 parent f924184 commit 5751435

File tree

2 files changed

+30
-21
lines changed

2 files changed

+30
-21
lines changed

src/cache.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,13 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
104104
}
105105

106106
public list(namespace?: string | undefined): ReadonlyArray<T> {
107+
if (!namespace) {
108+
const allObjects: T[] = [];
109+
for (const nsObjects of this.objects.values()) {
110+
allObjects.push(...nsObjects.values());
111+
}
112+
return allObjects;
113+
}
107114
const namespaceObjects = this.objects.get(namespace || '');
108115
if (!namespaceObjects) {
109116
return [];
@@ -218,28 +225,30 @@ export function deleteItems<T extends KubernetesObject>(
218225
newObjects: T[],
219226
deleteCallback?: Array<ObjectCallback<T>>,
220227
): CacheMap<T> {
221-
const objects = cacheMapFromList(newObjects);
222-
223-
if (!deleteCallback) {
224-
return objects;
225-
}
228+
const newObjectsMap = cacheMapFromList(newObjects);
226229

227230
for (const [namespace, oldNamespaceObjects] of oldObjects.entries()) {
228-
const newNamespaceObjects = objects.get(namespace);
231+
const newNamespaceObjects = newObjectsMap.get(namespace);
229232
if (newNamespaceObjects) {
230233
for (const [name, oldObj] of oldNamespaceObjects.entries()) {
231-
if (newNamespaceObjects.has(name)) {
232-
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(oldObj));
234+
if (!newNamespaceObjects.has(name)) {
235+
oldNamespaceObjects.delete(name);
236+
if (deleteCallback) {
237+
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(oldObj));
238+
}
233239
}
234240
}
235241
} else {
242+
oldObjects.delete(namespace);
236243
oldNamespaceObjects.forEach((obj: T) => {
237-
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(obj));
244+
if (deleteCallback) {
245+
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(obj));
246+
}
238247
});
239248
}
240249
}
241250

242-
return objects;
251+
return oldObjects;
243252
}
244253

245254
// Only public for testing.

src/cache_test.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ describe('ListWatchCache', () => {
116116
],
117117
} as V1NamespaceList;
118118

119-
var calls = 0;
119+
let calls = 0;
120120
const listFn: ListPromise<V1Namespace> = function(): Promise<{
121121
response: http.IncomingMessage;
122122
body: V1NamespaceList;
@@ -144,11 +144,11 @@ describe('ListWatchCache', () => {
144144
expect(pathOut).to.equal('/some/path');
145145
expect(cache.list()).to.deep.equal(list);
146146

147-
expect(cache.get('name1')).to.equal(list[0]);
148-
expect(cache.get('name2')).to.equal(list[1]);
147+
expect(cache.get('name1', 'default')).to.equal(list[0]);
148+
expect(cache.get('name2', 'default')).to.equal(list[1]);
149149

150150
expect(cache.list('default')).to.deep.equal(list);
151-
expect(cache.list('non-existent')).to.be.undefined;
151+
expect(cache.list('non-existent')).to.deep.equal([]);
152152

153153
watchHandler('ADDED', {
154154
metadata: {
@@ -158,11 +158,11 @@ describe('ListWatchCache', () => {
158158
} as V1Namespace);
159159

160160
expect(cache.list().length).to.equal(3);
161-
expect(cache.get('name3')).to.not.equal(null);
161+
expect(cache.get('name3', 'default')).to.not.equal(null);
162162

163163
expect(cache.list('default').length).to.equal(2);
164164
expect(cache.list('other').length).to.equal(1);
165-
expect(cache.list('non-existent')).to.be.undefined;
165+
expect(cache.list('non-existent')).to.deep.equal([]);
166166

167167
watchHandler('MODIFIED', {
168168
metadata: {
@@ -172,7 +172,7 @@ describe('ListWatchCache', () => {
172172
} as V1ObjectMeta,
173173
} as V1Namespace);
174174
expect(cache.list().length).to.equal(3);
175-
const obj3 = cache.get('name3');
175+
const obj3 = cache.get('name3', 'other');
176176
expect(obj3).to.not.equal(null);
177177
if (obj3) {
178178
expect(obj3.metadata!.name).to.equal('name3');
@@ -186,7 +186,7 @@ describe('ListWatchCache', () => {
186186
} as V1ObjectMeta,
187187
} as V1Namespace);
188188
expect(cache.list().length).to.equal(2);
189-
expect(cache.get('name2')).to.equal(undefined);
189+
expect(cache.get('name2', 'default')).to.equal(undefined);
190190

191191
expect(cache.list('default').length).to.equal(1);
192192
expect(cache.list('other').length).to.equal(1);
@@ -203,7 +203,7 @@ describe('ListWatchCache', () => {
203203
await doneHandler(error);
204204
expect(cache.list().length, 'all namespace list').to.equal(1);
205205
expect(cache.list('default').length, 'default namespace list').to.equal(1);
206-
expect(cache.list('other'), 'other namespace list').to.be.undefined;
206+
expect(cache.list('other'), 'other namespace list').to.deep.equal([]);
207207
});
208208

209209
it('should perform work as an informer', async () => {
@@ -635,8 +635,8 @@ describe('ListWatchCache', () => {
635635
expect(pathOut).to.equal('/some/path');
636636
expect(cache.list()).to.deep.equal(list);
637637

638-
expect(cache.get('name1')).to.equal(list[0]);
639-
expect(cache.get('name2')).to.equal(list[1]);
638+
expect(cache.get('name1', 'ns1')).to.equal(list[0]);
639+
expect(cache.get('name2', 'ns2')).to.equal(list[1]);
640640

641641
expect(cache.list('ns1').length).to.equal(1);
642642
expect(cache.list('ns1')[0].metadata!.name).to.equal('name1');

0 commit comments

Comments
 (0)