I have a Storage Spaces pool containing 2x 3TB disks. A single mirrored volume is created from this pool with a fixed size (not thin provisioned) and is set to use all space in the pool at the time of creation.
Now, I want to add 2x 4TB disks to the same pool and extend the same volume. I can't seem to dig up documentation that covers this scenario.
What will my total usable space for the volume be? Do I lose any space by using drives of mixed sizes in the same pool if I add them in pairs?
My understanding is that since this is a one-column, two copy setup, I shouldn't "leave any space on the table" as long as disks of the same size are added in pairs, even if that new pair is different in size from the current disks, but I can't seem to find any docs that confirm this.
These are the document you are looking for:What are columns and how does Storage Spaces decide how many to use? and Storage Spaces - Designing for Performance and Storage Spaces: Understanding Storage Pool Expansion
I will start by quoting two things from the articles provided:
In other words: If you add physical disks to a storage pool, Windows keeps the amount of columns in said pool. Each row of disks you add must provide one disk per column.
So, if you create a mirror with 2x3TB drives, the largest column count is 1. The column-to-disk correlation for that is 1:2. That makes a 3TB virtual disk.
Now, if you add the other two physical 4TB disks to the storage pool and add them to the virtual drive, Windows will add them without changing the column count. One disk will be added to the column and the other one to the mirror. Thus expanding the virtual disk by another 4TB. Your disk layout will look like this:
So no, you won't lose any space by using drives of mixed sizes in the same pool if you add them in pairs. Quite the opposite even! Because if you would have added them all at once, two things would have happened:
Your layout would have looked like this providing only 6TB, instead of 7TB:
[*] Now, I am not sure how exactly the limitation works and how the new size is calculated. I assume it has something to do with how stripes are written to disks. Because if you write 512 KB of data on the virtual disk, each column parallely receives a stripe of 256 KB. And that would not be possible if one of the columns is full. So that is why I guess that all columns in a storage pool must have the same size. At least with the disks 3TB+3TB+4TB+4TB this is practically true, I checked.
if you work this backwards - you have a 3TB virtual disk, data is mirrored one way, you have 2 underlying blocks of equal size. defined as a one column 2 copy as you say. the rest of your assumptions are exactly correct - to utilize the maximum space you will need to add blocks in factors of 2 of equal volume, you can add disks in factors of 2 of unequal volume but the maximum your virtual volume can consume will be the maximum of the smallest volume in the pair - you can make a second virtual disk with the remainer with other options but you can't consume the remainder in the original virtual disk. so the bounding metric is the number of physical disk the virtual disk spans + the options such as 1 or 2 way mirroring.
So a virtual disk of 9TB over 3TB blocks with a one way mirror would require 3 x 3 for the vdisk + 3 x 3 for the mirror, but as this is a single column it is easier to visualise the underlying blocks as single column with 3 rows (with a second column of equal rows for the one way mirror).
so in summary if you want to use all the available space in a single virtual disk with a one way mirror you will have to add to each column in equal sizes - if you use more that one virtual disk then you can add disks of different sizes and still use all of the available space.