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