From a72eb40e9665ddaf70e21eb6e719e76db26d80bd Mon Sep 17 00:00:00 2001 From: Vadim Ogievetsky Date: Wed, 7 Dec 2022 12:03:48 -0800 Subject: [PATCH 1/3] improve compaction status display --- .../compaction-config/compaction-config.tsx | 14 +++++++++----- .../compaction-status.spec.ts | 19 +++++++++++++++++++ .../compaction-status/compaction-status.ts | 16 ++++++++++++++-- .../datasources-view/datasources-view.tsx | 2 +- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/web-console/src/druid-models/compaction-config/compaction-config.tsx b/web-console/src/druid-models/compaction-config/compaction-config.tsx index 1958f2b263e3..0fa0c528f403 100644 --- a/web-console/src/druid-models/compaction-config/compaction-config.tsx +++ b/web-console/src/druid-models/compaction-config/compaction-config.tsx @@ -22,7 +22,11 @@ import React from 'react'; import { Field } from '../../components'; import { deepGet, deepSet, oneOf } from '../../utils'; -export type CompactionConfig = Record; +export interface CompactionConfig { + skipOffsetFromLatest?: string; + tuningConfig?: any; + [key: string]: any; +} export const COMPACTION_CONFIG_FIELDS: Field[] = [ { @@ -182,7 +186,7 @@ export const COMPACTION_CONFIG_FIELDS: Field[] = [ defined: t => oneOf(deepGet(t, 'tuningConfig.partitionsSpec.type'), 'single_dim', 'range') && !deepGet(t, 'tuningConfig.partitionsSpec.maxRowsPerSegment'), - required: (t: CompactionConfig) => + required: t => !deepGet(t, 'tuningConfig.partitionsSpec.targetRowsPerSegment') && !deepGet(t, 'tuningConfig.partitionsSpec.maxRowsPerSegment'), info: ( @@ -205,7 +209,7 @@ export const COMPACTION_CONFIG_FIELDS: Field[] = [ defined: t => oneOf(deepGet(t, 'tuningConfig.partitionsSpec.type'), 'single_dim', 'range') && !deepGet(t, 'tuningConfig.partitionsSpec.targetRowsPerSegment'), - required: (t: CompactionConfig) => + required: t => !deepGet(t, 'tuningConfig.partitionsSpec.targetRowsPerSegment') && !deepGet(t, 'tuningConfig.partitionsSpec.maxRowsPerSegment'), info: ( @@ -277,7 +281,7 @@ export const COMPACTION_CONFIG_FIELDS: Field[] = [ defaultValue: 1073741824, min: 1000000, hideInMore: true, - adjustment: (t: CompactionConfig) => deepSet(t, 'tuningConfig.splitHintSpec.type', 'maxSize'), + adjustment: t => deepSet(t, 'tuningConfig.splitHintSpec.type', 'maxSize'), info: ( <> Maximum number of bytes of input segments to process in a single task. If a single segment @@ -293,7 +297,7 @@ export const COMPACTION_CONFIG_FIELDS: Field[] = [ defaultValue: 1000, min: 1, hideInMore: true, - adjustment: (t: CompactionConfig) => deepSet(t, 'tuningConfig.splitHintSpec.type', 'maxSize'), + adjustment: t => deepSet(t, 'tuningConfig.splitHintSpec.type', 'maxSize'), info: ( <> Maximum number of input segments to process in a single subtask. This limit is to avoid task diff --git a/web-console/src/druid-models/compaction-status/compaction-status.spec.ts b/web-console/src/druid-models/compaction-status/compaction-status.spec.ts index 9d1254090bf5..1a3cc10f850d 100644 --- a/web-console/src/druid-models/compaction-status/compaction-status.spec.ts +++ b/web-console/src/druid-models/compaction-status/compaction-status.spec.ts @@ -83,5 +83,24 @@ describe('compaction status', () => { }, }), ).toEqual('Fully compacted'); + + expect( + formatCompactionInfo({ + config: BASIC_CONFIG, + status: { + dataSource: 'tbl', + scheduleStatus: 'RUNNING', + bytesAwaitingCompaction: 0, + bytesCompacted: 0, + bytesSkipped: 3776979, + segmentCountAwaitingCompaction: 0, + segmentCountCompacted: 0, + segmentCountSkipped: 24, + intervalCountAwaitingCompaction: 0, + intervalCountCompacted: 0, + intervalCountSkipped: 24, + }, + }), + ).toEqual('Fully compacted (except the last P1D of data, 24 segments skipped)'); }); }); diff --git a/web-console/src/druid-models/compaction-status/compaction-status.ts b/web-console/src/druid-models/compaction-status/compaction-status.ts index d17f2c44fda4..cd134551af72 100644 --- a/web-console/src/druid-models/compaction-status/compaction-status.ts +++ b/web-console/src/druid-models/compaction-status/compaction-status.ts @@ -16,6 +16,7 @@ * limitations under the License. */ +import { pluralIfNeeded } from '../../utils'; import { CompactionConfig } from '../compaction-config/compaction-config'; function capitalizeFirst(str: string): string { @@ -59,8 +60,19 @@ export function formatCompactionInfo(compaction: CompactionInfo) { const { config, status } = compaction; if (config) { if (status) { - if (status.bytesAwaitingCompaction === 0 && !zeroCompactionStatus(status)) { - return 'Fully compacted'; + if ( + status.bytesAwaitingCompaction === 0 && + status.segmentCountAwaitingCompaction === 0 && + status.intervalCountAwaitingCompaction === 0 && + !zeroCompactionStatus(status) + ) { + if (status.segmentCountSkipped) { + return `Fully compacted (except the last ${ + config.skipOffsetFromLatest || 'P1D' + } of data, ${pluralIfNeeded(status.segmentCountSkipped, 'segment')} skipped)`; + } else { + return 'Fully compacted'; + } } else { return capitalizeFirst(status.scheduleStatus); } diff --git a/web-console/src/views/datasources-view/datasources-view.tsx b/web-console/src/views/datasources-view/datasources-view.tsx index c38a42b63938..38b85388d269 100644 --- a/web-console/src/views/datasources-view/datasources-view.tsx +++ b/web-console/src/views/datasources-view/datasources-view.tsx @@ -1324,7 +1324,7 @@ ORDER BY 1`; id: 'compactionStatus', accessor: row => Boolean(row.compaction?.status), filterable: false, - width: 150, + width: 180, Cell: ({ original }) => { const { datasource, compaction } = original as Datasource; return ( From e7d326d978b12711f34f08ef0a4730bad73f1434 Mon Sep 17 00:00:00 2001 From: Vadim Ogievetsky Date: Wed, 7 Dec 2022 15:21:55 -0800 Subject: [PATCH 2/3] even more accurate --- .../compaction-dialog/compaction-dialog.scss | 5 + .../compaction-dialog/compaction-dialog.tsx | 27 ++- .../compaction-config/compaction-config.tsx | 15 ++ .../compaction-status.spec.ts | 163 +++++++++++------- .../compaction-status/compaction-status.ts | 15 +- 5 files changed, 159 insertions(+), 66 deletions(-) diff --git a/web-console/src/dialogs/compaction-dialog/compaction-dialog.scss b/web-console/src/dialogs/compaction-dialog/compaction-dialog.scss index e3ca37b14ea0..499df985c9e1 100644 --- a/web-console/src/dialogs/compaction-dialog/compaction-dialog.scss +++ b/web-console/src/dialogs/compaction-dialog/compaction-dialog.scss @@ -23,6 +23,11 @@ height: 80vh; } + .legacy-callout { + width: auto; + margin: 10px 15px 0; + } + .form-json-selector { margin: 15px; } diff --git a/web-console/src/dialogs/compaction-dialog/compaction-dialog.tsx b/web-console/src/dialogs/compaction-dialog/compaction-dialog.tsx index d63501b1b0b3..3b5456e7d049 100644 --- a/web-console/src/dialogs/compaction-dialog/compaction-dialog.tsx +++ b/web-console/src/dialogs/compaction-dialog/compaction-dialog.tsx @@ -16,11 +16,16 @@ * limitations under the License. */ -import { Button, Classes, Dialog, Intent } from '@blueprintjs/core'; +import { Button, Callout, Classes, Code, Dialog, Intent } from '@blueprintjs/core'; import React, { useState } from 'react'; import { AutoForm, FormJsonSelector, FormJsonTabs, JsonInput } from '../../components'; -import { COMPACTION_CONFIG_FIELDS, CompactionConfig } from '../../druid-models'; +import { + COMPACTION_CONFIG_FIELDS, + CompactionConfig, + compactionConfigHasLegacyInputSegmentSizeBytesSet, +} from '../../druid-models'; +import { deepDelete, formatBytesCompact } from '../../utils'; import './compaction-dialog.scss'; @@ -55,13 +60,29 @@ export const CompactionDialog = React.memo(function CompactionDialog(props: Comp canOutsideClickClose={false} title={`Compaction config: ${datasource}`} > + {compactionConfigHasLegacyInputSegmentSizeBytesSet(currentConfig) && ( + +

+ You current config sets the legacy inputSegmentSizeBytes to{' '} + {formatBytesCompact(currentConfig.inputSegmentSizeBytes!)} it is + recommended to unset this property. +

+

+