1package consts 2 3import "time" 4 5const ( 6 //N.B. This needs to be excluded from replication despite the name; it's 7 //merely saying that this is cluster information for the replicated 8 //cluster. 9 CoreReplicatedClusterPrefix = "core/cluster/replicated/" 10 CoreReplicatedClusterPrefixDR = "core/cluster/replicated-dr/" 11 12 CoreReplicatedClusterInfoPath = CoreReplicatedClusterPrefix + "info" 13 CoreReplicatedClusterSecondariesPrefix = CoreReplicatedClusterPrefix + "secondaries/" 14 CoreReplicatedClusterInfoPathDR = CoreReplicatedClusterPrefixDR + "info" 15 CoreReplicatedClusterSecondariesPrefixDR = CoreReplicatedClusterPrefixDR + "secondaries/" 16 17 // This is an identifier for the current secondary in the replicated paths 18 // manager. It should contain a character that is not allowed in secondary 19 // ids to ensure it doesn't collide. 20 CurrentReplicatedSecondaryIdentifier = ".current" 21) 22 23type ReplicationState uint32 24 25var ReplicationStaleReadTimeout = 2 * time.Second 26 27const ( 28 _ ReplicationState = iota 29 OldReplicationPrimary 30 OldReplicationSecondary 31 OldReplicationBootstrapping 32 // Don't add anything here. Adding anything to this Old block would cause 33 // the rest of the values to change below. This was done originally to 34 // ensure no overlap between old and new values. 35 36 ReplicationUnknown ReplicationState = 0 37 ReplicationPerformancePrimary ReplicationState = 1 << iota // Note -- iota is 5 here! 38 ReplicationPerformanceSecondary 39 OldSplitReplicationBootstrapping 40 ReplicationDRPrimary 41 ReplicationDRSecondary 42 ReplicationPerformanceBootstrapping 43 ReplicationDRBootstrapping 44 ReplicationPerformanceDisabled 45 ReplicationDRDisabled 46 ReplicationPerformanceStandby 47) 48 49// We verify no change to the above values are made 50func init() { 51 52 if OldReplicationBootstrapping != 3 { 53 panic("Replication Constants have changed") 54 } 55 56 if ReplicationPerformancePrimary != 1<<5 { 57 panic("Replication Constants have changed") 58 } 59} 60 61func (r ReplicationState) string() string { 62 switch r { 63 case ReplicationPerformanceSecondary: 64 return "secondary" 65 case ReplicationPerformancePrimary: 66 return "primary" 67 case ReplicationPerformanceBootstrapping: 68 return "bootstrapping" 69 case ReplicationPerformanceDisabled: 70 return "disabled" 71 case ReplicationDRPrimary: 72 return "primary" 73 case ReplicationDRSecondary: 74 return "secondary" 75 case ReplicationDRBootstrapping: 76 return "bootstrapping" 77 case ReplicationDRDisabled: 78 return "disabled" 79 } 80 81 return "unknown" 82} 83 84func (r ReplicationState) StateStrings() []string { 85 var ret []string 86 if r.HasState(ReplicationPerformanceSecondary) { 87 ret = append(ret, "perf-secondary") 88 } 89 if r.HasState(ReplicationPerformancePrimary) { 90 ret = append(ret, "perf-primary") 91 } 92 if r.HasState(ReplicationPerformanceBootstrapping) { 93 ret = append(ret, "perf-bootstrapping") 94 } 95 if r.HasState(ReplicationPerformanceDisabled) { 96 ret = append(ret, "perf-disabled") 97 } 98 if r.HasState(ReplicationDRPrimary) { 99 ret = append(ret, "dr-primary") 100 } 101 if r.HasState(ReplicationDRSecondary) { 102 ret = append(ret, "dr-secondary") 103 } 104 if r.HasState(ReplicationDRBootstrapping) { 105 ret = append(ret, "dr-bootstrapping") 106 } 107 if r.HasState(ReplicationDRDisabled) { 108 ret = append(ret, "dr-disabled") 109 } 110 if r.HasState(ReplicationPerformanceStandby) { 111 ret = append(ret, "perfstandby") 112 } 113 114 return ret 115} 116 117func (r ReplicationState) GetDRString() string { 118 switch { 119 case r.HasState(ReplicationDRBootstrapping): 120 return ReplicationDRBootstrapping.string() 121 case r.HasState(ReplicationDRPrimary): 122 return ReplicationDRPrimary.string() 123 case r.HasState(ReplicationDRSecondary): 124 return ReplicationDRSecondary.string() 125 case r.HasState(ReplicationDRDisabled): 126 return ReplicationDRDisabled.string() 127 default: 128 return "unknown" 129 } 130} 131 132func (r ReplicationState) GetPerformanceString() string { 133 switch { 134 case r.HasState(ReplicationPerformanceBootstrapping): 135 return ReplicationPerformanceBootstrapping.string() 136 case r.HasState(ReplicationPerformancePrimary): 137 return ReplicationPerformancePrimary.string() 138 case r.HasState(ReplicationPerformanceSecondary): 139 return ReplicationPerformanceSecondary.string() 140 case r.HasState(ReplicationPerformanceDisabled): 141 return ReplicationPerformanceDisabled.string() 142 default: 143 return "unknown" 144 } 145} 146 147func (r ReplicationState) HasState(flag ReplicationState) bool { return r&flag != 0 } 148func (r *ReplicationState) AddState(flag ReplicationState) { *r |= flag } 149func (r *ReplicationState) ClearState(flag ReplicationState) { *r &= ^flag } 150func (r *ReplicationState) ToggleState(flag ReplicationState) { *r ^= flag } 151