Update madmin package to return storage class parity (#5387)

After the addition of Storage Class support, readQuorum
and writeQuorum are decided on a per object basis, instead
of deployment wide static quorums.

This PR updates madmin api to remove readQuorum/writeQuorum
and add Standard storage class and reduced redundancy storage
class parity as return values. Since these parity values are
used to decide the quorum for each object.

Fixes #5378
master
Nitish Tiwari 7 years ago committed by GitHub
parent cd22feecf8
commit 42633748db
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      cmd/object-api-datatypes.go
  2. 4
      cmd/server-startup-msg.go
  3. 28
      cmd/server-startup-msg_test.go
  4. 4
      cmd/xl-v1.go
  5. 4
      pkg/madmin/API.md
  6. 2
      pkg/madmin/README.md
  7. 8
      pkg/madmin/info-commands.go

@ -45,8 +45,8 @@ type StorageInfo struct {
// Following fields are only meaningful if BackendType is Erasure. // Following fields are only meaningful if BackendType is Erasure.
OnlineDisks int // Online disks during server startup. OnlineDisks int // Online disks during server startup.
OfflineDisks int // Offline disks during server startup. OfflineDisks int // Offline disks during server startup.
standardSCParity int // Parity disks for currently configured Standard storage class. StandardSCParity int // Parity disks for currently configured Standard storage class.
rrSCParity int // Parity disks for currently configured Reduced Redundancy storage class. RRSCParity int // Parity disks for currently configured Reduced Redundancy storage class.
} }
} }

@ -197,7 +197,7 @@ func printStorageClassInfoMsg(storageInfo StorageInfo) {
func getStandardStorageClassInfoMsg(storageInfo StorageInfo) string { func getStandardStorageClassInfoMsg(storageInfo StorageInfo) string {
var msg string var msg string
if maxDiskFailures := storageInfo.Backend.standardSCParity - storageInfo.Backend.OfflineDisks; maxDiskFailures >= 0 { if maxDiskFailures := storageInfo.Backend.StandardSCParity - storageInfo.Backend.OfflineDisks; maxDiskFailures >= 0 {
msg += fmt.Sprintf("Objects with "+standardStorageClass+" class can withstand [%d] drive failure(s).\n", maxDiskFailures) msg += fmt.Sprintf("Objects with "+standardStorageClass+" class can withstand [%d] drive failure(s).\n", maxDiskFailures)
} }
return msg return msg
@ -205,7 +205,7 @@ func getStandardStorageClassInfoMsg(storageInfo StorageInfo) string {
func getRRSStorageClassInfoMsg(storageInfo StorageInfo) string { func getRRSStorageClassInfoMsg(storageInfo StorageInfo) string {
var msg string var msg string
if maxDiskFailures := storageInfo.Backend.rrSCParity - storageInfo.Backend.OfflineDisks; maxDiskFailures >= 0 { if maxDiskFailures := storageInfo.Backend.RRSCParity - storageInfo.Backend.OfflineDisks; maxDiskFailures >= 0 {
msg += fmt.Sprintf("Objects with "+reducedRedundancyStorageClass+" class can withstand [%d] drive failure(s).\n", maxDiskFailures) msg += fmt.Sprintf("Objects with "+reducedRedundancyStorageClass+" class can withstand [%d] drive failure(s).\n", maxDiskFailures)
} }
return msg return msg

@ -38,8 +38,8 @@ func TestStorageInfoMsg(t *testing.T) {
Type BackendType Type BackendType
OnlineDisks int OnlineDisks int
OfflineDisks int OfflineDisks int
standardSCParity int StandardSCParity int
rrSCParity int RRSCParity int
}{Erasure, 7, 1, 4, 5}, }{Erasure, 7, 1, 4, 5},
} }
@ -169,8 +169,8 @@ func TestGetStandardStorageClassInfoMsg(t *testing.T) {
Type BackendType Type BackendType
OnlineDisks int OnlineDisks int
OfflineDisks int OfflineDisks int
standardSCParity int StandardSCParity int
rrSCParity int RRSCParity int
}{Erasure, 15, 1, 5, 3}, }{Erasure, 15, 1, 5, 3},
}, "Objects with " + standardStorageClass + " class can withstand [4] drive failure(s).\n"}, }, "Objects with " + standardStorageClass + " class can withstand [4] drive failure(s).\n"},
{"2", StorageInfo{ {"2", StorageInfo{
@ -180,8 +180,8 @@ func TestGetStandardStorageClassInfoMsg(t *testing.T) {
Type BackendType Type BackendType
OnlineDisks int OnlineDisks int
OfflineDisks int OfflineDisks int
standardSCParity int StandardSCParity int
rrSCParity int RRSCParity int
}{Erasure, 10, 0, 5, 3}, }{Erasure, 10, 0, 5, 3},
}, "Objects with " + standardStorageClass + " class can withstand [5] drive failure(s).\n"}, }, "Objects with " + standardStorageClass + " class can withstand [5] drive failure(s).\n"},
{"3", StorageInfo{ {"3", StorageInfo{
@ -191,8 +191,8 @@ func TestGetStandardStorageClassInfoMsg(t *testing.T) {
Type BackendType Type BackendType
OnlineDisks int OnlineDisks int
OfflineDisks int OfflineDisks int
standardSCParity int StandardSCParity int
rrSCParity int RRSCParity int
}{Erasure, 12, 3, 6, 2}, }{Erasure, 12, 3, 6, 2},
}, "Objects with " + standardStorageClass + " class can withstand [3] drive failure(s).\n"}, }, "Objects with " + standardStorageClass + " class can withstand [3] drive failure(s).\n"},
} }
@ -216,8 +216,8 @@ func TestGetRRSStorageClassInfoMsg(t *testing.T) {
Type BackendType Type BackendType
OnlineDisks int OnlineDisks int
OfflineDisks int OfflineDisks int
standardSCParity int StandardSCParity int
rrSCParity int RRSCParity int
}{Erasure, 15, 1, 5, 3}, }{Erasure, 15, 1, 5, 3},
}, "Objects with " + reducedRedundancyStorageClass + " class can withstand [2] drive failure(s).\n"}, }, "Objects with " + reducedRedundancyStorageClass + " class can withstand [2] drive failure(s).\n"},
{"2", StorageInfo{ {"2", StorageInfo{
@ -227,8 +227,8 @@ func TestGetRRSStorageClassInfoMsg(t *testing.T) {
Type BackendType Type BackendType
OnlineDisks int OnlineDisks int
OfflineDisks int OfflineDisks int
standardSCParity int StandardSCParity int
rrSCParity int RRSCParity int
}{Erasure, 16, 0, 5, 3}, }{Erasure, 16, 0, 5, 3},
}, "Objects with " + reducedRedundancyStorageClass + " class can withstand [3] drive failure(s).\n"}, }, "Objects with " + reducedRedundancyStorageClass + " class can withstand [3] drive failure(s).\n"},
{"3", StorageInfo{ {"3", StorageInfo{
@ -238,8 +238,8 @@ func TestGetRRSStorageClassInfoMsg(t *testing.T) {
Type BackendType Type BackendType
OnlineDisks int OnlineDisks int
OfflineDisks int OfflineDisks int
standardSCParity int StandardSCParity int
rrSCParity int RRSCParity int
}{Erasure, 12, 3, 6, 5}, }{Erasure, 12, 3, 6, 5},
}, "Objects with " + reducedRedundancyStorageClass + " class can withstand [2] drive failure(s).\n"}, }, "Objects with " + reducedRedundancyStorageClass + " class can withstand [2] drive failure(s).\n"},
} }

