@@ -23,6 +23,7 @@ import (
23
23
"math"
24
24
"net/http"
25
25
"path"
26
+ "reflect"
26
27
"regexp"
27
28
"strconv"
28
29
"sync"
@@ -2133,9 +2134,49 @@ func (s *EtcdServer) applyConfChange(cc raftpb.ConfChange, confState *raftpb.Con
2133
2134
s .r .transport .UpdatePeer (m .ID , m .PeerURLs )
2134
2135
}
2135
2136
}
2137
+
2138
+ verify .Verify (func () {
2139
+ s .verifyV3StoreInSyncWithV2Store (shouldApplyV3 )
2140
+ })
2141
+
2136
2142
return false , nil
2137
2143
}
2138
2144
2145
+ func (s * EtcdServer ) verifyV3StoreInSyncWithV2Store (shouldApplyV3 membership.ShouldApplyV3 ) {
2146
+ // If shouldApplyV3 == false, then it means v2store hasn't caught up with v3store.
2147
+ if ! shouldApplyV3 {
2148
+ return
2149
+ }
2150
+
2151
+ // clean up the Attributes, and we only care about the RaftAttributes
2152
+ cleanAttributesFunc := func (members map [types.ID ]* membership.Member ) map [types.ID ]* membership.Member {
2153
+ processedMembers := make (map [types.ID ]* membership.Member )
2154
+ for id , m := range members {
2155
+ clonedMember := m .Clone ()
2156
+ clonedMember .Attributes = membership.Attributes {}
2157
+ processedMembers [id ] = clonedMember
2158
+ }
2159
+
2160
+ return processedMembers
2161
+ }
2162
+
2163
+ v2Members , _ := s .cluster .MembersFromStore ()
2164
+ v3Members , _ := s .cluster .MembersFromBackend ()
2165
+
2166
+ processedV2Members := cleanAttributesFunc (v2Members )
2167
+ processedV3Members := cleanAttributesFunc (v3Members )
2168
+
2169
+ if match := reflect .DeepEqual (processedV2Members , processedV3Members ); ! match {
2170
+ v2Data , v2Err := json .Marshal (processedV2Members )
2171
+ v3Data , v3Err := json .Marshal (processedV3Members )
2172
+
2173
+ if v2Err != nil || v3Err != nil {
2174
+ panic ("members in v2store doesn't match v3store" )
2175
+ }
2176
+ panic (fmt .Sprintf ("members in v2store doesn't match v3store, v2store: %s, v3store: %s" , string (v2Data ), string (v3Data )))
2177
+ }
2178
+ }
2179
+
2139
2180
// TODO: non-blocking snapshot
2140
2181
func (s * EtcdServer ) snapshot (ep * etcdProgress , toDisk bool ) {
2141
2182
lg := s .Logger ()
0 commit comments