Search: fix cache in the frontend search engine (#55681)

pull/55696/head
Artur Wierzbicki 3 years ago committed by GitHub
parent 2fadeeff4c
commit af9e58eeeb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 32
      public/app/features/search/service/frontend.ts

@ -4,7 +4,7 @@ import { TermCount } from 'app/core/components/TagFilter/TagFilter';
import { DashboardQueryResult, GrafanaSearcher, QueryResponse, SearchQuery } from '.'; import { DashboardQueryResult, GrafanaSearcher, QueryResponse, SearchQuery } from '.';
export class FrontendSearcher implements GrafanaSearcher { export class FrontendSearcher implements GrafanaSearcher {
readonly cache = new Map<string, FullResultCache>(); readonly cache = new Map<string, Promise<FullResultCache>>();
constructor(private parent: GrafanaSearcher) {} constructor(private parent: GrafanaSearcher) {}
@ -29,20 +29,28 @@ export class FrontendSearcher implements GrafanaSearcher {
} }
async getCache(kind?: string[]): Promise<FullResultCache> { async getCache(kind?: string[]): Promise<FullResultCache> {
const key = kind ? kind.join(',') : '*'; const key = kind ? kind.sort().join(',') : '*';
let res = this.cache.get(key);
if (res) { const cacheHit = this.cache.get(key);
return Promise.resolve(res); if (cacheHit) {
try {
return await cacheHit;
} catch (e) {
// delete the cache key so that the next request will retry
this.cache.delete(key);
return new FullResultCache(new DataFrameView({ name: 'error', fields: [], length: 0 }));
}
} }
const v = await this.parent.search({ const resultPromise = this.parent
kind, // match the request .search({
limit: 5000, // max for now kind, // match the request
}); limit: 5000, // max for now
})
.then((res) => new FullResultCache(res.view));
res = new FullResultCache(v.view); this.cache.set(key, resultPromise);
this.cache.set(key, res); return resultPromise;
return res;
} }
async starred(query: SearchQuery): Promise<QueryResponse> { async starred(query: SearchQuery): Promise<QueryResponse> {

Loading…
Cancel
Save