Skip to content

Commit 8bb3534

Browse files
committed
added raid 50
1 parent 603099d commit 8bb3534

File tree

2 files changed

+57
-19
lines changed

2 files changed

+57
-19
lines changed

src/tools/raid-calculator/raid-calculator.service.ts

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ const raidCalculations = {
44
raid_0: {
55
about: 'RAID 0 splits data evenly across 2 or more disks without redunancy or fault tolerance creating one large storage space. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_0" target="_blank">Wikipedia</a>',
66
requirements: 'RAID 0 requires at least 1 disk',
7-
validate(num, size) {
7+
validate(num, size, stripeSize) {
88
return num > 1;
99
},
10-
capacity(num, size, unit) {
10+
capacity(num, size, stripeSize, unit) {
1111
// total disks * size
1212
return (num * size) * unit;
1313
},
14-
efficiency(num) {
14+
efficiency(num, stripeSize) {
1515
// uses 100% of space
1616
return 100;
1717
},
@@ -22,14 +22,14 @@ const raidCalculations = {
2222
raid_1: {
2323
about: 'RAID 1 consists of an exact copy of the data (mirror) across two or more disks. The array will operate as long as at least one drive is operational. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_1" target="_blank">Wikipedia</a>',
2424
requirements: 'RAID 1 requires at least 1 disk',
25-
validate(num, size) {
25+
validate(num, size, stripeSize) {
2626
return num > 1;
2727
},
28-
capacity(num, size, unit) {
28+
capacity(num, size, stripeSize, unit) {
2929
// total size is size of a single drive
3030
return size * unit;
3131
},
32-
efficiency(num) {
32+
efficiency(num, stripeSize) {
3333
// 1/N
3434
return (1 / num) * 100;
3535
},
@@ -41,14 +41,14 @@ const raidCalculations = {
4141
raid_5: {
4242
about: 'RAID 5 uses block level striping with parity. This allows for fault tolerance with a storage reduction equal to one drive for the parity information. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_5" target="_blank">Wikipedia</a>',
4343
requirements: 'RAID 5 requires at least 3 disks',
44-
validate(num, size) {
44+
validate(num, size, stripeSize) {
4545
return num >= 3;
4646
},
47-
capacity(num, size, unit) {
47+
capacity(num, size, stripeSize, unit) {
4848
// (N-1) * S (one drive for parity)
4949
return ((num - 1) * size) * unit;
5050
},
51-
efficiency(num) {
51+
efficiency(num, stripeSize) {
5252
// 1 - (1/N)
5353
return (1 - (1 / num)) * 100;
5454
},
@@ -60,14 +60,14 @@ const raidCalculations = {
6060
raid_6: {
6161
about: 'RAID 6 is similiar to RAID 5 but with an additional parity block. This allows for an additional disk failure at the cost of storage reduction equal to two drives. More info: <a href="https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_6" target="_blank">Wikipedia</a>',
6262
requirements: 'RAID 6 requires at least 4 disks',
63-
validate(num, size) {
63+
validate(num, size, stripeSize) {
6464
return num >= 4;
6565
},
66-
capacity(num, size, unit) {
66+
capacity(num, size, stripeSize, unit) {
6767
// (N-2) * S (2 parity)
6868
return ((num - 2) * size) * unit;
6969
},
70-
efficiency(num) {
70+
efficiency(num, stripeSize) {
7171
// 1 - (2/N)
7272
return (1 - (2 / num)) * 100;
7373
},
@@ -77,16 +77,16 @@ const raidCalculations = {
7777
},
7878
},
7979
raid_10: {
80-
about: 'RAID 10 is generally recognized as a stripe of mirrors (RAID 1 + RAID 0). Each set of drives is mirrored and striped together so that each drive in the set is fault tolerant within the group. More info: <a href="https://en.wikipedia.org/wiki/Nested_RAID_levels#RAID_10_(RAID_1+0)" target="_blank">Wikipedia</a>',
80+
about: 'RAID 10 is a stripe of mirrors (RAID 1 + RAID 0). Each set of drives is mirrored and striped together so that each drive in the set is fault tolerant within the group. More info: <a href="https://en.wikipedia.org/wiki/Nested_RAID_levels#RAID_10_(RAID_1+0)" target="_blank">Wikipedia</a>',
8181
requirements: 'RAID 10 requires an even number of at least 4 disks',
82-
validate(num, size) {
82+
validate(num, size, stripeSize) {
8383
return num >= 4 && num % 2 === 0;
8484
},
85-
capacity(num, size, unit) {
85+
capacity(num, size, stripeSize, unit) {
8686
// Total disks (stripe)/2 (mirror)
8787
return ((num * size) / 2) * unit;
8888
},
89-
efficiency(num) {
89+
efficiency(num, stripeSize) {
9090
// 1/2 (1/strips per stripe, 2 in this case)
9191
return 50;
9292
},
@@ -95,4 +95,26 @@ const raidCalculations = {
9595
return '1 drive failure per mirrored set';
9696
},
9797
},
98+
raid_50: {
99+
about: 'RAID 50 stripes multiple RAID 5 arrays together (RAID 5 + RAID 0). Each RAID 5 set can sustain a single drive failure. More info: <a href="https://en.wikipedia.org/wiki/Nested_RAID_levels#RAID_50_(RAID_5+0)" target="_blank">Wikipedia</a>',
100+
requirements: 'RAID 50 requires at least 6 disks total with 3 minimum per stripe. Stripes must contain an equal number of disks.',
101+
validate(num, size, stripeSize) {
102+
return num >= 6 && stripeSize >= 3 && num % stripeSize === 0;
103+
},
104+
capacity(num, size, stripeSize, unit) {
105+
// RAID 5 per strip
106+
const perStripe = ((stripeSize - 1) * size) * unit;
107+
108+
// sum each stripe
109+
return perStripe * (num / stripeSize);
110+
},
111+
efficiency(num, stripeSize) {
112+
// 1 - (1 / strips per stripe)
113+
return (1 - (1 / stripeSize)) * 100;
114+
},
115+
fault(num, size, unit) {
116+
// one per mirror
117+
return '1 drive failure per RAID 5 set';
118+
},
119+
},
98120
};

src/tools/raid-calculator/raid-calculator.vue

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,37 @@ import { UNIT_BASE, formatBytes } from '@/utils/convert';
55
const diskTotal = ref(2);
66
const diskSize = ref(100);
77
const diskUnit = ref(10 ** 9);
8+
const diskPerStripe = ref(3);
89
const raidType = ref('raid_0');
910
const raidInfo = computed(() => raidCalculations[raidType.value].about);
1011
const raidRequirements = computed(() => raidCalculations[raidType.value].requirements);
1112
const inputsValid = computed(() => validateSetup());
1213
14+
const totalStripes = computed(() => {
15+
if(inputsValid.value){
16+
return `${diskTotal.value / diskPerStripe.value} stripes total`;
17+
}
18+
else
19+
{
20+
return '';
21+
}
22+
});
23+
1324
const calculatedCapacity = computed(() => {
14-
return formatBytes(raidCalculations[raidType.value].capacity(diskTotal.value, diskSize.value, diskUnit.value), 2, UNIT_BASE.BASE_10);
25+
return formatBytes(raidCalculations[raidType.value].capacity(diskTotal.value, diskSize.value, diskPerStripe.value, diskUnit.value), 2, UNIT_BASE.BASE_10);
1526
});
1627
1728
const calculatedFaultTolerance = computed(() => {
1829
return raidCalculations[raidType.value].fault(diskTotal.value, diskSize.value, diskUnit.value);
1930
});
2031
2132
const calculatedSpaceEfficiency = computed(() => {
22-
return raidCalculations[raidType.value].efficiency(diskTotal.value);
33+
return raidCalculations[raidType.value].efficiency(diskTotal.value, diskPerStripe.value).toFixed(1);
2334
});
2435
2536
function validateSetup() {
2637
// validate the selected RAID type against parameters
27-
return raidCalculations[raidType.value].validate(diskTotal.value, diskSize.value);
38+
return raidCalculations[raidType.value].validate(diskTotal.value, diskSize.value, diskPerStripe.value);
2839
}
2940
</script>
3041

@@ -51,6 +62,10 @@ function validateSetup() {
5162
/>
5263
</div>
5364
</n-form-item>
65+
<n-form-item v-if="raidType == 'raid_50'" label="Disks per stripe" label-placement="left" label-width="150" mb-2>
66+
<n-input-number v-model:value="diskPerStripe" max="10000" min="2" placeholder="Number of disks per stripe (ex: 3)" w-full />
67+
<n-input v-model:value="totalStripes" placeholder="" ml-1 w-full readonly />
68+
</n-form-item>
5469
<n-form-item label="RAID Type" label-placement="left" label-width="150" mb-2>
5570
<c-select
5671
v-model:value="raidType"
@@ -61,6 +76,7 @@ function validateSetup() {
6176
{ label: 'RAID 5 (parity)', value: 'raid_5' },
6277
{ label: 'RAID 6 (double parity)', value: 'raid_6' },
6378
{ label: 'RAID 10 (mirror + stripe)', value: 'raid_10' },
79+
{ label: 'RAID 50 (parity + stripe)', value: 'raid_50' },
6480
]"
6581
/>
6682
</n-form-item>

0 commit comments

Comments
 (0)