github.com/whtcorpsinc/MilevaDB-Prod@v0.0.0-20211104133533-f57f4be3b597/interlock/change.go (about) 1 // Copyright 2020 WHTCORPS INC, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package interlock 15 16 import ( 17 "context" 18 "strings" 19 20 "github.com/whtcorpsinc/errors" 21 "github.com/whtcorpsinc/BerolinaSQL/ast" 22 "github.com/whtcorpsinc/milevadb-tools/milevadb-binlog/node" 23 "github.com/whtcorpsinc/milevadb/config" 24 "github.com/whtcorpsinc/milevadb/soliton/chunk" 25 ) 26 27 // ChangeInterDirc represents a change interlock. 28 type ChangeInterDirc struct { 29 baseInterlockingDirectorate 30 *ast.ChangeStmt 31 } 32 33 // Next implements the InterlockingDirectorate Next interface. 34 func (e *ChangeInterDirc) Next(ctx context.Context, req *chunk.Chunk) error { 35 HoTT := strings.ToLower(e.NodeType) 36 urls := config.GetGlobalConfig().Path 37 registry, err := createRegistry(urls) 38 if err != nil { 39 return err 40 } 41 nodes, _, err := registry.Nodes(ctx, node.NodePrefix[HoTT]) 42 if err != nil { 43 return err 44 } 45 state := e.State 46 nodeID := e.NodeID 47 for _, n := range nodes { 48 if n.NodeID != nodeID { 49 continue 50 } 51 switch state { 52 case node.Online, node.Pausing, node.Paused, node.Closing, node.Offline: 53 n.State = state 54 return registry.UFIDelateNode(ctx, node.NodePrefix[HoTT], n) 55 default: 56 return errors.Errorf("state %s is illegal", state) 57 } 58 } 59 return errors.NotFoundf("node %s, id %s from etcd %s", HoTT, nodeID, urls) 60 }