@@ -35,18 +35,29 @@ import (
3535type mockImportServer struct {
3636 import_sstpb.ImportSSTServer
3737
38+ mu sync.Mutex
39+ modes []import_sstpb.SwitchMode
3840 count int
3941 ch chan struct {}
4042}
4143
4244func (s * mockImportServer ) SwitchMode (_ context.Context , req * import_sstpb.SwitchModeRequest ) (* import_sstpb.SwitchModeResponse , error ) {
45+ s .mu .Lock ()
46+ defer s .mu .Unlock ()
47+ s .modes = append (s .modes , req .GetMode ())
4348 s .count -= 1
44- if s .count == 0 {
49+ if s .count == 0 && s . ch != nil {
4550 s .ch <- struct {}{}
4651 }
4752 return & import_sstpb.SwitchModeResponse {}, nil
4853}
4954
55+ func (s * mockImportServer ) Modes () []import_sstpb.SwitchMode {
56+ s .mu .Lock ()
57+ defer s .mu .Unlock ()
58+ return append ([]import_sstpb.SwitchMode (nil ), s .modes ... )
59+ }
60+
5061func TestRestorePreWork (t * testing.T ) {
5162 ctx := context .Background ()
5263 lis , err := net .Listen ("tcp" , ":0" )
@@ -62,7 +73,9 @@ func TestRestorePreWork(t *testing.T) {
6273 go func () {
6374 defer wg .Done ()
6475 err := s .Serve (lis )
65- require .NoError (t , err )
76+ if err != nil && err != grpc .ErrServerStopped {
77+ require .NoError (t , err )
78+ }
6679 }()
6780
6881 pdClient := split .NewFakePDClient ([]* metapb.Store {
@@ -109,7 +122,7 @@ func TestRestorePreWork(t *testing.T) {
109122 }
110123 }
111124 <- ch
112- restore .RestorePostWork (ctx , switcher , undo )
125+ restore .RestorePostWork (ctx , switcher , undo , false )
113126 // check the cfg done
114127 {
115128 cfgs , err := pdHTTPCli .GetConfig (context .TODO ())
@@ -126,4 +139,53 @@ func TestRestorePreWork(t *testing.T) {
126139
127140 s .Stop ()
128141 lis .Close ()
142+ wg .Wait ()
143+ }
144+
145+ func TestRestorePostWorkOnlineSkipsNormalMode (t * testing.T ) {
146+ ctx := context .Background ()
147+ lis , err := net .Listen ("tcp" , ":0" )
148+ require .NoError (t , err )
149+ addr := lis .Addr ().String ()
150+
151+ s := grpc .NewServer ()
152+ importServer := & mockImportServer {}
153+ import_sstpb .RegisterImportSSTServer (s , importServer )
154+
155+ var wg sync.WaitGroup
156+ wg .Add (1 )
157+ go func () {
158+ defer wg .Done ()
159+ err := s .Serve (lis )
160+ if err != nil && err != grpc .ErrServerStopped {
161+ require .NoError (t , err )
162+ }
163+ }()
164+ defer func () {
165+ s .Stop ()
166+ lis .Close ()
167+ wg .Wait ()
168+ }()
169+
170+ pdClient := split .NewFakePDClient ([]* metapb.Store {
171+ {
172+ Id : 1 ,
173+ Address : addr ,
174+ },
175+ }, false , nil )
176+ switcher := restore .NewImportModeSwitcher (pdClient , time .Hour , nil )
177+ require .NoError (t , switcher .GoSwitchToImportMode (ctx ))
178+ defer func () {
179+ require .NoError (t , switcher .SwitchToNormalMode (ctx ))
180+ }()
181+ require .Equal (t , []import_sstpb.SwitchMode {import_sstpb .SwitchMode_Import }, importServer .Modes ())
182+
183+ restoredSchedulers := false
184+ restore .RestorePostWork (ctx , switcher , func (context.Context ) error {
185+ restoredSchedulers = true
186+ return nil
187+ }, true )
188+
189+ require .True (t , restoredSchedulers )
190+ require .Equal (t , []import_sstpb.SwitchMode {import_sstpb .SwitchMode_Import }, importServer .Modes ())
129191}
0 commit comments