Skip to content

Commit 19f4cf1

Browse files
Merge branch 'main' into task/actions-log-adjustments
2 parents c64e366 + b86bb63 commit 19f4cf1

71 files changed

Lines changed: 1918 additions & 902 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

docs/settings/search-sessions-settings.asciidoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ How long {kib} stores search results from unsaved sessions,
1919
after the last search in the session completes. The default is `5m`.
2020

2121
`data.search.sessions.maxUpdateRetries` {ess-icon}::
22-
How many retries {kib} can perform while attempting to save a search session. The default is `3`.
22+
How many retries {kib} can perform while attempting to save a search session. The default is `10`.
2323

2424
`data.search.sessions.defaultExpiration` {ess-icon}::
2525
How long search session results are stored before they are deleted.

src/plugins/data/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const searchSessionsConfigSchema = schema.object({
2323
/**
2424
* maxUpdateRetries controls how many retries we perform while attempting to save a search session
2525
*/
26-
maxUpdateRetries: schema.number({ defaultValue: 3 }),
26+
maxUpdateRetries: schema.number({ defaultValue: 10 }),
2727

2828
/**
2929
* defaultExpiration controls how long search sessions are valid for, until they are expired.

src/plugins/data/server/search/collectors/search/usage.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,11 @@ export function searchUsageObserver(
8787
return {
8888
next(response: IEsSearchResponse) {
8989
if (isRestore || !isCompleteResponse(response)) return;
90-
logger.debug(`trackSearchStatus:next ${response.rawResponse.took}`);
90+
logger.debug(`trackSearchStatus:success, took:${response.rawResponse.took}`);
9191
usage?.trackSuccess(response.rawResponse.took);
9292
},
93-
error() {
94-
logger.debug(`trackSearchStatus:error`);
93+
error(e: Error) {
94+
logger.debug(`trackSearchStatus:error, ${e}`);
9595
usage?.trackError();
9696
},
9797
};

src/plugins/data/server/search/session/session_service.test.ts

Lines changed: 5 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -187,43 +187,12 @@ describe('SearchSessionService', () => {
187187
).rejects.toMatchInlineSnapshot(`[Error: locatorId is required]`);
188188
});
189189

190-
it('saving updates an existing saved object and persists it', async () => {
191-
const mockUpdateSavedObject = {
192-
...mockSavedObject,
193-
attributes: {},
194-
};
195-
savedObjectsClient.get.mockResolvedValue(mockSavedObject);
196-
savedObjectsClient.update.mockResolvedValue(mockUpdateSavedObject);
197-
198-
await service.save({ savedObjectsClient }, mockUser1, sessionId, {
199-
name: 'banana',
200-
appId: 'nanana',
201-
locatorId: 'panama',
202-
});
203-
204-
expect(savedObjectsClient.update).toHaveBeenCalled();
205-
expect(savedObjectsClient.create).not.toHaveBeenCalled();
206-
207-
const [type, id, callAttributes] = savedObjectsClient.update.mock.calls[0];
208-
expect(type).toBe(SEARCH_SESSION_TYPE);
209-
expect(id).toBe(sessionId);
210-
expect(callAttributes).not.toHaveProperty('idMapping');
211-
expect(callAttributes).toHaveProperty('name', 'banana');
212-
expect(callAttributes).toHaveProperty('appId', 'nanana');
213-
expect(callAttributes).toHaveProperty('locatorId', 'panama');
214-
expect(callAttributes).toHaveProperty('initialState', {});
215-
expect(callAttributes).toHaveProperty('restoreState', {});
216-
});
217-
218-
it('saving creates a new persisted saved object, if it did not exist', async () => {
190+
it('saving creates a new persisted saved object', async () => {
219191
const mockCreatedSavedObject = {
220192
...mockSavedObject,
221193
attributes: {},
222194
};
223195

224-
savedObjectsClient.update.mockRejectedValue(
225-
SavedObjectsErrorHelpers.createGenericNotFoundError(sessionId)
226-
);
227196
savedObjectsClient.create.mockResolvedValue(mockCreatedSavedObject);
228197

229198
await service.save({ savedObjectsClient }, mockUser1, sessionId, {
@@ -232,7 +201,7 @@ describe('SearchSessionService', () => {
232201
locatorId: 'panama',
233202
});
234203

235-
expect(savedObjectsClient.update).toHaveBeenCalledTimes(1);
204+
expect(savedObjectsClient.update).toHaveBeenCalledTimes(0);
236205
expect(savedObjectsClient.create).toHaveBeenCalledTimes(1);
237206

238207
const [type, callAttributes, options] = savedObjectsClient.create.mock.calls[0];
@@ -738,147 +707,19 @@ describe('SearchSessionService', () => {
738707
});
739708
});
740709

741-
it('retries updating the saved object if there was a ES conflict 409', async () => {
710+
it('passes retryOnConflict param to es', async () => {
742711
const searchRequest = { params: {} };
743712
const searchId = 'FnpFYlBpeXdCUTMyZXhCLTc1TWFKX0EbdDFDTzJzTE1Sck9PVTBIcW1iU05CZzo4MDA0';
744713

745-
const mockUpdateSavedObject = {
746-
...mockSavedObject,
747-
attributes: {},
748-
};
749-
750-
let counter = 0;
751-
752-
savedObjectsClient.update.mockImplementation(() => {
753-
return new Promise((resolve, reject) => {
754-
if (counter === 0) {
755-
counter++;
756-
reject(SavedObjectsErrorHelpers.createConflictError(SEARCH_SESSION_TYPE, searchId));
757-
} else {
758-
resolve(mockUpdateSavedObject);
759-
}
760-
});
761-
});
762-
763-
await service.trackId({ savedObjectsClient }, mockUser1, searchRequest, searchId, {
764-
sessionId,
765-
strategy: MOCK_STRATEGY,
766-
});
767-
768-
expect(savedObjectsClient.update).toHaveBeenCalledTimes(2);
769-
expect(savedObjectsClient.create).not.toHaveBeenCalled();
770-
});
771-
772-
it('retries updating the saved object if theres a ES conflict 409, but stops after MAX_RETRIES times', async () => {
773-
const searchRequest = { params: {} };
774-
const searchId = 'FnpFYlBpeXdCUTMyZXhCLTc1TWFKX0EbdDFDTzJzTE1Sck9PVTBIcW1iU05CZzo4MDA0';
775-
776-
savedObjectsClient.update.mockImplementation(() => {
777-
return new Promise((resolve, reject) => {
778-
reject(SavedObjectsErrorHelpers.createConflictError(SEARCH_SESSION_TYPE, searchId));
779-
});
780-
});
781-
782-
await service.trackId({ savedObjectsClient }, mockUser1, searchRequest, searchId, {
783-
sessionId,
784-
strategy: MOCK_STRATEGY,
785-
});
786-
787-
// Track ID doesn't throw errors even in cases of failure!
788-
expect(savedObjectsClient.update).toHaveBeenCalledTimes(MAX_UPDATE_RETRIES);
789-
expect(savedObjectsClient.create).not.toHaveBeenCalled();
790-
});
791-
792-
it('creates the saved object in non persisted state, if search session doesnt exists', async () => {
793-
const searchRequest = { params: {} };
794-
const requestHash = createRequestHash(searchRequest.params);
795-
const searchId = 'FnpFYlBpeXdCUTMyZXhCLTc1TWFKX0EbdDFDTzJzTE1Sck9PVTBIcW1iU05CZzo4MDA0';
796-
797-
const mockCreatedSavedObject = {
798-
...mockSavedObject,
799-
attributes: {},
800-
};
801-
802-
savedObjectsClient.update.mockRejectedValue(
803-
SavedObjectsErrorHelpers.createGenericNotFoundError(sessionId)
804-
);
805-
savedObjectsClient.create.mockResolvedValue(mockCreatedSavedObject);
806-
807714
await service.trackId({ savedObjectsClient }, mockUser1, searchRequest, searchId, {
808715
sessionId,
809716
strategy: MOCK_STRATEGY,
810717
});
811718

812719
expect(savedObjectsClient.update).toHaveBeenCalled();
813-
expect(savedObjectsClient.create).toHaveBeenCalled();
814-
815-
const [type, callAttributes, options] = savedObjectsClient.create.mock.calls[0];
816-
expect(type).toBe(SEARCH_SESSION_TYPE);
817-
expect(options).toStrictEqual({ id: sessionId });
818-
expect(callAttributes).toHaveProperty('idMapping', {
819-
[requestHash]: {
820-
id: searchId,
821-
strategy: MOCK_STRATEGY,
822-
},
823-
});
824-
expect(callAttributes).toHaveProperty('expires');
825-
expect(callAttributes).toHaveProperty('created');
826-
expect(callAttributes).toHaveProperty('sessionId', sessionId);
827-
});
828-
829-
it('retries updating if update returned 404 and then update returned conflict 409 (first create race condition)', async () => {
830-
const searchRequest = { params: {} };
831-
const searchId = 'FnpFYlBpeXdCUTMyZXhCLTc1TWFKX0EbdDFDTzJzTE1Sck9PVTBIcW1iU05CZzo4MDA0';
832-
833-
const mockUpdateSavedObject = {
834-
...mockSavedObject,
835-
attributes: {},
836-
};
837-
838-
let counter = 0;
839-
840-
savedObjectsClient.update.mockImplementation(() => {
841-
return new Promise((resolve, reject) => {
842-
if (counter === 0) {
843-
counter++;
844-
reject(SavedObjectsErrorHelpers.createGenericNotFoundError(sessionId));
845-
} else {
846-
resolve(mockUpdateSavedObject);
847-
}
848-
});
849-
});
850-
851-
savedObjectsClient.create.mockRejectedValue(
852-
SavedObjectsErrorHelpers.createConflictError(SEARCH_SESSION_TYPE, searchId)
853-
);
854-
855-
await service.trackId({ savedObjectsClient }, mockUser1, searchRequest, searchId, {
856-
sessionId,
857-
strategy: MOCK_STRATEGY,
858-
});
859-
860-
expect(savedObjectsClient.update).toHaveBeenCalledTimes(2);
861-
expect(savedObjectsClient.create).toHaveBeenCalledTimes(1);
862-
});
863-
864-
it('retries everything at most MAX_RETRIES times', async () => {
865-
const searchRequest = { params: {} };
866-
const searchId = 'FnpFYlBpeXdCUTMyZXhCLTc1TWFKX0EbdDFDTzJzTE1Sck9PVTBIcW1iU05CZzo4MDA0';
867-
868-
savedObjectsClient.update.mockRejectedValue(
869-
SavedObjectsErrorHelpers.createGenericNotFoundError(sessionId)
870-
);
871-
savedObjectsClient.create.mockRejectedValue(
872-
SavedObjectsErrorHelpers.createConflictError(SEARCH_SESSION_TYPE, searchId)
873-
);
874-
875-
await service.trackId({ savedObjectsClient }, mockUser1, searchRequest, searchId, {
876-
sessionId,
877-
strategy: MOCK_STRATEGY,
878-
});
879720

880-
expect(savedObjectsClient.update).toHaveBeenCalledTimes(MAX_UPDATE_RETRIES);
881-
expect(savedObjectsClient.create).toHaveBeenCalledTimes(MAX_UPDATE_RETRIES);
721+
const [, , , opts] = savedObjectsClient.update.mock.calls[0];
722+
expect(opts).toHaveProperty('retryOnConflict', MAX_UPDATE_RETRIES);
882723
});
883724

884725
it('batches updates for the same session', async () => {

0 commit comments

Comments
 (0)