aboutsummaryrefslogtreecommitdiff
path: root/go/storage/replica_placement.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/storage/replica_placement.go')
-rw-r--r--go/storage/replica_placement.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/go/storage/replica_placement.go b/go/storage/replica_placement.go
new file mode 100644
index 000000000..55428749b
--- /dev/null
+++ b/go/storage/replica_placement.go
@@ -0,0 +1,61 @@
+package storage
+
+import (
+ "errors"
+ "fmt"
+)
+
+const (
+ ReplicaPlacementCount = 9
+)
+
+type ReplicaPlacement struct {
+ SameRackCount int
+ DiffRackCount int
+ DiffDataCenterCount int
+}
+
+func NewReplicaPlacementFromString(t string) (*ReplicaPlacement, error) {
+ rp := &ReplicaPlacement{}
+ for i, c := range t {
+ count := int(c - '0')
+ if 0 <= count && count <= 2 {
+ switch i {
+ case 0:
+ rp.DiffDataCenterCount = count
+ case 1:
+ rp.DiffRackCount = count
+ case 2:
+ rp.SameRackCount = count
+ }
+ } else {
+ return rp, errors.New("Unknown Replication Type:" + t)
+ }
+ }
+ return rp, nil
+}
+
+func NewReplicaPlacementFromByte(b byte) (*ReplicaPlacement, error) {
+ return NewReplicaPlacementFromString(fmt.Sprintf("%d", b))
+}
+
+func (rp *ReplicaPlacement) Byte() byte {
+ ret := rp.DiffDataCenterCount*100 + rp.DiffRackCount*10 + rp.SameRackCount
+ return byte(ret)
+}
+
+func (rp *ReplicaPlacement) String() string {
+ b := make([]byte, 3)
+ b[0] = byte(rp.DiffDataCenterCount + '0')
+ b[1] = byte(rp.DiffRackCount + '0')
+ b[2] = byte(rp.SameRackCount + '0')
+ return string(b)
+}
+
+func (rp *ReplicaPlacement) GetCopyCount() int {
+ return rp.DiffDataCenterCount + rp.DiffRackCount + rp.SameRackCount + 1
+}
+
+func (rp *ReplicaPlacement) GetReplicationLevelIndex() int {
+ return rp.DiffDataCenterCount*3 + rp.DiffRackCount*3 + rp.SameRackCount
+}