diff options
Diffstat (limited to 'go/storage/replica_placement.go')
| -rw-r--r-- | go/storage/replica_placement.go | 61 |
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 +} |
