Skip to content

Commit 9531931

Browse files
[Data plugin] Wrong caching for Index pattern fields (#87116)
* [Data plugin] Wrong caching for Index pattern fields Closes: #84666 * remove can update index_pattern fields test * fix tests Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> # Conflicts: # src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts
1 parent cf65d47 commit 9531931

5 files changed

Lines changed: 117 additions & 202 deletions

File tree

  • src/plugins/data/common/index_patterns/index_patterns
  • test/api_integration/apis/index_patterns

src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ import { IndexPatternMissingIndices } from '../lib';
4747
import { findByTitle } from '../utils';
4848
import { DuplicateIndexPatternError } from '../errors';
4949

50-
const indexPatternCache = createIndexPatternCache();
5150
const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3;
5251
const savedObjectType = 'index-pattern';
5352

@@ -75,6 +74,7 @@ export class IndexPatternsService {
7574
private onNotification: OnNotification;
7675
private onError: OnError;
7776
private onUnsupportedTimePattern: OnUnsupportedTimePattern;
77+
private indexPatternCache: ReturnType<typeof createIndexPatternCache>;
7878
ensureDefaultIndexPattern: EnsureDefaultIndexPattern;
7979

8080
constructor({
@@ -98,6 +98,8 @@ export class IndexPatternsService {
9898
uiSettings,
9999
onRedirectNoIndexPattern
100100
);
101+
102+
this.indexPatternCache = createIndexPatternCache();
101103
}
102104

103105
/**
@@ -180,9 +182,9 @@ export class IndexPatternsService {
180182
clearCache = (id?: string) => {
181183
this.savedObjectsCache = null;
182184
if (id) {
183-
indexPatternCache.clear(id);
185+
this.indexPatternCache.clear(id);
184186
} else {
185-
indexPatternCache.clearAll();
187+
this.indexPatternCache.clearAll();
186188
}
187189
};
188190

@@ -468,11 +470,12 @@ export class IndexPatternsService {
468470

469471
get = async (id: string): Promise<IndexPattern> => {
470472
const indexPatternPromise =
471-
indexPatternCache.get(id) || indexPatternCache.set(id, this.getSavedObjectAndInit(id));
473+
this.indexPatternCache.get(id) ||
474+
this.indexPatternCache.set(id, this.getSavedObjectAndInit(id));
472475

473476
// don't cache failed requests
474477
indexPatternPromise.catch(() => {
475-
indexPatternCache.clear(id);
478+
this.indexPatternCache.clear(id);
476479
});
477480

478481
return indexPatternPromise;
@@ -536,7 +539,7 @@ export class IndexPatternsService {
536539
id: indexPattern.id,
537540
});
538541
indexPattern.id = response.id;
539-
indexPatternCache.set(indexPattern.id, Promise.resolve(indexPattern));
542+
this.indexPatternCache.set(indexPattern.id, Promise.resolve(indexPattern));
540543
return indexPattern;
541544
}
542545

@@ -619,7 +622,7 @@ export class IndexPatternsService {
619622
indexPattern.version = samePattern.version;
620623

621624
// Clear cache
622-
indexPatternCache.clear(indexPattern.id!);
625+
this.indexPatternCache.clear(indexPattern.id!);
623626

624627
// Try the save again
625628
return this.updateSavedObject(indexPattern, saveAttempts, ignoreErrors);
@@ -633,7 +636,7 @@ export class IndexPatternsService {
633636
* @param indexPatternId: Id of kibana Index Pattern to delete
634637
*/
635638
async delete(indexPatternId: string) {
636-
indexPatternCache.clear(indexPatternId);
639+
this.indexPatternCache.clear(indexPatternId);
637640
return this.savedObjectsClient.delete('index-pattern', indexPatternId);
638641
}
639642
}

test/api_integration/apis/index_patterns/fields_api/update_fields/main.ts

Lines changed: 34 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,32 @@ import { FtrProviderContext } from '../../../../ftr_provider_context';
2222

2323
export default function ({ getService }: FtrProviderContext) {
2424
const supertest = getService('supertest');
25+
const esArchiver = getService('esArchiver');
2526

2627
describe('main', () => {
28+
const basicIndex = 'ba*ic_index';
29+
let indexPattern: any;
30+
31+
before(async () => {
32+
await esArchiver.load('index_patterns/basic_index');
33+
34+
indexPattern = (
35+
await supertest.post('/api/index_patterns/index_pattern').send({
36+
index_pattern: {
37+
title: basicIndex,
38+
},
39+
})
40+
).body.index_pattern;
41+
});
42+
43+
after(async () => {
44+
await esArchiver.unload('index_patterns/basic_index');
45+
46+
if (indexPattern) {
47+
await supertest.delete('/api/index_patterns/index_pattern/' + indexPattern.id);
48+
}
49+
});
50+
2751
it('can update multiple fields', async () => {
2852
const title = `foo-${Date.now()}-${Math.random()}*`;
2953
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({
@@ -171,48 +195,6 @@ export default function ({ getService }: FtrProviderContext) {
171195
expect(response3.status).to.be(200);
172196
expect(response3.body.index_pattern.fieldAttrs.foo.count).to.be(undefined);
173197
});
174-
175-
it('can set field "count" attribute on an existing field', async () => {
176-
const title = `foo-${Date.now()}-${Math.random()}*`;
177-
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({
178-
index_pattern: {
179-
title,
180-
fields: {
181-
foo: {
182-
name: 'foo',
183-
type: 'string',
184-
count: 123,
185-
},
186-
},
187-
},
188-
});
189-
190-
expect(response1.status).to.be(200);
191-
expect(response1.body.index_pattern.fieldAttrs.foo).to.be(undefined);
192-
expect(response1.body.index_pattern.fields.foo.count).to.be(123);
193-
194-
const response2 = await supertest
195-
.post(`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}/fields`)
196-
.send({
197-
fields: {
198-
foo: {
199-
count: 456,
200-
},
201-
},
202-
});
203-
204-
expect(response2.status).to.be(200);
205-
expect(response2.body.index_pattern.fieldAttrs.foo).to.be(undefined);
206-
expect(response2.body.index_pattern.fields.foo.count).to.be(456);
207-
208-
const response3 = await supertest.get(
209-
`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}`
210-
);
211-
212-
expect(response3.status).to.be(200);
213-
expect(response3.body.index_pattern.fieldAttrs.foo).to.be(undefined);
214-
expect(response3.body.index_pattern.fields.foo.count).to.be(456);
215-
});
216198
});
217199

218200
describe('customLabel', () => {
@@ -323,46 +305,20 @@ export default function ({ getService }: FtrProviderContext) {
323305
});
324306

325307
it('can set field "customLabel" attribute on an existing field', async () => {
326-
const title = `foo-${Date.now()}-${Math.random()}*`;
327-
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({
328-
index_pattern: {
329-
title,
330-
fields: {
331-
foo: {
332-
name: 'foo',
333-
type: 'string',
334-
count: 123,
335-
customLabel: 'foo',
336-
},
308+
await supertest.post(`/api/index_patterns/index_pattern/${indexPattern.id}/fields`).send({
309+
fields: {
310+
foo: {
311+
customLabel: 'baz',
337312
},
338313
},
339314
});
340315

341-
expect(response1.status).to.be(200);
342-
expect(response1.body.index_pattern.fieldAttrs.foo).to.be(undefined);
343-
expect(response1.body.index_pattern.fields.foo.customLabel).to.be('foo');
344-
345-
const response2 = await supertest
346-
.post(`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}/fields`)
347-
.send({
348-
fields: {
349-
foo: {
350-
customLabel: 'baz',
351-
},
352-
},
353-
});
354-
355-
expect(response2.status).to.be(200);
356-
expect(response2.body.index_pattern.fieldAttrs.foo).to.be(undefined);
357-
expect(response2.body.index_pattern.fields.foo.customLabel).to.be('baz');
358-
359-
const response3 = await supertest.get(
360-
`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}`
316+
const response1 = await supertest.get(
317+
`/api/index_patterns/index_pattern/${indexPattern.id}`
361318
);
362319

363-
expect(response3.status).to.be(200);
364-
expect(response3.body.index_pattern.fieldAttrs.foo).to.be(undefined);
365-
expect(response3.body.index_pattern.fields.foo.customLabel).to.be('baz');
320+
expect(response1.status).to.be(200);
321+
expect(response1.body.index_pattern.fields.foo.customLabel).to.be('baz');
366322
});
367323
});
368324

@@ -463,31 +419,8 @@ export default function ({ getService }: FtrProviderContext) {
463419
});
464420

465421
it('can remove "format" attribute from index_pattern format map', async () => {
466-
const title = `foo-${Date.now()}-${Math.random()}*`;
467-
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({
468-
index_pattern: {
469-
title,
470-
fieldFormats: {
471-
foo: {
472-
id: 'bar',
473-
params: {
474-
baz: 'qux',
475-
},
476-
},
477-
},
478-
},
479-
});
480-
481-
expect(response1.status).to.be(200);
482-
expect(response1.body.index_pattern.fieldFormats.foo).to.eql({
483-
id: 'bar',
484-
params: {
485-
baz: 'qux',
486-
},
487-
});
488-
489422
const response2 = await supertest
490-
.post(`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}/fields`)
423+
.post(`/api/index_patterns/index_pattern/${indexPattern.id}/fields`)
491424
.send({
492425
fields: {
493426
foo: {
@@ -500,7 +433,7 @@ export default function ({ getService }: FtrProviderContext) {
500433
expect(response2.body.index_pattern.fieldFormats.foo).to.be(undefined);
501434

502435
const response3 = await supertest.get(
503-
`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}`
436+
`/api/index_patterns/index_pattern/${indexPattern.id}`
504437
);
505438

506439
expect(response3.status).to.be(200);

test/api_integration/apis/index_patterns/index_pattern_crud/update_index_pattern/main.ts

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -262,44 +262,6 @@ export default function ({ getService }: FtrProviderContext) {
262262
expect(response3.body.index_pattern.typeMeta).to.eql({ foo: 'baz' });
263263
});
264264

265-
it('can update index_pattern fields', async () => {
266-
const title = `foo-${Date.now()}-${Math.random()}*`;
267-
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({
268-
index_pattern: {
269-
title,
270-
fields: {
271-
foo: {
272-
name: 'foo',
273-
type: 'string',
274-
},
275-
},
276-
},
277-
});
278-
279-
expect(response1.body.index_pattern.fields.foo.name).to.be('foo');
280-
expect(response1.body.index_pattern.fields.foo.type).to.be('string');
281-
282-
const id = response1.body.index_pattern.id;
283-
const response2 = await supertest.post('/api/index_patterns/index_pattern/' + id).send({
284-
index_pattern: {
285-
fields: {
286-
bar: {
287-
name: 'bar',
288-
type: 'number',
289-
},
290-
},
291-
},
292-
});
293-
294-
expect(response2.body.index_pattern.fields.bar.name).to.be('bar');
295-
expect(response2.body.index_pattern.fields.bar.type).to.be('number');
296-
297-
const response3 = await supertest.get('/api/index_patterns/index_pattern/' + id);
298-
299-
expect(response3.body.index_pattern.fields.bar.name).to.be('bar');
300-
expect(response3.body.index_pattern.fields.bar.type).to.be('number');
301-
});
302-
303265
it('can update multiple index pattern fields at once', async () => {
304266
const title = `foo-${Date.now()}-${Math.random()}*`;
305267
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({

test/api_integration/apis/index_patterns/scripted_fields_crud/delete_scripted_field/errors.ts

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,33 @@ import expect from '@kbn/expect';
2121
import { FtrProviderContext } from '../../../../ftr_provider_context';
2222

2323
export default function ({ getService }: FtrProviderContext) {
24+
const esArchiver = getService('esArchiver');
2425
const supertest = getService('supertest');
2526

2627
describe('errors', () => {
28+
const basicIndex = 'b*sic_index';
29+
let indexPattern: any;
30+
31+
before(async () => {
32+
await esArchiver.load('index_patterns/basic_index');
33+
34+
indexPattern = (
35+
await supertest.post('/api/index_patterns/index_pattern').send({
36+
index_pattern: {
37+
title: basicIndex,
38+
},
39+
})
40+
).body.index_pattern;
41+
});
42+
43+
after(async () => {
44+
await esArchiver.unload('index_patterns/basic_index');
45+
46+
if (indexPattern) {
47+
await supertest.delete('/api/index_patterns/index_pattern/' + indexPattern.id);
48+
}
49+
});
50+
2751
it('returns 404 error on non-existing index_pattern', async () => {
2852
const id = `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx-${Date.now()}`;
2953
const response = await supertest.delete(
@@ -34,35 +58,16 @@ export default function ({ getService }: FtrProviderContext) {
3458
});
3559

3660
it('returns 404 error on non-existing scripted field', async () => {
37-
const title = `foo-${Date.now()}-${Math.random()}*`;
38-
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({
39-
index_pattern: {
40-
title,
41-
},
42-
});
43-
const response2 = await supertest.delete(
44-
`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}/scripted_field/foo`
61+
const response1 = await supertest.delete(
62+
`/api/index_patterns/index_pattern/${indexPattern.id}/scripted_field/test`
4563
);
4664

47-
expect(response2.status).to.be(404);
65+
expect(response1.status).to.be(404);
4866
});
4967

5068
it('returns error when attempting to delete a field which is not a scripted field', async () => {
51-
const title = `foo-${Date.now()}-${Math.random()}*`;
52-
const response1 = await supertest.post('/api/index_patterns/index_pattern').send({
53-
index_pattern: {
54-
title,
55-
fields: {
56-
foo: {
57-
scripted: false,
58-
name: 'foo',
59-
type: 'string',
60-
},
61-
},
62-
},
63-
});
6469
const response2 = await supertest.delete(
65-
`/api/index_patterns/index_pattern/${response1.body.index_pattern.id}/scripted_field/foo`
70+
`/api/index_patterns/index_pattern/${indexPattern.id}/scripted_field/foo`
6671
);
6772

6873
expect(response2.status).to.be(400);

0 commit comments

Comments
 (0)