Skip to content

Commit 2bd2529

Browse files
committed
fixup! fixup! fix(cache): update cache with O(1) data structures
1 parent 1e6db4e commit 2bd2529

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
@@ -105,6 +105,13 @@ export class ListWatch<T extends KubernetesObject> implements ObjectCache<T>, In
105105
}
106106

107107
public list(namespace?: string | undefined): ReadonlyArray<T> {
108+
if (!namespace) {
109+
const allObjects: T[] = [];
110+
for (const nsObjects of this.objects.values()) {
111+
allObjects.push(...nsObjects.values());
112+
}
113+
return allObjects;
114+
}
108115
const namespaceObjects = this.objects.get(namespace || '');
109116
if (!namespaceObjects) {
110117
return [];
@@ -227,28 +234,30 @@ export function deleteItems<T extends KubernetesObject>(
227234
newObjects: T[],
228235
deleteCallback?: Array<ObjectCallback<T>>,
229236
): CacheMap<T> {
230-
const objects = cacheMapFromList(newObjects);
231-
232-
if (!deleteCallback) {
233-
return objects;
234-
}
237+
const newObjectsMap = cacheMapFromList(newObjects);
235238

236239
for (const [namespace, oldNamespaceObjects] of oldObjects.entries()) {
237-
const newNamespaceObjects = objects.get(namespace);
240+
const newNamespaceObjects = newObjectsMap.get(namespace);
238241
if (newNamespaceObjects) {
239242
for (const [name, oldObj] of oldNamespaceObjects.entries()) {
240-
if (newNamespaceObjects.has(name)) {
241-
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(oldObj));
243+
if (!newNamespaceObjects.has(name)) {
244+
oldNamespaceObjects.delete(name);
245+
if (deleteCallback) {
246+
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(oldObj));
247+
}
242248
}
243249
}
244250
} else {
251+
oldObjects.delete(namespace);
245252
oldNamespaceObjects.forEach((obj: T) => {
246-
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(obj));
253+
if (deleteCallback) {
254+
deleteCallback.forEach((fn: ObjectCallback<T>) => fn(obj));
255+
}
247256
});
248257
}
249258
}
250259

251-
return objects;
260+
return oldObjects;
252261
}
253262

254263
// 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)