From 110d2d0e9e8568c346f705be3e8cd9ef6630f4ee Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Fri, 4 Dec 2020 09:48:56 -0500 Subject: [PATCH] store more than largest kube api request amount in the event store (#1605) * store more than largest kube api request amount in the event store * not abstract, give default Signed-off-by: Sebastian Malton --- .../components/+events/event.store.ts | 1 + src/renderer/kube-object.store.ts | 29 ++++++++++--------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/renderer/components/+events/event.store.ts b/src/renderer/components/+events/event.store.ts index 39d4d5df83..3651ce1549 100644 --- a/src/renderer/components/+events/event.store.ts +++ b/src/renderer/components/+events/event.store.ts @@ -12,6 +12,7 @@ import { apiManager } from "../../api/api-manager"; export class EventStore extends KubeObjectStore { api = eventApi; limit = 1000; + saveLimit = 50000; protected bindWatchEventsUpdater() { return super.bindWatchEventsUpdater(5000); diff --git a/src/renderer/kube-object.store.ts b/src/renderer/kube-object.store.ts index ca146a0e30..03e582905e 100644 --- a/src/renderer/kube-object.store.ts +++ b/src/renderer/kube-object.store.ts @@ -11,7 +11,8 @@ import { getHostedCluster } from "../common/cluster-store"; @autobind() export abstract class KubeObjectStore extends ItemStore { abstract api: KubeApi; - public limit: number; + public readonly limit?: number; + public readonly bufferSize: number = 50000; constructor() { super(); @@ -19,6 +20,16 @@ export abstract class KubeObjectStore extends ItemSt kubeWatchApi.addListener(this, this.onWatchApiEvent); } + get query(): IKubeApiQueryParams { + const { limit } = this; + + if (!limit) { + return {}; + } + + return { limit }; + } + getStatuses?(items: T[]): Record; getAllByNs(namespace: string | string[], strict = false): T[] { @@ -62,10 +73,7 @@ export abstract class KubeObjectStore extends ItemSt protected async loadItems(allowedNamespaces?: string[]): Promise { if (!this.api.isNamespaced || !allowedNamespaces) { - const { limit } = this; - const query: IKubeApiQueryParams = limit ? { limit } : {}; - - return this.api.list({}, query); + return this.api.list({}, this.query); } else { return Promise .all(allowedNamespaces.map(namespace => this.api.list({ namespace }))) @@ -179,9 +187,9 @@ export abstract class KubeObjectStore extends ItemSt return; } // create latest non-observable copy of items to apply updates in one action (==single render) - let items = this.items.toJS(); + const items = this.items.toJS(); - this.eventsBuffer.clear().forEach(({ type, object }) => { + for (const {type, object} of this.eventsBuffer.clear()) { const { uid, selfLink } = object.metadata; const index = items.findIndex(item => item.getId() === uid); const item = items[index]; @@ -204,14 +212,9 @@ export abstract class KubeObjectStore extends ItemSt } break; } - }); - - // slice to max allowed items - if (this.limit && items.length > this.limit) { - items = items.slice(-this.limit); } // update items - this.items.replace(this.sortItems(items)); + this.items.replace(this.sortItems(items.slice(-this.bufferSize))); } }