github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/master/scheduler/worker_test.go (about) 1 // Copyright 2020 PingCAP, 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 scheduler 15 16 import ( 17 "context" 18 "testing" 19 "time" 20 21 "github.com/pingcap/tiflow/dm/config/security" 22 "github.com/pingcap/tiflow/dm/master/workerrpc" 23 "github.com/pingcap/tiflow/dm/pb" 24 "github.com/pingcap/tiflow/dm/pkg/ha" 25 "github.com/pingcap/tiflow/dm/pkg/terror" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func TestWorker(t *testing.T) { 30 t.Parallel() 31 32 var ( 33 name = "dm-worker-1" 34 info = ha.NewWorkerInfo(name, "127.0.0.1:51803") // must ensure no worker listening one this address. 35 source1 = "mysql-replica-1" 36 source2 = "mysql-replica-2" 37 bound = ha.NewSourceBound(source1, name) 38 ) 39 40 // create a worker with Offline stage and not bound. 41 w, err := NewWorker(info, security.Security{}) 42 require.NoError(t, err) 43 defer w.Close() 44 require.Equal(t, info, w.BaseInfo()) 45 require.Equal(t, WorkerOffline, w.Stage()) 46 require.Equal(t, nullBound, w.Bound()) 47 48 // Offline to Free. 49 w.ToFree() 50 require.Equal(t, WorkerFree, w.Stage()) 51 require.Equal(t, nullBound, w.Bound()) 52 53 // Free to Bound. 54 require.NoError(t, w.ToBound(bound)) 55 require.Equal(t, WorkerBound, w.Stage()) 56 require.Equal(t, bound, w.Bound()) 57 58 // Bound to Free. 59 w.ToFree() 60 require.Equal(t, WorkerFree, w.Stage()) 61 require.Equal(t, nullBound, w.Bound()) 62 63 // Free to Offline. 64 w.ToOffline() 65 require.Equal(t, WorkerOffline, w.Stage()) 66 require.Equal(t, nullBound, w.Bound()) 67 68 // Offline to Bound, invalid. 69 require.True(t, terror.ErrSchedulerWorkerInvalidTrans.Equal(w.ToBound(bound))) 70 require.Equal(t, WorkerOffline, w.Stage()) 71 require.Equal(t, nullBound, w.Bound()) 72 73 // Offline to Free to Bound again. 74 w.ToFree() 75 require.NoError(t, w.ToBound(bound)) 76 require.Equal(t, WorkerBound, w.Stage()) 77 require.Equal(t, bound, w.Bound()) 78 79 // Bound to Offline. 80 w.ToOffline() 81 require.Equal(t, WorkerOffline, w.Stage()) 82 require.Equal(t, nullBound, w.Bound()) 83 84 // Offline to Free to Relay 85 w.ToFree() 86 require.NoError(t, w.StartRelay(source1)) 87 require.Equal(t, WorkerRelay, w.Stage()) 88 require.Equal(t, source1, w.RelaySourceID()) 89 90 // Relay to Free 91 w.StopRelay() 92 require.Equal(t, WorkerFree, w.Stage()) 93 require.Len(t, w.RelaySourceID(), 0) 94 95 // Relay to Bound (bound with relay) 96 require.NoError(t, w.StartRelay(source1)) 97 require.NoError(t, w.ToBound(bound)) 98 require.Equal(t, WorkerBound, w.Stage()) 99 require.Equal(t, bound, w.Bound()) 100 require.Equal(t, source1, w.relaySource) 101 102 // Bound turn off relay 103 w.StopRelay() 104 require.Equal(t, WorkerBound, w.Stage()) 105 require.Len(t, w.relaySource, 0) 106 107 // Bound try to turn on relay, but with wrong source ID 108 err = w.StartRelay(source2) 109 require.True(t, terror.ErrSchedulerRelayWorkersWrongBound.Equal(err)) 110 require.Len(t, w.relaySource, 0) 111 112 // Bound turn on relay 113 require.NoError(t, w.StartRelay(source1)) 114 require.Equal(t, WorkerBound, w.Stage()) 115 require.Equal(t, source1, w.relaySource) 116 117 // Bound to Relay 118 require.NoError(t, w.Unbound()) 119 require.Equal(t, WorkerRelay, w.Stage()) 120 require.Equal(t, nullBound, w.bound) 121 require.Equal(t, source1, w.relaySource) 122 123 // Relay to Offline 124 w.ToOffline() 125 require.Equal(t, WorkerOffline, w.Stage()) 126 require.Equal(t, source1, w.RelaySourceID()) 127 128 // Offline turn off relay (when DM worker is offline, stop-relay) 129 w.StopRelay() 130 require.Equal(t, WorkerOffline, w.stage) 131 require.Len(t, w.RelaySourceID(), 0) 132 133 // SendRequest. 134 req := &workerrpc.Request{ 135 Type: workerrpc.CmdQueryStatus, 136 QueryStatus: &pb.QueryStatusRequest{ 137 Name: "task1", 138 }, 139 } 140 resp, err := w.SendRequest(context.Background(), req, time.Second) 141 require.Contains(t, err.Error(), "connection refused") 142 require.Nil(t, resp) 143 }