mirror of
				https://git.proxmox.com/git/mirror_zfs
				synced 2025-10-31 15:26:31 +00:00 
			
		
		
		
	 b2255edcc0
			
		
	
	
		b2255edcc0
		
			
		
	
	
	
	
		
			
			This patch adds a new top-level vdev type called dRAID, which stands
for Distributed parity RAID.  This pool configuration allows all dRAID
vdevs to participate when rebuilding to a distributed hot spare device.
This can substantially reduce the total time required to restore full
parity to pool with a failed device.
A dRAID pool can be created using the new top-level `draid` type.
Like `raidz`, the desired redundancy is specified after the type:
`draid[1,2,3]`.  No additional information is required to create the
pool and reasonable default values will be chosen based on the number
of child vdevs in the dRAID vdev.
    zpool create <pool> draid[1,2,3] <vdevs...>
Unlike raidz, additional optional dRAID configuration values can be
provided as part of the draid type as colon separated values. This
allows administrators to fully specify a layout for either performance
or capacity reasons.  The supported options include:
    zpool create <pool> \
        draid[<parity>][:<data>d][:<children>c][:<spares>s] \
        <vdevs...>
    - draid[parity]       - Parity level (default 1)
    - draid[:<data>d]     - Data devices per group (default 8)
    - draid[:<children>c] - Expected number of child vdevs
    - draid[:<spares>s]   - Distributed hot spares (default 0)
Abbreviated example `zpool status` output for a 68 disk dRAID pool
with two distributed spares using special allocation classes.
```
  pool: tank
 state: ONLINE
config:
    NAME                  STATE     READ WRITE CKSUM
    slag7                 ONLINE       0     0     0
      draid2:8d:68c:2s-0  ONLINE       0     0     0
        L0                ONLINE       0     0     0
        L1                ONLINE       0     0     0
        ...
        U25               ONLINE       0     0     0
        U26               ONLINE       0     0     0
        spare-53          ONLINE       0     0     0
          U27             ONLINE       0     0     0
          draid2-0-0      ONLINE       0     0     0
        U28               ONLINE       0     0     0
        U29               ONLINE       0     0     0
        ...
        U42               ONLINE       0     0     0
        U43               ONLINE       0     0     0
    special
      mirror-1            ONLINE       0     0     0
        L5                ONLINE       0     0     0
        U5                ONLINE       0     0     0
      mirror-2            ONLINE       0     0     0
        L6                ONLINE       0     0     0
        U6                ONLINE       0     0     0
    spares
      draid2-0-0          INUSE     currently in use
      draid2-0-1          AVAIL
```
When adding test coverage for the new dRAID vdev type the following
options were added to the ztest command.  These options are leverages
by zloop.sh to test a wide range of dRAID configurations.
    -K draid|raidz|random - kind of RAID to test
    -D <value>            - dRAID data drives per group
    -S <value>            - dRAID distributed hot spares
    -R <value>            - RAID parity (raidz or dRAID)
The zpool_create, zpool_import, redundancy, replacement and fault
test groups have all been updated provide test coverage for the
dRAID feature.
Co-authored-by: Isaac Huang <he.huang@intel.com>
Co-authored-by: Mark Maybee <mmaybee@cray.com>
Co-authored-by: Don Brady <don.brady@delphix.com>
Co-authored-by: Matthew Ahrens <mahrens@delphix.com>
Co-authored-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Mark Maybee <mmaybee@cray.com>
Reviewed-by: Matt Ahrens <matt@delphix.com>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #10102
		
	
			
		
			
				
	
	
		
			41 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Xorshift Pseudo Random Number Generator based on work by David Blackman
 | |
|  * and Sebastiano Vigna (vigna@acm.org).
 | |
|  *
 | |
|  *   "Further scramblings of Marsaglia's xorshift generators"
 | |
|  *   http://vigna.di.unimi.it/ftp/papers/xorshiftplus.pdf
 | |
|  *   http://prng.di.unimi.it/xoroshiro128plusplus.c
 | |
|  *
 | |
|  * To the extent possible under law, the author has dedicated all copyright
 | |
|  * and related and neighboring rights to this software to the public domain
 | |
|  * worldwide. This software is distributed without any warranty.
 | |
|  *
 | |
|  * See <http://creativecommons.org/publicdomain/zero/1.0/>.
 | |
|  *
 | |
|  * This is xoroshiro128++ 1.0, one of our all-purpose, rock-solid,
 | |
|  * small-state generators. It is extremely (sub-ns) fast and it passes all
 | |
|  * tests we are aware of, but its state space is large enough only for
 | |
|  * mild parallelism.
 | |
|  */
 | |
| 
 | |
| #include <sys/vdev_draid.h>
 | |
| 
 | |
| static inline uint64_t rotl(const uint64_t x, int k)
 | |
| {
 | |
| 	return (x << k) | (x >> (64 - k));
 | |
| }
 | |
| 
 | |
| uint64_t
 | |
| vdev_draid_rand(uint64_t *s)
 | |
| {
 | |
| 	const uint64_t s0 = s[0];
 | |
| 	uint64_t s1 = s[1];
 | |
| 	const uint64_t result = rotl(s0 + s1, 17) + s0;
 | |
| 
 | |
| 	s1 ^= s0;
 | |
| 	s[0] = rotl(s0, 49) ^ s1 ^ (s1 << 21); // a, b
 | |
| 	s[1] = rotl(s1, 28); // c
 | |
| 
 | |
| 	return (result);
 | |
| }
 |