[migration] Retry attempts for ES service unavailable (#25255) (#25338)

Resolves a race condition where ES is technically up, but the Kibana
index is not.

Closes #25027

Signed-off-by: Tyler Smalley <tyler.smalley@elastic.co>
This commit is contained in:
Tyler Smalley 2018-11-07 16:15:06 -08:00 committed by GitHub
parent a988f198ae
commit 3e74a2c80b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -150,39 +150,51 @@ export async function write(callCluster: CallCluster, index: string, docs: RawDo
export async function migrationsUpToDate(
callCluster: CallCluster,
index: string,
migrationVersion: MigrationVersion
migrationVersion: MigrationVersion,
retryCount: number = 10
): Promise<boolean> {
const indexInfo = await fetchInfo(callCluster, index);
try {
const indexInfo = await fetchInfo(callCluster, index);
if (!_.get(indexInfo, 'mappings.doc.properties.migrationVersion')) {
return false;
}
if (!_.get(indexInfo, 'mappings.doc.properties.migrationVersion')) {
return false;
}
// If no migrations are actually defined, we're up to date!
if (Object.keys(migrationVersion).length <= 0) {
return true;
}
// If no migrations are actually defined, we're up to date!
if (Object.keys(migrationVersion).length <= 0) {
return true;
}
const { count } = await callCluster('count', {
body: {
query: {
bool: {
should: Object.entries(migrationVersion).map(([type, latestVersion]) => ({
bool: {
must: [
{ exists: { field: type } },
{ bool: { must_not: { term: { [`migrationVersion.${type}`]: latestVersion } } } },
],
},
})),
const { count } = await callCluster('count', {
body: {
query: {
bool: {
should: Object.entries(migrationVersion).map(([type, latestVersion]) => ({
bool: {
must: [
{ exists: { field: type } },
{ bool: { must_not: { term: { [`migrationVersion.${type}`]: latestVersion } } } },
],
},
})),
},
},
},
},
index,
type: ROOT_TYPE,
});
index,
type: ROOT_TYPE,
});
return count === 0;
return count === 0;
} catch (e) {
// retry for Service Unavailable
if (e.status !== 503 || retryCount === 0) {
throw e;
}
await new Promise(r => setTimeout(r, 1000));
return await migrationsUpToDate(callCluster, index, migrationVersion, retryCount - 1);
}
}
/**