Skip to content

Commit a335d7e

Browse files
committed
NAS-00000: Fix Tiering config form descriptions and add missing reserve field
1 parent e802f9d commit a335d7e

3 files changed

Lines changed: 31 additions & 7 deletions

File tree

src/app/pages/storage/components/tier-config-form/tier-config-form.component.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
[label]="'Max Used Percentage' | translate"
3131
[hint]="helptext.maxUsedPercentage | translate"
3232
></ix-input>
33+
<ix-input
34+
formControlName="special_class_metadata_reserve_pct"
35+
type="number"
36+
[label]="'Performance Tier Reserve' | translate"
37+
[hint]="helptext.performanceTierReserve | translate"
38+
></ix-input>
3339
</ix-fieldset>
3440

3541
<ix-form-actions>

src/app/pages/storage/components/tier-config-form/tier-config-form.component.spec.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ describe('TierConfigFormComponent', () => {
2424
enabled: true,
2525
max_concurrent_jobs: 3,
2626
max_used_percentage: 80,
27+
special_class_metadata_reserve_pct: 25,
2728
} as ZfsTierConfig;
2829

2930
const slideInRef: SlideInRef<void, boolean> = {
@@ -64,6 +65,7 @@ describe('TierConfigFormComponent', () => {
6465
Enabled: true,
6566
'Max Concurrent Jobs': '3',
6667
'Max Used Percentage': '80',
68+
'Performance Tier Reserve': '25',
6769
});
6870
});
6971

@@ -73,6 +75,7 @@ describe('TierConfigFormComponent', () => {
7375
Enabled: false,
7476
'Max Concurrent Jobs': 5,
7577
'Max Used Percentage': 90,
78+
'Performance Tier Reserve': 20,
7679
});
7780

7881
const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' }));
@@ -82,12 +85,18 @@ describe('TierConfigFormComponent', () => {
8285
enabled: false,
8386
max_concurrent_jobs: 5,
8487
max_used_percentage: 90,
88+
special_class_metadata_reserve_pct: 20,
8589
}]);
8690
expect(slideInRef.close).toHaveBeenCalledWith({ response: true });
8791
});
8892

8993
it('shows warning when enabling tiering for the first time', async () => {
90-
const disabledConfig = { enabled: false, max_concurrent_jobs: 1, max_used_percentage: 80 } as ZfsTierConfig;
94+
const disabledConfig = {
95+
enabled: false,
96+
max_concurrent_jobs: 1,
97+
max_used_percentage: 80,
98+
special_class_metadata_reserve_pct: 25,
99+
} as ZfsTierConfig;
91100
jest.spyOn(api, 'call').mockReturnValueOnce(of(disabledConfig));
92101

93102
spectator = createComponent();
@@ -105,18 +114,21 @@ describe('TierConfigFormComponent', () => {
105114
expect(spectator.query('tn-banner')).not.toExist();
106115
});
107116

108-
it('shows validation errors and disables Save when max_used_percentage > 100 or max_concurrent_jobs < 1', async () => {
117+
it('shows validation errors and disables Save when values are out of range', async () => {
109118
const form = await loader.getHarness(IxFormHarness);
110119
await form.fillForm({
111-
'Max Used Percentage': 150,
120+
'Max Used Percentage': 96,
112121
'Max Concurrent Jobs': 0,
122+
'Performance Tier Reserve': 31,
113123
});
114124

115125
const percentInput = await loader.getHarness(IxInputHarness.with({ label: 'Max Used Percentage' }));
116126
const jobsInput = await loader.getHarness(IxInputHarness.with({ label: 'Max Concurrent Jobs' }));
127+
const reserveInput = await loader.getHarness(IxInputHarness.with({ label: 'Performance Tier Reserve' }));
117128

118-
expect(await percentInput.getErrorText()).toBe('Maximum value is 100');
129+
expect(await percentInput.getErrorText()).toBe('Maximum value is 95');
119130
expect(await jobsInput.getErrorText()).toBe('Minimum value is 1');
131+
expect(await reserveInput.getErrorText()).toBe('Maximum value is 30');
120132

121133
const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' }));
122134
expect(await saveButton.isDisabled()).toBe(true);

src/app/pages/storage/components/tier-config-form/tier-config-form.component.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,13 @@ export class TierConfigFormComponent implements OnInit {
5656
protected readonly enabledWarningMessage = T('Once tiering is on, SMB shares and Webshares stop following nested datasets. Each share will expose only its own dataset, and any child datasets under it will no longer be visible to clients through that share. Create a separate share for each dataset you want to expose.');
5757

5858
protected readonly helptext = {
59-
maxConcurrentJobs: T('Maximum number of tiering rewrite jobs that can run in parallel. Higher values speed up data movement between tiers but increase CPU and I/O load on the system.'),
60-
maxUsedPercentage: T('Pool capacity threshold (in percent) above which tiering will move data off the performance tier to keep free space available. Lower values reserve more free space; higher values let the performance tier fill more before data is migrated.'),
59+
maxConcurrentJobs: T('Maximum number of tiering jobs that can run at the same time. Higher values speed up data movement between tiers but increase CPU and I/O load on the system.'),
60+
maxUsedPercentage: T('Stop moving data between tiers when the pool reaches this percentage full (70–95). This keeps tiering from using up the last of the pool\'s free space.'),
61+
performanceTierReserve: T('Percentage of the performance tier kept in reserve (10–30). When only this much space is left on the performance tier, new data goes to the regular tier instead. Shown as reserved space on the pool Usage card.'),
6162
};
6263

6364
private static readonly defaultMaxConcurrentJobs = 1;
65+
private static readonly defaultReservePercent = 25;
6466

6567
formGroup = this.fb.nonNullable.group({
6668
enabled: [false],
@@ -70,7 +72,11 @@ export class TierConfigFormComponent implements OnInit {
7072
],
7173
max_used_percentage: [
7274
poolLowCapacityPercent,
73-
[Validators.required, Validators.min(0), Validators.max(100)],
75+
[Validators.required, Validators.min(70), Validators.max(95)],
76+
],
77+
special_class_metadata_reserve_pct: [
78+
TierConfigFormComponent.defaultReservePercent,
79+
[Validators.required, Validators.min(10), Validators.max(30)],
7480
],
7581
});
7682

0 commit comments

Comments
 (0)