Skip to content

Commit f3eec59

Browse files
committed
fix: minor issues
1 parent f02f5d2 commit f3eec59

10 files changed

Lines changed: 86 additions & 126 deletions

File tree

src/containers/Tenant/TableFormDialog/__test__/validation.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,36 @@ describe('TableFormDialog validation', () => {
336336
expect(getIssuePaths(result)).toContain('settings.partitionsAtKeys');
337337
});
338338

339+
test('explicit partition split points must match current primary key columns', () => {
340+
const schema = buildTableValidationSchema({mode: 'create'});
341+
342+
const result = schema.safeParse(
343+
createValues({
344+
columns: [createColumn({type: 'Utf8'})],
345+
settings: {
346+
partitionsType: PartitionsType.Explicit,
347+
partitionsAtKeys: [
348+
[
349+
{
350+
id: 'split-point-id',
351+
name: 'id',
352+
type: 'Int64',
353+
key: true,
354+
notNull: true,
355+
isDefined: true,
356+
value: '42',
357+
} as never,
358+
],
359+
],
360+
ttl: {status: 'disabled'},
361+
},
362+
}),
363+
);
364+
365+
expect(result.success).toBe(false);
366+
expect(getIssuePaths(result)).toContain('settings.partitionsAtKeys');
367+
});
368+
339369
test('uniform partitions require Uint32 or Uint64 as the first primary key column', () => {
340370
const schema = buildTableValidationSchema({mode: 'create'});
341371

src/containers/Tenant/TableFormDialog/validation.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,8 @@ function validatePartitionsAtKeys(data: FormValues, ctx: z.RefinementCtx) {
263263
if (!partitionsAtKeys || partitionsAtKeys.length === 0) {
264264
return;
265265
}
266-
const pkColumnCount = data.columns.filter(({key}) => Boolean(key)).length;
266+
const pkColumns = data.columns.filter(({key}) => Boolean(key));
267+
const pkColumnCount = pkColumns.length;
267268

268269
const allHaveLengthOne = partitionsAtKeys.every(
269270
(point: Array<{value: string | null}>) =>
@@ -275,6 +276,27 @@ function validatePartitionsAtKeys(data: FormValues, ctx: z.RefinementCtx) {
275276
);
276277
if (!allHaveLengthOne && !allHaveLengthPk) {
277278
addIssue(ctx, ['settings', 'partitionsAtKeys'], i18n('error_partitions-at-keys-invalid'));
279+
return;
280+
}
281+
282+
const matchesCurrentPrimaryKey = partitionsAtKeys.every((point) => {
283+
const currentColumns = point.length === 1 ? pkColumns.slice(0, 1) : pkColumns;
284+
285+
return point.every((column, index) => {
286+
const currentColumn = currentColumns[index];
287+
288+
return (
289+
Boolean(currentColumn) &&
290+
Boolean(column.value) &&
291+
column.name === currentColumn.name &&
292+
column.type === currentColumn.type &&
293+
isValueForTypeValid(String(column.value), currentColumn.type)
294+
);
295+
});
296+
});
297+
298+
if (!matchesCurrentPrimaryKey) {
299+
addIssue(ctx, ['settings', 'partitionsAtKeys'], i18n('error_partitions-at-keys-invalid'));
278300
}
279301
}
280302

src/containers/Tenant/TopicFormDialog/TopicFormDialog.tsx

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ function TopicForm({
322322
setValue,
323323
trigger,
324324
watch,
325-
formState: {dirtyFields, errors},
325+
formState: {errors},
326326
} = useForm<TopicFormValues>({
327327
defaultValues: initialValues,
328328
resolver: zodResolver(validationSchema),
@@ -387,17 +387,7 @@ function TopicForm({
387387
}, [autoPartitioningEnabled, maxPartitions, minPartitions, shards, writeQuotaBytes]);
388388

389389
const handleTopicSubmit = handleSubmit(async (data) => {
390-
const preservePartitionCountLimit =
391-
mode === 'update' &&
392-
!data.autoPartitioning.enabled &&
393-
!dirtyFields.shards &&
394-
!dirtyFields.autoPartitioning?.enabled;
395-
396-
const preparedData = {
397-
...data,
398-
partitionCountLimit: initialValues.partitionCountLimit,
399-
...(preservePartitionCountLimit ? {preservePartitionCountLimit} : {}),
400-
};
390+
const preparedData = data;
401391

402392
try {
403393
if (mode === 'create') {
@@ -755,11 +745,11 @@ function TopicForm({
755745
if (
756746
value !== undefined &&
757747
maxPartitions !== undefined &&
758-
maxPartitions <= value
748+
maxPartitions < value
759749
) {
760750
setValue(
761751
'autoPartitioning.maxPartitions',
762-
value + 1,
752+
value,
763753
);
764754
}
765755
trigger('autoPartitioning.maxPartitions');

src/containers/Tenant/TopicFormDialog/__test__/validation.test.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,27 @@ describe('TopicFormDialog validation', () => {
5757
expect(getIssuePaths(result)).toContain('name');
5858
});
5959

60-
test('validates auto-partitioning bounds and required fields', () => {
60+
test('allows equal auto-partitioning bounds', () => {
61+
const schema = getTopicFormValidationSchema(3);
62+
63+
const result = schema.safeParse(
64+
createValidValues({
65+
shards: 3,
66+
autoPartitioning: {
67+
enabled: true,
68+
mode: AutoPartitioningStrategy.ScaleUp,
69+
minPartitions: 3,
70+
maxPartitions: 3,
71+
stabilizationWindow: 300,
72+
upUtilization: 90,
73+
},
74+
}),
75+
);
76+
77+
expect(result.success).toBe(true);
78+
});
79+
80+
test('validates auto-partitioning minimum and required fields', () => {
6181
const schema = getTopicFormValidationSchema(3);
6282

6383
const result = schema.safeParse(
@@ -79,7 +99,6 @@ describe('TopicFormDialog validation', () => {
7999
expect.arrayContaining([
80100
'shards',
81101
'autoPartitioning.minPartitions',
82-
'autoPartitioning.maxPartitions',
83102
'autoPartitioning.stabilizationWindow',
84103
'autoPartitioning.upUtilization',
85104
]),

src/containers/Tenant/TopicFormDialog/i18n/en.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"context_auto-partitioning-stabilization-window": "The period of time after a load change when the number of partitions will change",
2929
"context_auto-partitioning-up-utilization": "The threshold at which the number of partitions increases",
3030

31-
"confirm_auto-partitioning-message": "The Kafka protocol does not support topic autopartitioning. If you enable autopartitioning, you will not be able to work with the topics you create using the Kafka protocol. You can not disabling autopartitioning for a specific topic.",
31+
"confirm_auto-partitioning-message": "The Kafka protocol does not support topic autopartitioning. If you enable autopartitioning, you will not be able to work with the topics you create using the Kafka protocol. You cannot disable autopartitioning for a specific topic.",
3232

3333
"value_auto-partitioning-scale-up": "Scale up",
3434
"value_auto-partitioning-paused": "Paused",

src/containers/Tenant/TopicFormDialog/validation.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@ export function getTopicFormValidationSchema(minPartitions: number) {
121121
if (
122122
minValue !== undefined &&
123123
autoPartitioning.maxPartitions !== undefined &&
124-
autoPartitioning.maxPartitions <= minValue
124+
autoPartitioning.maxPartitions < minValue
125125
) {
126-
addIssue(ctx, maxPath, i18n('error_more-than-number', {count: minValue}));
126+
addIssue(ctx, maxPath, i18n('error_min-number', {count: minValue}));
127127
}
128128
}
129129

src/store/reducers/topic/__test__/topic.test.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ describe('topic selectors', () => {
5858
expect(result).toEqual({
5959
name: 'topic-a',
6060
shards: 3,
61-
partitionCountLimit: undefined,
6261
writeQuotaBytes: 262144,
6362
autoPartitioning: {
6463
enabled: true,
@@ -71,15 +70,14 @@ describe('topic selectors', () => {
7170
});
7271
});
7372

74-
test('selectTopicFormValues ignores backend retention fields for legacy topics', async () => {
73+
test('selectTopicFormValues keeps fixed-partition topics on YDB defaults', async () => {
7574
const result = await seedTopicResult({
7675
self: {name: 'topic-legacy'},
7776
retention_period: {seconds: '86400'},
7877
retention_storage_mb: '2048',
7978
partition_write_speed_bytes_per_second: '1048576',
8079
partitioning_settings: {
8180
min_active_partitions: '2',
82-
partition_count_limit: '5',
8381
auto_partitioning_settings: {
8482
strategy: AutoPartitioningStrategy.Disabled,
8583
},
@@ -89,13 +87,12 @@ describe('topic selectors', () => {
8987
expect(result).toEqual({
9088
name: 'topic-legacy',
9189
shards: 2,
92-
partitionCountLimit: 5,
9390
writeQuotaBytes: 1048576,
9491
autoPartitioning: {
9592
enabled: false,
9693
mode: AutoPartitioningStrategy.Disabled,
9794
minPartitions: 2,
98-
maxPartitions: 5,
95+
maxPartitions: undefined,
9996
stabilizationWindow: undefined,
10097
upUtilization: undefined,
10198
},
@@ -110,7 +107,7 @@ describe('topic selectors', () => {
110107
partition_write_speed_bytes_per_second: 'broken',
111108
partitioning_settings: {
112109
min_active_partitions: '1',
113-
partition_count_limit: 'oops',
110+
max_active_partitions: 'oops',
114111
auto_partitioning_settings: {
115112
strategy: AutoPartitioningStrategy.Unspecified,
116113
},
@@ -120,7 +117,6 @@ describe('topic selectors', () => {
120117
expect(result).toEqual({
121118
name: 'topic-b',
122119
shards: 1,
123-
partitionCountLimit: undefined,
124120
writeQuotaBytes: 1024 * 1024,
125121
autoPartitioning: {
126122
enabled: false,

src/store/reducers/topic/__test__/utils.test.ts

Lines changed: 0 additions & 71 deletions
This file was deleted.

src/store/reducers/topic/topic.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,7 @@ export const selectTopicFormValues = createSelector(
251251
10,
252252
);
253253
const maxActivePartitions = parseInt(
254-
topicData.partitioning_settings?.max_active_partitions ??
255-
topicData.partitioning_settings?.partition_count_limit ??
256-
'0',
257-
10,
258-
);
259-
const parsedPartitionCountLimit = parseInt(
260-
topicData.partitioning_settings?.partition_count_limit ?? '',
254+
topicData.partitioning_settings?.max_active_partitions ?? '0',
261255
10,
262256
);
263257
const parsedWriteQuotaBytes = parseInt(
@@ -268,9 +262,6 @@ export const selectTopicFormValues = createSelector(
268262
const writeQuotaBytes = Number.isFinite(parsedWriteQuotaBytes)
269263
? parsedWriteQuotaBytes
270264
: DEFAULT_WRITE_QUOTA_BYTES;
271-
const partitionCountLimit = Number.isFinite(parsedPartitionCountLimit)
272-
? parsedPartitionCountLimit
273-
: undefined;
274265
const autoPartitioningSettings =
275266
topicData.partitioning_settings?.auto_partitioning_settings;
276267
const autoPartitioningStrategy = String(
@@ -284,7 +275,6 @@ export const selectTopicFormValues = createSelector(
284275
return {
285276
name: topicData.self?.name,
286277
shards: minActivePartitions,
287-
partitionCountLimit,
288278
writeQuotaBytes,
289279
autoPartitioning: {
290280
enabled: autoPartitioningEnabled,

src/store/reducers/topic/utils.ts

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,7 @@ export interface TopicFormValues {
1010
path?: string;
1111
name?: string;
1212
shards: number;
13-
partitionCountLimit?: number;
1413
writeQuotaBytes: number;
15-
preservePartitionCountLimit?: boolean;
1614
autoPartitioning: {
1715
enabled: boolean;
1816
mode: string;
@@ -60,13 +58,7 @@ function buildTopicSettings(
6058
includeDisabledAutoPartitioningStrategy = true,
6159
}: {includeDisabledAutoPartitioningStrategy?: boolean} = {},
6260
): string[] {
63-
const {
64-
shards,
65-
writeQuotaBytes,
66-
partitionCountLimit,
67-
preservePartitionCountLimit,
68-
autoPartitioning,
69-
} = formData;
61+
const {shards, writeQuotaBytes, autoPartitioning} = formData;
7062

7163
const settings: string[] = [];
7264

@@ -79,14 +71,6 @@ function buildTopicSettings(
7971
if (autoPartitioning.maxPartitions !== undefined) {
8072
settings.push(`MAX_ACTIVE_PARTITIONS = ${autoPartitioning.maxPartitions}`);
8173
}
82-
} else {
83-
if (preservePartitionCountLimit) {
84-
if (partitionCountLimit !== undefined) {
85-
settings.push(`PARTITION_COUNT_LIMIT = ${partitionCountLimit}`);
86-
}
87-
} else {
88-
settings.push(`PARTITION_COUNT_LIMIT = ${shards}`);
89-
}
9074
}
9175

9276
settings.push(`PARTITION_WRITE_SPEED_BYTES_PER_SECOND = ${writeQuotaBytes}`);

0 commit comments

Comments
 (0)