From 24286bb7e3efe6b44bfd95b69eb4dacbd55ad4cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Wed, 23 Sep 2020 14:19:35 +0200 Subject: [PATCH 1/5] Ignore canceled promises --- .../logs/log_analysis/log_analysis_capabilities.tsx | 3 ++- .../logs/log_analysis/log_analysis_setup_state.ts | 3 ++- .../infra/public/containers/logs/log_flyout.tsx | 3 ++- .../logs/log_highlights/log_entry_highlights.tsx | 3 ++- .../logs/log_highlights/log_summary_highlights.ts | 3 ++- .../public/containers/logs/log_source/log_source.ts | 9 +++++++-- .../infra/public/containers/logs/log_stream/index.ts | 3 ++- .../plugins/infra/public/containers/source/source.tsx | 5 ++++- .../use_log_entry_category_examples.tsx | 3 ++- .../public/pages/logs/log_entry_rate/page_content.tsx | 6 +++++- .../log_entry_rate/use_log_entry_anomalies_results.ts | 7 ++++++- .../logs/log_entry_rate/use_log_entry_examples.ts | 3 ++- .../plugins/infra/public/utils/use_tracked_promise.ts | 11 +++++++++++ 13 files changed, 49 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx index 74b316f78259f..ccb8a602941ae 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx @@ -6,7 +6,7 @@ import createContainer from 'constate'; import { useMemo, useState, useEffect } from 'react'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { getMlCapabilitiesResponsePayloadRT, GetMlCapabilitiesResponsePayload, @@ -31,6 +31,7 @@ export const useLogAnalysisCapabilities = () => { onResolve: (response) => { setMlCapabilities(response); }, + onReject: ignoreCanceledPromise, }, [] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts index 750a7104a3a98..53a2f4a226268 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts @@ -19,7 +19,7 @@ import { ValidationUIError, } from '../../../components/logging/log_analysis_setup/initial_configuration_step'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { ModuleDescriptor, ModuleSourceConfiguration } from './log_analysis_module_types'; type SetupHandler = ( @@ -193,6 +193,7 @@ export const useAnalysisSetupState = ({ onResolve: ({ data: { datasets } }) => { updateIndicesWithAvailableDatasets(datasets); }, + onReject: ignoreCanceledPromise, }, [validIndexNames, sourceConfiguration.timestampField, startTime, endTime] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx b/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx index 9ed2f5ad175c7..7344c1515095b 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx @@ -11,7 +11,7 @@ import React, { useContext, useEffect, useMemo, useState } from 'react'; import { LogEntriesItem } from '../../../common/http_api'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import { UrlStateContainer } from '../../utils/url_state'; -import { useTrackedPromise } from '../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../utils/use_tracked_promise'; import { fetchLogEntriesItem } from './log_entries/api/fetch_log_entries_item'; import { useLogSourceContext } from './log_source'; @@ -49,6 +49,7 @@ export const useLogFlyout = () => { setFlyoutItem(data || null); } }, + onReject: ignoreCanceledPromise, }, [sourceId, flyoutId] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx index b4edebe8f8207..166837091b1dc 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx @@ -7,7 +7,7 @@ import { useEffect, useMemo, useState } from 'react'; import { TimeKey } from '../../../../common/time'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { fetchLogEntriesHighlights } from './api/fetch_log_entries_highlights'; import { LogEntry, LogEntriesHighlightsResponse } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; @@ -50,6 +50,7 @@ export const useLogEntryHighlights = ( onResolve: (response) => { setLogEntryHighlights(response.data); }, + onReject: ignoreCanceledPromise, }, [sourceId, startTimestamp, endTimestamp, centerPoint, size, filterQuery, highlightTerms] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts index 14366891dbf59..efc04c839876a 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts @@ -7,7 +7,7 @@ import { useEffect, useMemo, useState } from 'react'; import { debounce } from 'lodash'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { fetchLogSummaryHighlights } from './api/fetch_log_summary_highlights'; import { LogEntriesSummaryHighlightsResponse } from '../../../../common/http_api'; import { useBucketSize } from '../log_summary/bucket_size'; @@ -51,6 +51,7 @@ export const useLogSummaryHighlights = ( onResolve: (response) => { setLogSummaryHighlights(response.data); }, + onReject: ignoreCanceledPromise, }, [sourceId, startTimestamp, endTimestamp, bucketSize, filterQuery, highlightTerms] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts b/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts index e2dd4c523c03f..2a6bf830b6c90 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts @@ -14,7 +14,7 @@ import { LogSourceConfigurationPropertiesPatch, LogSourceStatus, } from '../../../../common/http_api/log_sources'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { callFetchLogSourceConfigurationAPI } from './api/fetch_log_source_configuration'; import { callFetchLogSourceStatusAPI } from './api/fetch_log_source_status'; import { callPatchLogSourceConfigurationAPI } from './api/patch_log_source_configuration'; @@ -47,6 +47,7 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt setSourceConfiguration(data); }, + onReject: ignoreCanceledPromise, }, [sourceId, fetch] ); @@ -65,6 +66,7 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt setSourceConfiguration(data); loadSourceStatus(); }, + onReject: ignoreCanceledPromise, }, [sourceId, fetch] ); @@ -82,6 +84,7 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt setSourceStatus(data); }, + onReject: ignoreCanceledPromise, }, [sourceId, fetch] ); @@ -139,7 +142,9 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt ); const loadSource = useCallback(() => { - return Promise.all([loadSourceConfiguration(), loadSourceStatus()]); + return Promise.all([loadSourceConfiguration(), loadSourceStatus()]).catch( + ignoreCanceledPromise + ); }, [loadSourceConfiguration, loadSourceStatus]); const initialize = useCallback(async () => { diff --git a/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts b/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts index 4a6da6063e960..7f1a941eaca92 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts @@ -7,7 +7,7 @@ import { useState, useMemo } from 'react'; import { esKuery } from '../../../../../../../src/plugins/data/public'; import { fetchLogEntries } from '../log_entries/api/fetch_log_entries'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { LogEntry, LogEntriesCursor } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; @@ -63,6 +63,7 @@ export function useLogStream({ onResolve: ({ data }) => { setEntries(data.entries); }, + onReject: ignoreCanceledPromise, }, [sourceId, startTimestamp, endTimestamp, query] ); diff --git a/x-pack/plugins/infra/public/containers/source/source.tsx b/x-pack/plugins/infra/public/containers/source/source.tsx index 96bbd858c3a4b..afcc82d0cad31 100644 --- a/x-pack/plugins/infra/public/containers/source/source.tsx +++ b/x-pack/plugins/infra/public/containers/source/source.tsx @@ -14,7 +14,7 @@ import { UpdateSourceMutation, } from '../../graphql/types'; import { DependencyError, useApolloClient } from '../../utils/apollo_context'; -import { useTrackedPromise } from '../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../utils/use_tracked_promise'; import { createSourceMutation } from './create_source.gql_query'; import { sourceQuery } from './query_source.gql_query'; import { updateSourceMutation } from './update_source.gql_query'; @@ -57,6 +57,7 @@ export const useSource = ({ sourceId }: { sourceId: string }) => { onResolve: (response) => { setSource(response.data.source); }, + onReject: ignoreCanceledPromise, }, [apolloClient, sourceId] ); @@ -87,6 +88,7 @@ export const useSource = ({ sourceId }: { sourceId: string }) => { setSource(response.data.createSource.source); } }, + onReject: ignoreCanceledPromise, }, [apolloClient, sourceId] ); @@ -117,6 +119,7 @@ export const useSource = ({ sourceId }: { sourceId: string }) => { setSource(response.data.updateSource.source); } }, + onReject: ignoreCanceledPromise, }, [apolloClient, sourceId] ); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx index 84b9f045288cc..dbe0bc31c04f9 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx @@ -8,7 +8,7 @@ import { useMemo, useState } from 'react'; import { LogEntryCategoryExample } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { callGetLogEntryCategoryExamplesAPI } from './service_calls/get_log_entry_category_examples'; export const useLogEntryCategoryExamples = ({ @@ -48,6 +48,7 @@ export const useLogEntryCategoryExamples = ({ onResolve: ({ data: { examples } }) => { setLogEntryCategoryExamples(examples); }, + onReject: ignoreCanceledPromise, }, [categoryId, endTime, exampleCount, sourceId, startTime] ); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx index d8edcd87eb2a0..344cd0bd315ef 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx @@ -27,6 +27,7 @@ import { useLogSourceContext } from '../../../containers/logs/log_source'; import { LogEntryRateResultsContent } from './page_results_content'; import { LogEntryRateSetupContent } from './page_setup_content'; import { useInterval } from '../../../hooks/use_interval'; +import { ignoreCanceledPromise } from '../../../utils/use_tracked_promise'; const JOB_STATUS_POLLING_INTERVAL = 30000; @@ -61,7 +62,10 @@ export const LogEntryRatePageContent = memo(() => { const { showModuleList } = useLogAnalysisSetupFlyoutStateContext(); const fetchAllJobStatuses = useCallback( - () => Promise.all([fetchLogEntryCategoriesJobStatus(), fetchLogEntryRateJobStatus()]), + () => + Promise.all([fetchLogEntryCategoriesJobStatus(), fetchLogEntryRateJobStatus()]).catch( + ignoreCanceledPromise + ), [fetchLogEntryCategoriesJobStatus, fetchLogEntryRateJobStatus] ); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts index 37c99272f0872..a6fdd634dcc00 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts @@ -6,7 +6,11 @@ import { useMemo, useState, useCallback, useEffect, useReducer } from 'react'; import { useMount } from 'react-use'; -import { useTrackedPromise, CanceledPromiseError } from '../../../utils/use_tracked_promise'; +import { + useTrackedPromise, + CanceledPromiseError, + ignoreCanceledPromise, +} from '../../../utils/use_tracked_promise'; import { callGetLogEntryAnomaliesAPI } from './service_calls/get_log_entry_anomalies'; import { callGetLogEntryAnomaliesDatasetsAPI } from './service_calls/get_log_entry_anomalies_datasets'; import { @@ -212,6 +216,7 @@ export const useLogEntryAnomaliesResults = ({ } setLogEntryAnomalies(anomalies); }, + onReject: ignoreCanceledPromise, }, [ sourceId, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts index e809ab9cd5a6f..36ca0cecbf3b0 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts @@ -8,7 +8,7 @@ import { useMemo, useState } from 'react'; import { LogEntryExample } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; -import { useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; import { callGetLogEntryExamplesAPI } from './service_calls/get_log_entry_examples'; export const useLogEntryExamples = ({ @@ -48,6 +48,7 @@ export const useLogEntryExamples = ({ onResolve: ({ data: { examples } }) => { setLogEntryExamples(examples); }, + onReject: ignoreCanceledPromise, }, [dataset, endTime, exampleCount, sourceId, startTime] ); diff --git a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts index 9951b62fa64a3..a08b6f4f387bc 100644 --- a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts +++ b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts @@ -259,4 +259,15 @@ export class CanceledPromiseError extends Error { export class SilentCanceledPromiseError extends CanceledPromiseError {} +// Ideally we want `error: Error`, but a promise might be rejected with anything. +export function ignoreCanceledPromise(error: unknown) { + if (error instanceof CanceledPromiseError) { + return; + } + if (error instanceof Error) { + throw error; + } + return error; +} + const noOp = () => undefined; From b36f7f02f9a075b3858bb6004d2d00ef3ba2a311 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Thu, 24 Sep 2020 11:12:59 +0200 Subject: [PATCH 2/5] Avoid setting log entries state if parent component is unmounted --- .../containers/logs/log_entries/index.ts | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/infra/public/containers/logs/log_entries/index.ts b/x-pack/plugins/infra/public/containers/logs/log_entries/index.ts index 4c8c610794b2e..214bb16b24283 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_entries/index.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_entries/index.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { useEffect, useState, useReducer, useCallback } from 'react'; +import { useMountedState } from 'react-use'; import createContainer from 'constate'; import { pick, throttle } from 'lodash'; import { TimeKey, timeKeyIsBetween } from '../../../../common/time'; @@ -146,15 +147,20 @@ const useFetchEntriesEffect = ( props: LogEntriesProps ) => { const { services } = useKibanaContextForPlugin(); + const isMounted = useMountedState(); const [prevParams, cachePrevParams] = useState(); const [startedStreaming, setStartedStreaming] = useState(false); + const dispatchIfMounted = useCallback((action) => (isMounted() ? dispatch(action) : undefined), [ + dispatch, + isMounted, + ]); const runFetchNewEntriesRequest = async (overrides: Partial = {}) => { if (!props.startTimestamp || !props.endTimestamp) { return; } - dispatch({ type: Action.FetchingNewEntries }); + dispatchIfMounted({ type: Action.FetchingNewEntries }); try { const commonFetchArgs: LogEntriesBaseRequest = { @@ -175,13 +181,15 @@ const useFetchEntriesEffect = ( }; const { data: payload } = await fetchLogEntries(fetchArgs, services.http.fetch); - dispatch({ type: Action.ReceiveNewEntries, payload }); + dispatchIfMounted({ type: Action.ReceiveNewEntries, payload }); // Move position to the bottom if it's the first load. // Do it in the next tick to allow the `dispatch` to fire if (!props.timeKey && payload.bottomCursor) { setTimeout(() => { - props.jumpToTargetPosition(payload.bottomCursor!); + if (isMounted()) { + props.jumpToTargetPosition(payload.bottomCursor!); + } }); } else if ( props.timeKey && @@ -192,7 +200,7 @@ const useFetchEntriesEffect = ( props.jumpToTargetPosition(payload.topCursor); } } catch (e) { - dispatch({ type: Action.ErrorOnNewEntries }); + dispatchIfMounted({ type: Action.ErrorOnNewEntries }); } }; @@ -210,7 +218,7 @@ const useFetchEntriesEffect = ( return; } - dispatch({ type: Action.FetchingMoreEntries }); + dispatchIfMounted({ type: Action.FetchingMoreEntries }); try { const commonFetchArgs: LogEntriesBaseRequest = { @@ -232,14 +240,14 @@ const useFetchEntriesEffect = ( const { data: payload } = await fetchLogEntries(fetchArgs, services.http.fetch); - dispatch({ + dispatchIfMounted({ type: getEntriesBefore ? Action.ReceiveEntriesBefore : Action.ReceiveEntriesAfter, payload, }); return payload.bottomCursor; } catch (e) { - dispatch({ type: Action.ErrorOnMoreEntries }); + dispatchIfMounted({ type: Action.ErrorOnMoreEntries }); } }; @@ -322,7 +330,7 @@ const useFetchEntriesEffect = ( after: props.endTimestamp > prevParams.endTimestamp, }; - dispatch({ type: Action.ExpandRange, payload: shouldExpand }); + dispatchIfMounted({ type: Action.ExpandRange, payload: shouldExpand }); }; const expandRangeEffectDependencies = [ From f3098a5f1a8ae367b2734eff32ebe00aaa14c560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Thu, 24 Sep 2020 13:37:44 +0200 Subject: [PATCH 3/5] Avoid setting log module state if parent components are not mounted --- .../logs/log_analysis/log_analysis_module.tsx | 20 ++++++++++++------- .../log_analysis_module_definition.tsx | 10 ++++++++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx index 27ef0039ae49f..5d816951baa23 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx @@ -5,6 +5,7 @@ */ import { useCallback, useMemo } from 'react'; +import { useMountedState } from 'react-use'; import { DatasetFilter } from '../../../../common/log_analysis'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; @@ -19,6 +20,7 @@ export const useLogAnalysisModule = ({ moduleDescriptor: ModuleDescriptor; }) => { const { services } = useKibanaContextForPlugin(); + const isMounted = useMountedState(); const { spaceId, sourceId, timestampField } = sourceConfiguration; const [moduleStatus, dispatchModuleStatus] = useModuleStatus(moduleDescriptor.jobTypes); @@ -30,15 +32,19 @@ export const useLogAnalysisModule = ({ return await moduleDescriptor.getJobSummary(spaceId, sourceId, services.http.fetch); }, onResolve: (jobResponse) => { - dispatchModuleStatus({ - type: 'fetchedJobStatuses', - payload: jobResponse, - spaceId, - sourceId, - }); + if (isMounted()) { + dispatchModuleStatus({ + type: 'fetchedJobStatuses', + payload: jobResponse, + spaceId, + sourceId, + }); + } }, onReject: () => { - dispatchModuleStatus({ type: 'failedFetchingJobStatuses' }); + if (isMounted()) { + dispatchModuleStatus({ type: 'failedFetchingJobStatuses' }); + } }, }, [spaceId, sourceId] diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx index 7a5c1d354dc34..b1d0f56e7ff7a 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx @@ -5,6 +5,7 @@ */ import { useCallback, useMemo, useState } from 'react'; +import { useMountedState } from 'react-use'; import { getJobId } from '../../../../common/log_analysis'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; @@ -20,6 +21,7 @@ export const useLogAnalysisModuleDefinition = ({ moduleDescriptor: ModuleDescriptor; }) => { const { services } = useKibanaContextForPlugin(); + const isMounted = useMountedState(); const [moduleDefinition, setModuleDefinition] = useState< GetMlModuleResponsePayload | undefined >(); @@ -45,10 +47,14 @@ export const useLogAnalysisModuleDefinition = ({ return await moduleDescriptor.getModuleDefinition(services.http.fetch); }, onResolve: (response) => { - setModuleDefinition(response); + if (isMounted()) { + setModuleDefinition(response); + } }, onReject: () => { - setModuleDefinition(undefined); + if (isMounted()) { + setModuleDefinition(undefined); + } }, }, [moduleDescriptor.getModuleDefinition, spaceId, sourceId] From 544e1dc8066f2707e32d6e952343017b790ae5b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Mon, 19 Oct 2020 15:24:43 +0200 Subject: [PATCH 4/5] Add flag to `useTrackedPromise` The new flag will determine if the callbacks will trigger or the errors will throw if the component using the hook is not mounted. By default they will only trigger if it is. --- .../infra/public/utils/use_tracked_promise.ts | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts index a08b6f4f387bc..f4be02f43e7ae 100644 --- a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts +++ b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts @@ -6,13 +6,15 @@ /* eslint-disable max-classes-per-file */ -import { DependencyList, useEffect, useMemo, useRef, useState } from 'react'; +import { DependencyList, useEffect, useMemo, useRef, useState, useCallback } from 'react'; +import { useMountedState } from 'react-use'; interface UseTrackedPromiseArgs { createPromise: (...args: Arguments) => Promise; onResolve?: (result: Result) => void; onReject?: (value: unknown) => void; cancelPreviousOn?: 'creation' | 'settlement' | 'resolution' | 'rejection' | 'never'; + triggerOrThrow?: 'always' | 'whenMounted'; } /** @@ -64,6 +66,16 @@ interface UseTrackedPromiseArgs { * The last argument is a normal React hook dependency list that indicates * under which conditions a new reference to the configuration object should be * used. + * + * The `onResolve`, `onReject` and possible uncatched errors are only triggered + * if the underlying component is mounted. To ensure they always trigger (i.e. + * if the promise is called in a `useLayoutEffect`) use the `triggerOrThrow` + * attribute: + * + * 'whenMounted': (default) they are called only if the component is mounted. + * + * 'always': they always call. The consumer is then responsible of ensuring no + * side effects happen if the underlying component is not mounted. */ export const useTrackedPromise = ( { @@ -71,9 +83,20 @@ export const useTrackedPromise = ( onResolve = noOp, onReject = noOp, cancelPreviousOn = 'never', + triggerOrThrow = 'whenMounted', }: UseTrackedPromiseArgs, dependencies: DependencyList ) => { + const isComponentMounted = useMountedState(); + const shouldTriggerOrThrow = useCallback(() => { + switch (triggerOrThrow) { + case 'always': + return true; + case 'whenMounted': + return isComponentMounted(); + } + }, [isComponentMounted, triggerOrThrow]); + /** * If a promise is currently pending, this holds a reference to it and its * cancellation function. @@ -144,7 +167,7 @@ export const useTrackedPromise = ( (pendingPromise) => pendingPromise.promise !== newPendingPromise.promise ); - if (onResolve) { + if (onResolve && shouldTriggerOrThrow()) { onResolve(value); } @@ -173,11 +196,13 @@ export const useTrackedPromise = ( (pendingPromise) => pendingPromise.promise !== newPendingPromise.promise ); - if (onReject) { - onReject(value); - } + if (shouldTriggerOrThrow()) { + if (onReject) { + onReject(value); + } - throw value; + throw value; + } } ), }; From fb579e956252d0971653825ba6a2066ddd83273e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20G=C3=B3mez?= Date: Mon, 19 Oct 2020 15:30:12 +0200 Subject: [PATCH 5/5] Revert "Avoid setting log module state if parent components are not mounted" This reverts commits: - f3098a5f1a8ae367b2734eff32ebe00aaa14c560. - 24286bb7e3efe6b44bfd95b69eb4dacbd55ad4cb. --- .../log_analysis_capabilities.tsx | 3 +-- .../logs/log_analysis/log_analysis_module.tsx | 20 +++++++------------ .../log_analysis_module_definition.tsx | 10 ++-------- .../log_analysis/log_analysis_setup_state.ts | 3 +-- .../public/containers/logs/log_flyout.tsx | 3 +-- .../log_highlights/log_entry_highlights.tsx | 3 +-- .../log_highlights/log_summary_highlights.ts | 3 +-- .../containers/logs/log_source/log_source.ts | 9 ++------- .../containers/logs/log_stream/index.ts | 3 +-- .../infra/public/containers/source/source.tsx | 5 +---- .../use_log_entry_category_examples.tsx | 3 +-- .../logs/log_entry_rate/page_content.tsx | 6 +----- .../use_log_entry_anomalies_results.ts | 7 +------ .../log_entry_rate/use_log_entry_examples.ts | 3 +-- .../infra/public/utils/use_tracked_promise.ts | 11 ---------- 15 files changed, 22 insertions(+), 70 deletions(-) diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx index ccb8a602941ae..74b316f78259f 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx @@ -6,7 +6,7 @@ import createContainer from 'constate'; import { useMemo, useState, useEffect } from 'react'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { getMlCapabilitiesResponsePayloadRT, GetMlCapabilitiesResponsePayload, @@ -31,7 +31,6 @@ export const useLogAnalysisCapabilities = () => { onResolve: (response) => { setMlCapabilities(response); }, - onReject: ignoreCanceledPromise, }, [] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx index 5d816951baa23..27ef0039ae49f 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx @@ -5,7 +5,6 @@ */ import { useCallback, useMemo } from 'react'; -import { useMountedState } from 'react-use'; import { DatasetFilter } from '../../../../common/log_analysis'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; @@ -20,7 +19,6 @@ export const useLogAnalysisModule = ({ moduleDescriptor: ModuleDescriptor; }) => { const { services } = useKibanaContextForPlugin(); - const isMounted = useMountedState(); const { spaceId, sourceId, timestampField } = sourceConfiguration; const [moduleStatus, dispatchModuleStatus] = useModuleStatus(moduleDescriptor.jobTypes); @@ -32,19 +30,15 @@ export const useLogAnalysisModule = ({ return await moduleDescriptor.getJobSummary(spaceId, sourceId, services.http.fetch); }, onResolve: (jobResponse) => { - if (isMounted()) { - dispatchModuleStatus({ - type: 'fetchedJobStatuses', - payload: jobResponse, - spaceId, - sourceId, - }); - } + dispatchModuleStatus({ + type: 'fetchedJobStatuses', + payload: jobResponse, + spaceId, + sourceId, + }); }, onReject: () => { - if (isMounted()) { - dispatchModuleStatus({ type: 'failedFetchingJobStatuses' }); - } + dispatchModuleStatus({ type: 'failedFetchingJobStatuses' }); }, }, [spaceId, sourceId] diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx index b1d0f56e7ff7a..7a5c1d354dc34 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_definition.tsx @@ -5,7 +5,6 @@ */ import { useCallback, useMemo, useState } from 'react'; -import { useMountedState } from 'react-use'; import { getJobId } from '../../../../common/log_analysis'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; import { useTrackedPromise } from '../../../utils/use_tracked_promise'; @@ -21,7 +20,6 @@ export const useLogAnalysisModuleDefinition = ({ moduleDescriptor: ModuleDescriptor; }) => { const { services } = useKibanaContextForPlugin(); - const isMounted = useMountedState(); const [moduleDefinition, setModuleDefinition] = useState< GetMlModuleResponsePayload | undefined >(); @@ -47,14 +45,10 @@ export const useLogAnalysisModuleDefinition = ({ return await moduleDescriptor.getModuleDefinition(services.http.fetch); }, onResolve: (response) => { - if (isMounted()) { - setModuleDefinition(response); - } + setModuleDefinition(response); }, onReject: () => { - if (isMounted()) { - setModuleDefinition(undefined); - } + setModuleDefinition(undefined); }, }, [moduleDescriptor.getModuleDefinition, spaceId, sourceId] diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts index 53a2f4a226268..750a7104a3a98 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_setup_state.ts @@ -19,7 +19,7 @@ import { ValidationUIError, } from '../../../components/logging/log_analysis_setup/initial_configuration_step'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { ModuleDescriptor, ModuleSourceConfiguration } from './log_analysis_module_types'; type SetupHandler = ( @@ -193,7 +193,6 @@ export const useAnalysisSetupState = ({ onResolve: ({ data: { datasets } }) => { updateIndicesWithAvailableDatasets(datasets); }, - onReject: ignoreCanceledPromise, }, [validIndexNames, sourceConfiguration.timestampField, startTime, endTime] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx b/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx index 7344c1515095b..9ed2f5ad175c7 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_flyout.tsx @@ -11,7 +11,7 @@ import React, { useContext, useEffect, useMemo, useState } from 'react'; import { LogEntriesItem } from '../../../common/http_api'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; import { UrlStateContainer } from '../../utils/url_state'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../utils/use_tracked_promise'; import { fetchLogEntriesItem } from './log_entries/api/fetch_log_entries_item'; import { useLogSourceContext } from './log_source'; @@ -49,7 +49,6 @@ export const useLogFlyout = () => { setFlyoutItem(data || null); } }, - onReject: ignoreCanceledPromise, }, [sourceId, flyoutId] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx index 166837091b1dc..b4edebe8f8207 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_entry_highlights.tsx @@ -7,7 +7,7 @@ import { useEffect, useMemo, useState } from 'react'; import { TimeKey } from '../../../../common/time'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { fetchLogEntriesHighlights } from './api/fetch_log_entries_highlights'; import { LogEntry, LogEntriesHighlightsResponse } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; @@ -50,7 +50,6 @@ export const useLogEntryHighlights = ( onResolve: (response) => { setLogEntryHighlights(response.data); }, - onReject: ignoreCanceledPromise, }, [sourceId, startTimestamp, endTimestamp, centerPoint, size, filterQuery, highlightTerms] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts index efc04c839876a..14366891dbf59 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts @@ -7,7 +7,7 @@ import { useEffect, useMemo, useState } from 'react'; import { debounce } from 'lodash'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { fetchLogSummaryHighlights } from './api/fetch_log_summary_highlights'; import { LogEntriesSummaryHighlightsResponse } from '../../../../common/http_api'; import { useBucketSize } from '../log_summary/bucket_size'; @@ -51,7 +51,6 @@ export const useLogSummaryHighlights = ( onResolve: (response) => { setLogSummaryHighlights(response.data); }, - onReject: ignoreCanceledPromise, }, [sourceId, startTimestamp, endTimestamp, bucketSize, filterQuery, highlightTerms] ); diff --git a/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts b/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts index 2a6bf830b6c90..e2dd4c523c03f 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_source/log_source.ts @@ -14,7 +14,7 @@ import { LogSourceConfigurationPropertiesPatch, LogSourceStatus, } from '../../../../common/http_api/log_sources'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { callFetchLogSourceConfigurationAPI } from './api/fetch_log_source_configuration'; import { callFetchLogSourceStatusAPI } from './api/fetch_log_source_status'; import { callPatchLogSourceConfigurationAPI } from './api/patch_log_source_configuration'; @@ -47,7 +47,6 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt setSourceConfiguration(data); }, - onReject: ignoreCanceledPromise, }, [sourceId, fetch] ); @@ -66,7 +65,6 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt setSourceConfiguration(data); loadSourceStatus(); }, - onReject: ignoreCanceledPromise, }, [sourceId, fetch] ); @@ -84,7 +82,6 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt setSourceStatus(data); }, - onReject: ignoreCanceledPromise, }, [sourceId, fetch] ); @@ -142,9 +139,7 @@ export const useLogSource = ({ sourceId, fetch }: { sourceId: string; fetch: Htt ); const loadSource = useCallback(() => { - return Promise.all([loadSourceConfiguration(), loadSourceStatus()]).catch( - ignoreCanceledPromise - ); + return Promise.all([loadSourceConfiguration(), loadSourceStatus()]); }, [loadSourceConfiguration, loadSourceStatus]); const initialize = useCallback(async () => { diff --git a/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts b/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts index 7f1a941eaca92..4a6da6063e960 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_stream/index.ts @@ -7,7 +7,7 @@ import { useState, useMemo } from 'react'; import { esKuery } from '../../../../../../../src/plugins/data/public'; import { fetchLogEntries } from '../log_entries/api/fetch_log_entries'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { LogEntry, LogEntriesCursor } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; @@ -63,7 +63,6 @@ export function useLogStream({ onResolve: ({ data }) => { setEntries(data.entries); }, - onReject: ignoreCanceledPromise, }, [sourceId, startTimestamp, endTimestamp, query] ); diff --git a/x-pack/plugins/infra/public/containers/source/source.tsx b/x-pack/plugins/infra/public/containers/source/source.tsx index afcc82d0cad31..96bbd858c3a4b 100644 --- a/x-pack/plugins/infra/public/containers/source/source.tsx +++ b/x-pack/plugins/infra/public/containers/source/source.tsx @@ -14,7 +14,7 @@ import { UpdateSourceMutation, } from '../../graphql/types'; import { DependencyError, useApolloClient } from '../../utils/apollo_context'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../utils/use_tracked_promise'; import { createSourceMutation } from './create_source.gql_query'; import { sourceQuery } from './query_source.gql_query'; import { updateSourceMutation } from './update_source.gql_query'; @@ -57,7 +57,6 @@ export const useSource = ({ sourceId }: { sourceId: string }) => { onResolve: (response) => { setSource(response.data.source); }, - onReject: ignoreCanceledPromise, }, [apolloClient, sourceId] ); @@ -88,7 +87,6 @@ export const useSource = ({ sourceId }: { sourceId: string }) => { setSource(response.data.createSource.source); } }, - onReject: ignoreCanceledPromise, }, [apolloClient, sourceId] ); @@ -119,7 +117,6 @@ export const useSource = ({ sourceId }: { sourceId: string }) => { setSource(response.data.updateSource.source); } }, - onReject: ignoreCanceledPromise, }, [apolloClient, sourceId] ); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx index dbe0bc31c04f9..84b9f045288cc 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_category_examples.tsx @@ -8,7 +8,7 @@ import { useMemo, useState } from 'react'; import { LogEntryCategoryExample } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { callGetLogEntryCategoryExamplesAPI } from './service_calls/get_log_entry_category_examples'; export const useLogEntryCategoryExamples = ({ @@ -48,7 +48,6 @@ export const useLogEntryCategoryExamples = ({ onResolve: ({ data: { examples } }) => { setLogEntryCategoryExamples(examples); }, - onReject: ignoreCanceledPromise, }, [categoryId, endTime, exampleCount, sourceId, startTime] ); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx index 344cd0bd315ef..d8edcd87eb2a0 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_content.tsx @@ -27,7 +27,6 @@ import { useLogSourceContext } from '../../../containers/logs/log_source'; import { LogEntryRateResultsContent } from './page_results_content'; import { LogEntryRateSetupContent } from './page_setup_content'; import { useInterval } from '../../../hooks/use_interval'; -import { ignoreCanceledPromise } from '../../../utils/use_tracked_promise'; const JOB_STATUS_POLLING_INTERVAL = 30000; @@ -62,10 +61,7 @@ export const LogEntryRatePageContent = memo(() => { const { showModuleList } = useLogAnalysisSetupFlyoutStateContext(); const fetchAllJobStatuses = useCallback( - () => - Promise.all([fetchLogEntryCategoriesJobStatus(), fetchLogEntryRateJobStatus()]).catch( - ignoreCanceledPromise - ), + () => Promise.all([fetchLogEntryCategoriesJobStatus(), fetchLogEntryRateJobStatus()]), [fetchLogEntryCategoriesJobStatus, fetchLogEntryRateJobStatus] ); diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts index a6fdd634dcc00..37c99272f0872 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts @@ -6,11 +6,7 @@ import { useMemo, useState, useCallback, useEffect, useReducer } from 'react'; import { useMount } from 'react-use'; -import { - useTrackedPromise, - CanceledPromiseError, - ignoreCanceledPromise, -} from '../../../utils/use_tracked_promise'; +import { useTrackedPromise, CanceledPromiseError } from '../../../utils/use_tracked_promise'; import { callGetLogEntryAnomaliesAPI } from './service_calls/get_log_entry_anomalies'; import { callGetLogEntryAnomaliesDatasetsAPI } from './service_calls/get_log_entry_anomalies_datasets'; import { @@ -216,7 +212,6 @@ export const useLogEntryAnomaliesResults = ({ } setLogEntryAnomalies(anomalies); }, - onReject: ignoreCanceledPromise, }, [ sourceId, diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts index 36ca0cecbf3b0..e809ab9cd5a6f 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts @@ -8,7 +8,7 @@ import { useMemo, useState } from 'react'; import { LogEntryExample } from '../../../../common/http_api'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; -import { ignoreCanceledPromise, useTrackedPromise } from '../../../utils/use_tracked_promise'; +import { useTrackedPromise } from '../../../utils/use_tracked_promise'; import { callGetLogEntryExamplesAPI } from './service_calls/get_log_entry_examples'; export const useLogEntryExamples = ({ @@ -48,7 +48,6 @@ export const useLogEntryExamples = ({ onResolve: ({ data: { examples } }) => { setLogEntryExamples(examples); }, - onReject: ignoreCanceledPromise, }, [dataset, endTime, exampleCount, sourceId, startTime] ); diff --git a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts index f4be02f43e7ae..42518127f68bf 100644 --- a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts +++ b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts @@ -284,15 +284,4 @@ export class CanceledPromiseError extends Error { export class SilentCanceledPromiseError extends CanceledPromiseError {} -// Ideally we want `error: Error`, but a promise might be rejected with anything. -export function ignoreCanceledPromise(error: unknown) { - if (error instanceof CanceledPromiseError) { - return; - } - if (error instanceof Error) { - throw error; - } - return error; -} - const noOp = () => undefined;