@ -247,10 +247,10 @@ func getStorageInfo(disks []StorageAPI) StorageInfo {
storageInfo.Backend.OfflineDisks = offlineDisks storageInfo.Backend.OfflineDisks = offlineDisks
_, scParity := getRedundancyCount(standardStorageClass, len(disks)) _, scParity := getRedundancyCount(standardStorageClass, len(disks))
storageInfo.Backend.standardSCParity = scParity storageInfo.Backend.StandardSCParity = scParity
_, rrSCparity := getRedundancyCount(reducedRedundancyStorageClass, len(disks)) _, rrSCparity := getRedundancyCount(reducedRedundancyStorageClass, len(disks))
storageInfo.Backend.rrSCParity = rrSCparity storageInfo.Backend.RRSCParity = rrSCparity
return storageInfo return storageInfo
} }

@ -85,8 +85,8 @@ Fetch service status, replies disk space used, backend type and total disks offl
|`backend.Type` | _BackendType_ | Type of backend used by the server currently only FS or Erasure. | |`backend.Type` | _BackendType_ | Type of backend used by the server currently only FS or Erasure. |
|`backend.OnlineDisks`| _int_ | Total number of disks online (only applies to Erasure backend), is empty for FS. | |`backend.OnlineDisks`| _int_ | Total number of disks online (only applies to Erasure backend), is empty for FS. |
|`backend.OfflineDisks` | _int_ | Total number of disks offline (only applies to Erasure backend), is empty for FS. | |`backend.OfflineDisks` | _int_ | Total number of disks offline (only applies to Erasure backend), is empty for FS. |
|`backend.ReadQuorum` | _int_ | Current total read quorum threshold before reads will be unavailable, is empty for FS. | |`backend.StandardSCParity` | _int_ | Parity disks set for standard storage class, is empty for FS. |
|`backend.WriteQuorum` | _int_ | Current total write quorum threshold before writes will be unavailable, is empty for FS. | |`backend.RRSCParity` | _int_ | Parity disks set for reduced redundancy storage class, is empty for FS. |
__Example__ __Example__

@ -96,7 +96,7 @@ func main() {
```sh ```sh
go run service-status.go go run service-status.go
2016/12/20 16:46:01 madmin.ServiceStatusMetadata{Total:177038229504, Free:120365559808, Backend:struct { Type madmin.BackendType; OnlineDisks int; OfflineDisks int; ReadQuorum int; WriteQuorum int }{Type:1, OnlineDisks:0, OfflineDisks:0, ReadQuorum:0, WriteQuorum:0}} 2016/12/20 16:46:01 madmin.ServiceStatusMetadata{Total:177038229504, Free:120365559808, Backend:struct { Type madmin.BackendType; OnlineDisks int; OfflineDisks int; ReadQuorum int; WriteQuorum int }{Type:1, OnlineDisks:0, OfflineDisks:0, StandardSCParity:0, RRSCParity:0}}
``` ```

@ -51,10 +51,10 @@ type StorageInfo struct {
Type BackendType Type BackendType
// Following fields are only meaningful if BackendType is Erasure. // Following fields are only meaningful if BackendType is Erasure.
OnlineDisks int // Online disks during server startup. OnlineDisks int // Online disks during server startup.
OfflineDisks int // Offline disks during server startup. OfflineDisks int // Offline disks during server startup.
ReadQuorum int // Minimum disks required for successful read operations. StandardSCParity int // Parity disks for currently configured Standard storage class.
WriteQuorum int // Minimum disks required for successful write operations. RRSCParity int // Parity disks for currently configured Reduced Redundancy storage class.
} }
} }

Loading…
Cancel
Save