2020-09-14 12:25:51 +08:00
package shell
import (
"context"
"flag"
"fmt"
2022-07-29 15:17:28 +08:00
"github.com/seaweedfs/seaweedfs/weed/operation"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/pb/volume_server_pb"
2020-09-14 12:25:51 +08:00
"google.golang.org/grpc"
"io"
)
func init ( ) {
Commands = append ( Commands , & commandVolumeServerLeave { } )
}
type commandVolumeServerLeave struct {
}
func ( c * commandVolumeServerLeave ) Name ( ) string {
return "volumeServer.leave"
}
func ( c * commandVolumeServerLeave ) Help ( ) string {
return ` stop a volume server from sending heartbeats to the master
2024-05-27 16:13:06 +08:00
volumeServer . leave - node < volume server host : port > - force
2020-09-14 12:25:51 +08:00
This command enables gracefully shutting down the volume server .
The volume server will stop sending heartbeats to the master .
After draining the traffic for a few seconds , you can safely shut down the volume server .
This operation is not revocable unless the volume server is restarted .
`
}
2024-09-30 01:38:22 +08:00
func ( c * commandVolumeServerLeave ) HasTag ( CommandTag ) bool {
2024-09-29 11:22:57 +08:00
return false
}
2020-09-14 12:25:51 +08:00
func ( c * commandVolumeServerLeave ) Do ( args [ ] string , commandEnv * CommandEnv , writer io . Writer ) ( err error ) {
vsLeaveCommand := flag . NewFlagSet ( c . Name ( ) , flag . ContinueOnError )
volumeServer := vsLeaveCommand . String ( "node" , "" , "<host>:<port> of the volume server" )
if err = vsLeaveCommand . Parse ( args ) ; err != nil {
return nil
}
2021-12-11 05:24:38 +08:00
if err = commandEnv . confirmIsLocked ( args ) ; err != nil {
2021-09-14 13:13:34 +08:00
return
}
2020-09-14 12:25:51 +08:00
if * volumeServer == "" {
return fmt . Errorf ( "need to specify volume server by -node=<host>:<port>" )
}
2021-09-13 13:47:52 +08:00
return volumeServerLeave ( commandEnv . option . GrpcDialOption , pb . ServerAddress ( * volumeServer ) , writer )
2020-09-14 12:25:51 +08:00
}
2021-09-13 13:47:52 +08:00
func volumeServerLeave ( grpcDialOption grpc . DialOption , volumeServer pb . ServerAddress , writer io . Writer ) ( err error ) {
2021-12-26 16:15:03 +08:00
return operation . WithVolumeServerClient ( false , volumeServer , grpcDialOption , func ( volumeServerClient volume_server_pb . VolumeServerClient ) error {
2020-09-14 12:25:51 +08:00
_ , leaveErr := volumeServerClient . VolumeServerLeave ( context . Background ( ) , & volume_server_pb . VolumeServerLeaveRequest { } )
if leaveErr != nil {
fmt . Fprintf ( writer , "ask volume server %s to leave: %v\n" , volumeServer , leaveErr )
} else {
fmt . Fprintf ( writer , "stopped heartbeat in volume server %s. After a few seconds to drain traffic, it will be safe to stop the volume server.\n" , volumeServer )
}
return leaveErr
} )
}