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 }