@@ -291,7 +291,7 @@ func (s *Service) IsRunningMaster() (isRunningMaster, isRunning bool, masterURL
291
291
292
292
// HandleGoodbye removes the database servers started by the peer with given id
293
293
// from the cluster and alters the cluster configuration, removing the peer.
294
- func (s * Service ) HandleGoodbye (id string ) (peerRemoved bool , err error ) {
294
+ func (s * Service ) HandleGoodbye (id string , force bool ) (peerRemoved bool , err error ) {
295
295
// Find peer
296
296
s .mutex .Lock ()
297
297
peer , peerFound := s .myPeers .PeerByID (id )
@@ -320,59 +320,79 @@ func (s *Service) HandleGoodbye(id string) (peerRemoved bool, err error) {
320
320
321
321
// Remove dbserver from cluster (if any)
322
322
if peer .HasDBServer () {
323
- // Find id of dbserver
324
- s .log .Info ().Msg ("Finding server ID of dbserver" )
325
- sc , err := peer .CreateDBServerAPI (s .CreateClient )
326
- if err != nil {
327
- return false , maskAny (err )
328
- }
329
- sid , err := sc .ServerID (ctx )
330
- if err != nil {
331
- return false , maskAny (err )
332
- }
333
- // Clean out DB server
334
- s .log .Info ().Msgf ("Starting cleanout of dbserver %s" , sid )
335
- if err := c .CleanOutServer (ctx , sid ); err != nil {
336
- s .log .Warn ().Err (err ).Msgf ("Cleanout requested of dbserver %s failed" , sid )
337
- return false , maskAny (err )
323
+ shutdownServer := func () error {
324
+ // Find id of dbserver
325
+ s .log .Info ().Msg ("Finding server ID of dbserver" )
326
+ sc , err := peer .CreateDBServerAPI (s .CreateClient )
327
+ if err != nil {
328
+ return maskAny (err )
329
+ }
330
+ sid , err := sc .ServerID (ctx )
331
+ if err != nil {
332
+ return maskAny (err )
333
+ }
334
+ // Clean out DB server
335
+ s .log .Info ().Msgf ("Starting cleanout of dbserver %s" , sid )
336
+ if err := c .CleanOutServer (ctx , sid ); err != nil {
337
+ s .log .Warn ().Err (err ).Msgf ("Cleanout requested of dbserver %s failed" , sid )
338
+ return maskAny (err )
339
+ }
340
+ // Wait until server is cleaned out
341
+ s .log .Info ().Msgf ("Waiting for cleanout of dbserver %s to finish" , sid )
342
+ for {
343
+ if cleanedOut , err := c .IsCleanedOut (ctx , sid ); err != nil {
344
+ s .log .Warn ().Err (err ).Msgf ("IsCleanedOut request of dbserver %s failed" , sid )
345
+ return maskAny (err )
346
+ } else if cleanedOut {
347
+ break
348
+ }
349
+ // Wait a bit
350
+ time .Sleep (time .Millisecond * 250 )
351
+ }
352
+ // Remove dbserver from cluster
353
+ s .log .Info ().Msgf ("Removing dbserver %s from cluster" , sid )
354
+ if err := sc .Shutdown (ctx , true ); err != nil {
355
+ s .log .Warn ().Err (err ).Msgf ("Shutdown request of dbserver %s failed" , sid )
356
+ return maskAny (err )
357
+ }
358
+ return nil
338
359
}
339
- // Wait until server is cleaned out
340
- s .log .Info ().Msgf ("Waiting for cleanout of dbserver %s to finish" , sid )
341
- for {
342
- if cleanedOut , err := c .IsCleanedOut (ctx , sid ); err != nil {
343
- s .log .Warn ().Err (err ).Msgf ("IsCleanedOut request of dbserver %s failed" , sid )
360
+ if err := shutdownServer (); err != nil {
361
+ if force {
362
+ s .log .Warn ().Err (err ).Msg ("Failed to properly shutdown dbserver, removing peer anyway" )
363
+ } else {
344
364
return false , maskAny (err )
345
- } else if cleanedOut {
346
- break
347
365
}
348
- // Wait a bit
349
- time .Sleep (time .Millisecond * 250 )
350
- }
351
- // Remove dbserver from cluster
352
- s .log .Info ().Msgf ("Removing dbserver %s from cluster" , sid )
353
- if err := sc .Shutdown (ctx , true ); err != nil {
354
- s .log .Warn ().Err (err ).Msgf ("Shutdown request of dbserver %s failed" , sid )
355
- return false , maskAny (err )
356
366
}
357
367
}
358
368
359
369
// Remove coordinator from cluster (if any)
360
370
if peer .HasCoordinator () {
361
- // Find id of coordinator
362
- s .log .Info ().Msg ("Finding server ID of coordinator" )
363
- sc , err := peer .CreateCoordinatorAPI (s .CreateClient )
364
- if err != nil {
365
- return false , maskAny (err )
366
- }
367
- sid , err := sc .ServerID (ctx )
368
- if err != nil {
369
- return false , maskAny (err )
371
+ shutdownServer := func () error {
372
+ // Find id of coordinator
373
+ s .log .Info ().Msg ("Finding server ID of coordinator" )
374
+ sc , err := peer .CreateCoordinatorAPI (s .CreateClient )
375
+ if err != nil {
376
+ return maskAny (err )
377
+ }
378
+ sid , err := sc .ServerID (ctx )
379
+ if err != nil {
380
+ return maskAny (err )
381
+ }
382
+ // Remove coordinator from cluster
383
+ s .log .Info ().Msgf ("Removing coordinator %s from cluster" , sid )
384
+ if err := sc .Shutdown (ctx , true ); err != nil {
385
+ s .log .Warn ().Err (err ).Msgf ("Shutdown request of coordinator %s failed" , sid )
386
+ return maskAny (err )
387
+ }
388
+ return nil
370
389
}
371
- // Remove coordinator from cluster
372
- s .log .Info ().Msgf ("Removing coordinator %s from cluster" , sid )
373
- if err := sc .Shutdown (ctx , true ); err != nil {
374
- s .log .Warn ().Err (err ).Msgf ("Shutdown request of coordinator %s failed" , sid )
375
- return false , maskAny (err )
390
+ if err := shutdownServer (); err != nil {
391
+ if force {
392
+ s .log .Warn ().Err (err ).Msg ("Failed to properly shutdown coordinator, removing peer anyway" )
393
+ } else {
394
+ return false , maskAny (err )
395
+ }
376
396
}
377
397
}
378
398
0 commit comments