storagenode/cmd: add exit-status command for graceful exit (#3264)

* add exit-status command

* remove todo and fix format

* fix status display

* change startExit to exit progress

* fix linting error

* add successful column in exit progress

* fix test

* remove extra new line

* fix TYPOS

* format the percentage better
This commit is contained in:
Yingrong Zhao 2019-10-15 18:07:32 -04:00 committed by GitHub
parent 37ab84355f
commit 87e3764390
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 579 additions and 296 deletions

View File

@ -7,6 +7,7 @@ import (
"bufio"
"context"
"fmt"
"io"
"os"
"strings"
"text/tabwriter"
@ -39,8 +40,12 @@ func (client *gracefulExitClient) getNonExitingSatellites(ctx context.Context) (
return client.conn.NodeGracefulExitClient().GetNonExitingSatellites(ctx, &pb.GetNonExitingSatellitesRequest{})
}
func (client *gracefulExitClient) initGracefulExit(ctx context.Context, req *pb.StartExitRequest) (*pb.StartExitResponse, error) {
return client.conn.NodeGracefulExitClient().StartExit(ctx, req)
func (client *gracefulExitClient) initGracefulExit(ctx context.Context, req *pb.InitiateGracefulExitRequest) (*pb.ExitProgress, error) {
return client.conn.NodeGracefulExitClient().InitiateGracefulExit(ctx, req)
}
func (client *gracefulExitClient) getExitProgress(ctx context.Context) (*pb.GetExitProgressResponse, error) {
return client.conn.NodeGracefulExitClient().GetExitProgress(ctx, &pb.GetExitProgressRequest{})
}
func (client *gracefulExitClient) close() error {
@ -58,7 +63,7 @@ func cmdGracefulExitInit(cmd *cobra.Command, args []string) error {
}
// display warning message
if !prompt.Confirm("Please be aware that by starting a graceful exit on a satellite, you will no longer be allowed to participate in repairs or uploads from that satellite. This action can not be undone. Are you sure you want to continue? y/n\n") {
if !prompt.Confirm("Please be aware that by starting a graceful exit from a satellite, you will no longer be allowed to participate in repairs or uploads from that satellite. This action can not be undone. Are you sure you want to continue? y/n\n") {
return nil
}
@ -75,26 +80,26 @@ func cmdGracefulExitInit(cmd *cobra.Command, args []string) error {
// get list of satellites
satelliteList, err := client.getNonExitingSatellites(ctx)
if err != nil {
fmt.Println("Can't find any non-existing satellites.")
fmt.Println("Can't find any non-exiting satellites.")
return errs.Wrap(err)
}
if len(satelliteList.GetSatellites()) < 1 {
fmt.Println("Can't find any non-exiting satellites.")
return nil
}
// display satellite options
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintln(w, "Domain Name\tNode ID\tSpace Used\t")
for _, satellite := range satelliteList.GetSatellites() {
fmt.Fprintln(w, satellite.GetDomainName()+"\t"+satellite.NodeId.String()+"\t"+memory.Size(satellite.GetSpaceUsed()).Base10String()+"\t\n")
}
fmt.Fprintln(w, "Please enter the domain name for each satellite you would like to start graceful exit on with a space in between each domain name and hit enter once you are done:")
err = w.Flush()
if err != nil {
return errs.Wrap(err)
fmt.Fprintf(w, "%s\t%s\t%s\t\n", satellite.GetDomainName(), satellite.NodeId.String(), memory.Size(satellite.GetSpaceUsed()).Base10String())
}
fmt.Fprintln(w, "Please enter a space delimited list of satellite domain names you would like to gracefully exit. Press enter to continue:")
var selectedSatellite []string
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
input := scanner.Text()
@ -123,19 +128,90 @@ func cmdGracefulExitInit(cmd *cobra.Command, args []string) error {
}
// save satellites for graceful exit into the db
req := &pb.StartExitRequest{
NodeIds: satelliteIDs,
progresses := make([]*pb.ExitProgress, 0, len(satelliteIDs))
var errgroup errs.Group
for _, id := range satelliteIDs {
req := &pb.InitiateGracefulExitRequest{
NodeId: id,
}
resp, err := client.initGracefulExit(ctx, req)
if err != nil {
zap.S().Debug("initializing graceful exit failed", zap.String("Satellite ID", id.String()), zap.Error(err))
errgroup.Add(err)
continue
}
progresses = append(progresses, resp)
}
resp, err := client.initGracefulExit(ctx, req)
if len(progresses) < 1 {
fmt.Println("Failed to initialize graceful exit. Please try again later.")
return errgroup.Err()
}
displayExitProgress(w, progresses)
err = w.Flush()
if err != nil {
return errs.Wrap(err)
}
for _, status := range resp.Statuses {
if !status.GetSuccess() {
fmt.Printf("Failed to start graceful exit on satellite: %s\n", status.GetDomainName())
continue
}
fmt.Printf("Started graceful exit on satellite: %s\n", status.GetDomainName())
}
return nil
}
func cmdGracefulExitStatus(cmd *cobra.Command, args []string) (err error) {
ctx, _ := process.Ctx(cmd)
ident, err := runCfg.Identity.Load()
if err != nil {
zap.S().Fatal(err)
} else {
zap.S().Info("Node ID: ", ident.ID)
}
client, err := dialGracefulExitClient(ctx, diagCfg.Server.PrivateAddress)
if err != nil {
return errs.Wrap(err)
}
defer func() {
if err := client.close(); err != nil {
zap.S().Debug("closing graceful exit client failed", err)
}
}()
// call get status to get status for all satellites' that are in exiting
progresses, err := client.getExitProgress(ctx)
if err != nil {
return errs.Wrap(err)
}
if len(progresses.GetProgress()) < 1 {
fmt.Println("No graceful exit in progress.")
return nil
}
// display exit progress
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
defer func() {
err = w.Flush()
if err != nil {
err = errs.Wrap(err)
}
}()
displayExitProgress(w, progresses.GetProgress())
return nil
}
func displayExitProgress(w io.Writer, progresses []*pb.ExitProgress) {
fmt.Fprintln(w, "\nDomain Name\tNode ID\tPercent Complete\tSuccessful")
for _, progress := range progresses {
isSuccessful := "N"
if progress.Successful {
isSuccessful = "Y"
}
fmt.Fprintf(w, "%s\t%s\t%.2f%%\t%s\t\n", progress.GetDomainName(), progress.NodeId.String(), progress.GetPercentComplete(), isSuccessful)
}
}

View File

@ -75,6 +75,12 @@ var (
RunE: cmdGracefulExitInit,
Annotations: map[string]string{"type": "helper"},
}
gracefulExitStatusCmd = &cobra.Command{
Use: "exit-status",
Short: "Display graceful exit status",
RunE: cmdGracefulExitStatus,
Annotations: map[string]string{"type": "helper"},
}
runCfg StorageNodeFlags
setupCfg StorageNodeFlags
@ -107,12 +113,14 @@ func init() {
rootCmd.AddCommand(diagCmd)
rootCmd.AddCommand(dashboardCmd)
rootCmd.AddCommand(gracefulExitInitCmd)
rootCmd.AddCommand(gracefulExitStatusCmd)
process.Bind(runCmd, &runCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir))
process.Bind(setupCmd, &setupCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir), cfgstruct.SetupMode())
process.Bind(configCmd, &setupCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir), cfgstruct.SetupMode())
process.Bind(diagCmd, &diagCfg, defaults, cfgstruct.ConfDir(confDir), cfgstruct.IdentityDir(identityDir))
process.Bind(dashboardCmd, &dashboardCfg, defaults, cfgstruct.ConfDir(defaultDiagDir))
process.Bind(gracefulExitInitCmd, &diagCfg, defaults, cfgstruct.ConfDir(defaultDiagDir))
process.Bind(gracefulExitStatusCmd, &diagCfg, defaults, cfgstruct.ConfDir(defaultDiagDir))
}
func databaseConfig(config storagenode.Config) storagenodedb.Config {

View File

@ -49,7 +49,7 @@ func (x TransferFailed_Error) String() string {
}
func (TransferFailed_Error) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{7, 0}
return fileDescriptor_8f0acbf2ce5fa631, []int{8, 0}
}
type ExitFailed_Reason int32
@ -71,7 +71,7 @@ func (x ExitFailed_Reason) String() string {
}
func (ExitFailed_Reason) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{13, 0}
return fileDescriptor_8f0acbf2ce5fa631, []int{14, 0}
}
type GetNonExitingSatellitesRequest struct {
@ -104,36 +104,36 @@ func (m *GetNonExitingSatellitesRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_GetNonExitingSatellitesRequest proto.InternalMessageInfo
type StartExitRequest struct {
NodeIds []NodeID `protobuf:"bytes,1,rep,name=node_ids,json=nodeIds,proto3,customtype=NodeID" json:"node_ids"`
type InitiateGracefulExitRequest struct {
NodeId NodeID `protobuf:"bytes,1,opt,name=node_id,json=nodeId,proto3,customtype=NodeID" json:"node_id"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *StartExitRequest) Reset() { *m = StartExitRequest{} }
func (m *StartExitRequest) String() string { return proto.CompactTextString(m) }
func (*StartExitRequest) ProtoMessage() {}
func (*StartExitRequest) Descriptor() ([]byte, []int) {
func (m *InitiateGracefulExitRequest) Reset() { *m = InitiateGracefulExitRequest{} }
func (m *InitiateGracefulExitRequest) String() string { return proto.CompactTextString(m) }
func (*InitiateGracefulExitRequest) ProtoMessage() {}
func (*InitiateGracefulExitRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{1}
}
func (m *StartExitRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartExitRequest.Unmarshal(m, b)
func (m *InitiateGracefulExitRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitiateGracefulExitRequest.Unmarshal(m, b)
}
func (m *StartExitRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_StartExitRequest.Marshal(b, m, deterministic)
func (m *InitiateGracefulExitRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_InitiateGracefulExitRequest.Marshal(b, m, deterministic)
}
func (m *StartExitRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_StartExitRequest.Merge(m, src)
func (m *InitiateGracefulExitRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_InitiateGracefulExitRequest.Merge(m, src)
}
func (m *StartExitRequest) XXX_Size() int {
return xxx_messageInfo_StartExitRequest.Size(m)
func (m *InitiateGracefulExitRequest) XXX_Size() int {
return xxx_messageInfo_InitiateGracefulExitRequest.Size(m)
}
func (m *StartExitRequest) XXX_DiscardUnknown() {
xxx_messageInfo_StartExitRequest.DiscardUnknown(m)
func (m *InitiateGracefulExitRequest) XXX_DiscardUnknown() {
xxx_messageInfo_InitiateGracefulExitRequest.DiscardUnknown(m)
}
var xxx_messageInfo_StartExitRequest proto.InternalMessageInfo
var xxx_messageInfo_InitiateGracefulExitRequest proto.InternalMessageInfo
// NonExitingSatellite contains information that's needed for a storagenode to start graceful exit
type NonExitingSatellite struct {
@ -221,91 +221,129 @@ func (m *GetNonExitingSatellitesResponse) GetSatellites() []*NonExitingSatellite
return nil
}
// StartExitStatus indicates the result of graceful exit initialization from a storagenode
type StartExitStatus struct {
DomainName string `protobuf:"bytes,1,opt,name=domain_name,json=domainName,proto3" json:"domain_name,omitempty"`
Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"`
type GetExitProgressRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *StartExitStatus) Reset() { *m = StartExitStatus{} }
func (m *StartExitStatus) String() string { return proto.CompactTextString(m) }
func (*StartExitStatus) ProtoMessage() {}
func (*StartExitStatus) Descriptor() ([]byte, []int) {
func (m *GetExitProgressRequest) Reset() { *m = GetExitProgressRequest{} }
func (m *GetExitProgressRequest) String() string { return proto.CompactTextString(m) }
func (*GetExitProgressRequest) ProtoMessage() {}
func (*GetExitProgressRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{4}
}
func (m *StartExitStatus) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartExitStatus.Unmarshal(m, b)
func (m *GetExitProgressRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetExitProgressRequest.Unmarshal(m, b)
}
func (m *StartExitStatus) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_StartExitStatus.Marshal(b, m, deterministic)
func (m *GetExitProgressRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GetExitProgressRequest.Marshal(b, m, deterministic)
}
func (m *StartExitStatus) XXX_Merge(src proto.Message) {
xxx_messageInfo_StartExitStatus.Merge(m, src)
func (m *GetExitProgressRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetExitProgressRequest.Merge(m, src)
}
func (m *StartExitStatus) XXX_Size() int {
return xxx_messageInfo_StartExitStatus.Size(m)
func (m *GetExitProgressRequest) XXX_Size() int {
return xxx_messageInfo_GetExitProgressRequest.Size(m)
}
func (m *StartExitStatus) XXX_DiscardUnknown() {
xxx_messageInfo_StartExitStatus.DiscardUnknown(m)
func (m *GetExitProgressRequest) XXX_DiscardUnknown() {
xxx_messageInfo_GetExitProgressRequest.DiscardUnknown(m)
}
var xxx_messageInfo_StartExitStatus proto.InternalMessageInfo
var xxx_messageInfo_GetExitProgressRequest proto.InternalMessageInfo
func (m *StartExitStatus) GetDomainName() string {
type GetExitProgressResponse struct {
Progress []*ExitProgress `protobuf:"bytes,1,rep,name=progress,proto3" json:"progress,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *GetExitProgressResponse) Reset() { *m = GetExitProgressResponse{} }
func (m *GetExitProgressResponse) String() string { return proto.CompactTextString(m) }
func (*GetExitProgressResponse) ProtoMessage() {}
func (*GetExitProgressResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{5}
}
func (m *GetExitProgressResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetExitProgressResponse.Unmarshal(m, b)
}
func (m *GetExitProgressResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_GetExitProgressResponse.Marshal(b, m, deterministic)
}
func (m *GetExitProgressResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_GetExitProgressResponse.Merge(m, src)
}
func (m *GetExitProgressResponse) XXX_Size() int {
return xxx_messageInfo_GetExitProgressResponse.Size(m)
}
func (m *GetExitProgressResponse) XXX_DiscardUnknown() {
xxx_messageInfo_GetExitProgressResponse.DiscardUnknown(m)
}
var xxx_messageInfo_GetExitProgressResponse proto.InternalMessageInfo
func (m *GetExitProgressResponse) GetProgress() []*ExitProgress {
if m != nil {
return m.Progress
}
return nil
}
type ExitProgress struct {
DomainName string `protobuf:"bytes,1,opt,name=domain_name,json=domainName,proto3" json:"domain_name,omitempty"`
NodeId NodeID `protobuf:"bytes,2,opt,name=node_id,json=nodeId,proto3,customtype=NodeID" json:"node_id"`
PercentComplete float32 `protobuf:"fixed32,3,opt,name=percent_complete,json=percentComplete,proto3" json:"percent_complete,omitempty"`
Successful bool `protobuf:"varint,4,opt,name=successful,proto3" json:"successful,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ExitProgress) Reset() { *m = ExitProgress{} }
func (m *ExitProgress) String() string { return proto.CompactTextString(m) }
func (*ExitProgress) ProtoMessage() {}
func (*ExitProgress) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{6}
}
func (m *ExitProgress) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExitProgress.Unmarshal(m, b)
}
func (m *ExitProgress) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ExitProgress.Marshal(b, m, deterministic)
}
func (m *ExitProgress) XXX_Merge(src proto.Message) {
xxx_messageInfo_ExitProgress.Merge(m, src)
}
func (m *ExitProgress) XXX_Size() int {
return xxx_messageInfo_ExitProgress.Size(m)
}
func (m *ExitProgress) XXX_DiscardUnknown() {
xxx_messageInfo_ExitProgress.DiscardUnknown(m)
}
var xxx_messageInfo_ExitProgress proto.InternalMessageInfo
func (m *ExitProgress) GetDomainName() string {
if m != nil {
return m.DomainName
}
return ""
}
func (m *StartExitStatus) GetSuccess() bool {
func (m *ExitProgress) GetPercentComplete() float32 {
if m != nil {
return m.Success
return m.PercentComplete
}
return 0
}
func (m *ExitProgress) GetSuccessful() bool {
if m != nil {
return m.Successful
}
return false
}
type StartExitResponse struct {
Statuses []*StartExitStatus `protobuf:"bytes,1,rep,name=statuses,proto3" json:"statuses,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *StartExitResponse) Reset() { *m = StartExitResponse{} }
func (m *StartExitResponse) String() string { return proto.CompactTextString(m) }
func (*StartExitResponse) ProtoMessage() {}
func (*StartExitResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{5}
}
func (m *StartExitResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StartExitResponse.Unmarshal(m, b)
}
func (m *StartExitResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_StartExitResponse.Marshal(b, m, deterministic)
}
func (m *StartExitResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_StartExitResponse.Merge(m, src)
}
func (m *StartExitResponse) XXX_Size() int {
return xxx_messageInfo_StartExitResponse.Size(m)
}
func (m *StartExitResponse) XXX_DiscardUnknown() {
xxx_messageInfo_StartExitResponse.DiscardUnknown(m)
}
var xxx_messageInfo_StartExitResponse proto.InternalMessageInfo
func (m *StartExitResponse) GetStatuses() []*StartExitStatus {
if m != nil {
return m.Statuses
}
return nil
}
type TransferSucceeded struct {
AddressedOrderLimit *AddressedOrderLimit `protobuf:"bytes,1,opt,name=addressed_order_limit,json=addressedOrderLimit,proto3" json:"addressed_order_limit,omitempty"`
OriginalPieceHash *PieceHash `protobuf:"bytes,2,opt,name=original_piece_hash,json=originalPieceHash,proto3" json:"original_piece_hash,omitempty"`
@ -320,7 +358,7 @@ func (m *TransferSucceeded) Reset() { *m = TransferSucceeded{} }
func (m *TransferSucceeded) String() string { return proto.CompactTextString(m) }
func (*TransferSucceeded) ProtoMessage() {}
func (*TransferSucceeded) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{6}
return fileDescriptor_8f0acbf2ce5fa631, []int{7}
}
func (m *TransferSucceeded) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TransferSucceeded.Unmarshal(m, b)
@ -373,7 +411,7 @@ func (m *TransferFailed) Reset() { *m = TransferFailed{} }
func (m *TransferFailed) String() string { return proto.CompactTextString(m) }
func (*TransferFailed) ProtoMessage() {}
func (*TransferFailed) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{7}
return fileDescriptor_8f0acbf2ce5fa631, []int{8}
}
func (m *TransferFailed) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TransferFailed.Unmarshal(m, b)
@ -414,7 +452,7 @@ func (m *StorageNodeMessage) Reset() { *m = StorageNodeMessage{} }
func (m *StorageNodeMessage) String() string { return proto.CompactTextString(m) }
func (*StorageNodeMessage) ProtoMessage() {}
func (*StorageNodeMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{8}
return fileDescriptor_8f0acbf2ce5fa631, []int{9}
}
func (m *StorageNodeMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StorageNodeMessage.Unmarshal(m, b)
@ -553,7 +591,7 @@ func (m *NotReady) Reset() { *m = NotReady{} }
func (m *NotReady) String() string { return proto.CompactTextString(m) }
func (*NotReady) ProtoMessage() {}
func (*NotReady) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{9}
return fileDescriptor_8f0acbf2ce5fa631, []int{10}
}
func (m *NotReady) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NotReady.Unmarshal(m, b)
@ -587,7 +625,7 @@ func (m *TransferPiece) Reset() { *m = TransferPiece{} }
func (m *TransferPiece) String() string { return proto.CompactTextString(m) }
func (*TransferPiece) ProtoMessage() {}
func (*TransferPiece) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{10}
return fileDescriptor_8f0acbf2ce5fa631, []int{11}
}
func (m *TransferPiece) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TransferPiece.Unmarshal(m, b)
@ -625,7 +663,7 @@ func (m *DeletePiece) Reset() { *m = DeletePiece{} }
func (m *DeletePiece) String() string { return proto.CompactTextString(m) }
func (*DeletePiece) ProtoMessage() {}
func (*DeletePiece) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{11}
return fileDescriptor_8f0acbf2ce5fa631, []int{12}
}
func (m *DeletePiece) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DeletePiece.Unmarshal(m, b)
@ -657,7 +695,7 @@ func (m *ExitCompleted) Reset() { *m = ExitCompleted{} }
func (m *ExitCompleted) String() string { return proto.CompactTextString(m) }
func (*ExitCompleted) ProtoMessage() {}
func (*ExitCompleted) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{12}
return fileDescriptor_8f0acbf2ce5fa631, []int{13}
}
func (m *ExitCompleted) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExitCompleted.Unmarshal(m, b)
@ -697,7 +735,7 @@ func (m *ExitFailed) Reset() { *m = ExitFailed{} }
func (m *ExitFailed) String() string { return proto.CompactTextString(m) }
func (*ExitFailed) ProtoMessage() {}
func (*ExitFailed) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{13}
return fileDescriptor_8f0acbf2ce5fa631, []int{14}
}
func (m *ExitFailed) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExitFailed.Unmarshal(m, b)
@ -748,7 +786,7 @@ func (m *SatelliteMessage) Reset() { *m = SatelliteMessage{} }
func (m *SatelliteMessage) String() string { return proto.CompactTextString(m) }
func (*SatelliteMessage) ProtoMessage() {}
func (*SatelliteMessage) Descriptor() ([]byte, []int) {
return fileDescriptor_8f0acbf2ce5fa631, []int{14}
return fileDescriptor_8f0acbf2ce5fa631, []int{15}
}
func (m *SatelliteMessage) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SatelliteMessage.Unmarshal(m, b)
@ -971,11 +1009,12 @@ func init() {
proto.RegisterEnum("gracefulexit.TransferFailed_Error", TransferFailed_Error_name, TransferFailed_Error_value)
proto.RegisterEnum("gracefulexit.ExitFailed_Reason", ExitFailed_Reason_name, ExitFailed_Reason_value)
proto.RegisterType((*GetNonExitingSatellitesRequest)(nil), "gracefulexit.GetNonExitingSatellitesRequest")
proto.RegisterType((*StartExitRequest)(nil), "gracefulexit.StartExitRequest")
proto.RegisterType((*InitiateGracefulExitRequest)(nil), "gracefulexit.InitiateGracefulExitRequest")
proto.RegisterType((*NonExitingSatellite)(nil), "gracefulexit.NonExitingSatellite")
proto.RegisterType((*GetNonExitingSatellitesResponse)(nil), "gracefulexit.GetNonExitingSatellitesResponse")
proto.RegisterType((*StartExitStatus)(nil), "gracefulexit.StartExitStatus")
proto.RegisterType((*StartExitResponse)(nil), "gracefulexit.StartExitResponse")
proto.RegisterType((*GetExitProgressRequest)(nil), "gracefulexit.GetExitProgressRequest")
proto.RegisterType((*GetExitProgressResponse)(nil), "gracefulexit.GetExitProgressResponse")
proto.RegisterType((*ExitProgress)(nil), "gracefulexit.ExitProgress")
proto.RegisterType((*TransferSucceeded)(nil), "gracefulexit.TransferSucceeded")
proto.RegisterType((*TransferFailed)(nil), "gracefulexit.TransferFailed")
proto.RegisterType((*StorageNodeMessage)(nil), "gracefulexit.StorageNodeMessage")
@ -990,79 +1029,84 @@ func init() {
func init() { proto.RegisterFile("gracefulexit.proto", fileDescriptor_8f0acbf2ce5fa631) }
var fileDescriptor_8f0acbf2ce5fa631 = []byte{
// 995 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xdd, 0x6e, 0x1a, 0x47,
0x14, 0x66, 0xed, 0x04, 0xcc, 0x01, 0x63, 0x3c, 0x8e, 0x6d, 0xea, 0x26, 0x81, 0xec, 0x4d, 0x5d,
0xa9, 0xb5, 0x2a, 0xf7, 0x5f, 0x51, 0x5b, 0xe1, 0x80, 0x81, 0x86, 0x2e, 0xee, 0x60, 0xa7, 0x52,
0x6f, 0x56, 0x13, 0xe6, 0x18, 0xaf, 0x0a, 0xbb, 0x74, 0x66, 0x88, 0xe2, 0x9b, 0x3e, 0x47, 0xaf,
0xfa, 0x0a, 0x7d, 0x8d, 0xaa, 0x4f, 0xd0, 0x56, 0x6a, 0x9e, 0xa5, 0x9a, 0xd9, 0x61, 0xcd, 0x62,
0x88, 0xa2, 0xe6, 0x6e, 0xe7, 0xcc, 0x77, 0xbe, 0xf9, 0xe6, 0x9c, 0x6f, 0x66, 0x16, 0xc8, 0x50,
0xb0, 0x01, 0x5e, 0x4e, 0x47, 0xf8, 0x32, 0x50, 0x47, 0x13, 0x11, 0xa9, 0x88, 0x14, 0xe7, 0x63,
0x07, 0x30, 0x8c, 0x86, 0x51, 0x3c, 0x73, 0x50, 0x1a, 0xa3, 0x62, 0x41, 0x78, 0x39, 0x1b, 0x17,
0x23, 0xc1, 0x51, 0xc8, 0x78, 0xe4, 0xd6, 0xe0, 0x61, 0x0b, 0x95, 0x17, 0x85, 0xcd, 0x97, 0x81,
0x0a, 0xc2, 0x61, 0x9f, 0x29, 0x1c, 0x8d, 0x02, 0x85, 0x92, 0xe2, 0xcf, 0x53, 0x94, 0xca, 0xfd,
0x0a, 0xca, 0x7d, 0xc5, 0x84, 0xd2, 0x00, 0x1b, 0x23, 0xef, 0xc3, 0x46, 0x18, 0x71, 0xf4, 0x03,
0x2e, 0x2b, 0x4e, 0x6d, 0xfd, 0xb0, 0x78, 0x52, 0xfa, 0xe3, 0x55, 0x35, 0xf3, 0xcf, 0xab, 0x6a,
0xd6, 0x8b, 0x38, 0x76, 0x1a, 0x34, 0xa7, 0xe7, 0x3b, 0x5c, 0xba, 0xbf, 0xc0, 0xce, 0x12, 0x76,
0xf2, 0x1e, 0xe4, 0x2c, 0x43, 0xc5, 0xa9, 0x39, 0x4b, 0x08, 0xb2, 0x31, 0x01, 0xa9, 0x42, 0x81,
0x47, 0x63, 0x16, 0x84, 0x7e, 0xc8, 0xc6, 0x58, 0x59, 0xab, 0x39, 0x87, 0x79, 0x0a, 0x71, 0xc8,
0x63, 0x63, 0x24, 0x0f, 0x00, 0xe4, 0x84, 0x0d, 0xd0, 0x9f, 0x4a, 0xe4, 0x95, 0xf5, 0x9a, 0x73,
0xe8, 0xd0, 0xbc, 0x89, 0x5c, 0x48, 0xe4, 0x2e, 0x87, 0xea, 0xca, 0x0d, 0xca, 0x49, 0x14, 0x4a,
0x24, 0x75, 0x00, 0x99, 0x44, 0xcd, 0x7e, 0x0a, 0xc7, 0x8f, 0x8e, 0x52, 0x45, 0x5e, 0x92, 0x4f,
0xe7, 0x92, 0xdc, 0x2e, 0x6c, 0x25, 0x45, 0xea, 0x2b, 0xa6, 0xa6, 0x72, 0x51, 0xb8, 0x73, 0x4b,
0x78, 0x05, 0x72, 0x72, 0x3a, 0x18, 0xa0, 0x94, 0x66, 0x57, 0x1b, 0x74, 0x36, 0x74, 0x3d, 0xd8,
0x9e, 0x2b, 0xb9, 0x55, 0xf9, 0x25, 0x6c, 0x48, 0xc3, 0x9c, 0x68, 0x7c, 0x90, 0xd6, 0xb8, 0x20,
0x80, 0x26, 0x70, 0xf7, 0xf7, 0x35, 0xd8, 0x3e, 0x17, 0x2c, 0x94, 0x97, 0x28, 0xfa, 0x7a, 0x0d,
0xe4, 0xc8, 0xc9, 0xf7, 0xb0, 0xcb, 0x38, 0x17, 0x28, 0x25, 0x72, 0xdf, 0x98, 0xc2, 0x1f, 0x05,
0xe3, 0x40, 0x19, 0xa9, 0x9a, 0x3d, 0x31, 0x4e, 0x7d, 0x06, 0xeb, 0x69, 0x54, 0x57, 0x83, 0xe8,
0x0e, 0xbb, 0x1d, 0x24, 0x75, 0xd8, 0x89, 0x44, 0x30, 0x0c, 0x42, 0x36, 0xf2, 0x27, 0x01, 0x0e,
0xd0, 0xbf, 0x62, 0xf2, 0xca, 0x6c, 0xaf, 0x70, 0xbc, 0x7d, 0x64, 0x9d, 0x77, 0xa6, 0x67, 0xda,
0x4c, 0x5e, 0xd1, 0xed, 0x19, 0x3a, 0x09, 0x91, 0x16, 0xec, 0x09, 0x9c, 0x8c, 0xd8, 0x00, 0xc7,
0x18, 0xaa, 0x79, 0x96, 0xf5, 0x55, 0x2c, 0xf7, 0xe6, 0x12, 0x6e, 0x88, 0x1e, 0xc3, 0xf6, 0x82,
0x96, 0x80, 0x57, 0xee, 0x18, 0xaf, 0x6d, 0x59, 0xaf, 0xe5, 0x0c, 0xba, 0xd3, 0xa0, 0x5b, 0x29,
0x1d, 0x1d, 0xee, 0xfe, 0xe9, 0x40, 0x69, 0x56, 0xb1, 0x53, 0x16, 0x8c, 0x90, 0x2f, 0xe7, 0x73,
0xde, 0x8c, 0x8f, 0x7c, 0x01, 0x77, 0x51, 0x88, 0x48, 0x98, 0x52, 0x94, 0x8e, 0xdd, 0x74, 0xe7,
0xd2, 0x2b, 0x1d, 0x35, 0x35, 0x92, 0xc6, 0x09, 0x6e, 0x1d, 0xee, 0x9a, 0x31, 0xd9, 0x84, 0xbc,
0xd7, 0x3b, 0xf7, 0x4f, 0x7b, 0x17, 0x5e, 0xa3, 0x9c, 0x21, 0xf7, 0xa1, 0xd2, 0x3f, 0xef, 0xd1,
0x7a, 0xab, 0xe9, 0x7b, 0xbd, 0x46, 0xd3, 0xbf, 0xf0, 0xea, 0xcf, 0xea, 0x9d, 0x6e, 0xfd, 0xa4,
0xdb, 0x2c, 0x3b, 0xa4, 0x00, 0xb9, 0x0b, 0xef, 0xa9, 0xd7, 0xfb, 0xc1, 0x2b, 0xaf, 0xb9, 0xbf,
0x3a, 0x40, 0xfa, 0x2a, 0x12, 0x6c, 0x88, 0xfa, 0x70, 0x7d, 0x87, 0x52, 0xb2, 0x21, 0x92, 0x6f,
0x20, 0x2f, 0x67, 0x66, 0xb0, 0x3d, 0xaf, 0x2e, 0xd7, 0x95, 0x78, 0xa6, 0x9d, 0xa1, 0x37, 0x39,
0xe4, 0x33, 0xc8, 0x5e, 0x1a, 0xc5, 0xb6, 0xc1, 0xf7, 0x5f, 0xb7, 0xab, 0x76, 0x86, 0x5a, 0xf4,
0x49, 0x1e, 0x72, 0x56, 0x83, 0x0b, 0xb0, 0xe1, 0x45, 0x8a, 0x22, 0xe3, 0xd7, 0xee, 0xdf, 0x0e,
0x6c, 0xce, 0x72, 0x4c, 0xdd, 0xde, 0xb6, 0xe4, 0x85, 0x89, 0x08, 0x5e, 0x30, 0x85, 0xfe, 0x4f,
0x78, 0x6d, 0x24, 0x16, 0x4f, 0xf6, 0x6d, 0xda, 0x96, 0x41, 0x9d, 0xc5, 0xf3, 0x4f, 0xf1, 0x9a,
0xc2, 0x24, 0xf9, 0x5e, 0x7d, 0x30, 0xd6, 0xff, 0xef, 0xc1, 0x70, 0xbf, 0x85, 0x42, 0x03, 0x47,
0xa8, 0xf0, 0xed, 0x37, 0xe6, 0xb6, 0x60, 0x53, 0x9f, 0xf2, 0x27, 0xd1, 0x78, 0xa2, 0x19, 0x75,
0x1f, 0xf6, 0x75, 0xc1, 0xfd, 0x81, 0x8d, 0xf8, 0x32, 0x18, 0x86, 0x4c, 0x4d, 0x45, 0x7c, 0xeb,
0x14, 0xe9, 0x2e, 0xce, 0xe1, 0xfb, 0xb3, 0x49, 0xf7, 0x37, 0x07, 0x40, 0x33, 0x59, 0x83, 0x7f,
0x02, 0x7b, 0x86, 0x46, 0x77, 0x69, 0x2a, 0x6e, 0xb3, 0xdc, 0x43, 0x8b, 0x9d, 0x8a, 0x1b, 0x12,
0xf2, 0x39, 0x64, 0x05, 0x32, 0x19, 0x85, 0xd6, 0xda, 0x0b, 0x16, 0xba, 0xe1, 0x3f, 0xa2, 0x06,
0x46, 0x2d, 0xdc, 0x7d, 0x04, 0xd9, 0x38, 0x42, 0xf6, 0x61, 0xe7, 0x59, 0x93, 0x76, 0x4e, 0x3b,
0x4f, 0xea, 0xe7, 0x9d, 0x9e, 0xe7, 0x9f, 0xd6, 0x3b, 0xdd, 0x66, 0xa3, 0x9c, 0x71, 0xff, 0x5d,
0x83, 0x72, 0x72, 0xdf, 0xce, 0x6c, 0xfb, 0x29, 0xe4, 0xc3, 0x48, 0xf9, 0x42, 0x7b, 0xc6, 0xda,
0x76, 0x6f, 0xf1, 0xb2, 0x8e, 0x1d, 0xd5, 0xce, 0xd0, 0x8d, 0xd0, 0x7e, 0x93, 0x06, 0x94, 0x94,
0x35, 0x57, 0x5c, 0x72, 0x6b, 0xda, 0x77, 0x97, 0x9b, 0x36, 0xbe, 0x47, 0x32, 0x74, 0x53, 0xa5,
0x1c, 0xf9, 0x35, 0x14, 0xb9, 0xe9, 0xa3, 0xe5, 0x88, 0x1d, 0xf1, 0x4e, 0x9a, 0x63, 0xae, 0xd3,
0xed, 0x0c, 0x2d, 0xf0, 0xb9, 0xc6, 0x37, 0xa0, 0x94, 0x6a, 0x55, 0x7c, 0x23, 0xdd, 0x52, 0x91,
0xea, 0xaf, 0x56, 0x81, 0xa9, 0x86, 0x3f, 0x86, 0x42, 0xd2, 0x29, 0xe4, 0x95, 0xbb, 0x86, 0xa2,
0xb2, 0xaa, 0xf0, 0xed, 0x0c, 0x05, 0x4c, 0x46, 0x73, 0xa7, 0xef, 0xf8, 0x2f, 0x07, 0xca, 0xfa,
0x46, 0x68, 0xd9, 0x44, 0x9d, 0x43, 0x5e, 0xc0, 0xfe, 0x8a, 0x07, 0x93, 0x7c, 0x90, 0x5e, 0xe2,
0xf5, 0x3f, 0x0e, 0x07, 0x1f, 0xbe, 0x21, 0xda, 0xbe, 0x6f, 0x5d, 0xc8, 0x27, 0x2f, 0x18, 0x79,
0xb8, 0xe2, 0x69, 0x9b, 0x71, 0x57, 0x57, 0xce, 0xc7, 0x6c, 0xc7, 0x57, 0xb0, 0x9b, 0xac, 0x91,
0xda, 0x5e, 0x0f, 0x72, 0x67, 0x22, 0xd2, 0xcf, 0x2c, 0xa9, 0x2d, 0x92, 0x2c, 0x5e, 0x91, 0x07,
0x8b, 0x32, 0x16, 0xbc, 0x78, 0xe8, 0x7c, 0xe4, 0x9c, 0xdc, 0xf9, 0x71, 0x6d, 0xf2, 0xfc, 0x79,
0xd6, 0xfc, 0x4e, 0x7d, 0xfc, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3d, 0x50, 0xc8, 0xa3, 0x9c,
0x09, 0x00, 0x00,
// 1053 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0xe1, 0x6e, 0x1b, 0x45,
0x10, 0xf6, 0x39, 0xad, 0x13, 0x8f, 0x1d, 0xc7, 0xd9, 0xb4, 0x89, 0x71, 0xdb, 0xd8, 0x3d, 0x81,
0x70, 0x25, 0x88, 0x90, 0x81, 0x82, 0x54, 0x09, 0xe4, 0xd4, 0x8e, 0x6d, 0x1a, 0xce, 0xe9, 0x26,
0x29, 0x12, 0x12, 0x9c, 0xb6, 0xbe, 0x89, 0x73, 0xc2, 0xbe, 0x3b, 0x76, 0xd7, 0x55, 0xf3, 0x87,
0xe7, 0xe0, 0x17, 0x7f, 0x78, 0x00, 0x5e, 0x03, 0x78, 0x03, 0x90, 0xe8, 0xb3, 0xa0, 0xbd, 0x5b,
0x5f, 0xee, 0x6c, 0x27, 0x44, 0xf4, 0xdf, 0xdd, 0xcc, 0x37, 0xb3, 0xb3, 0xdf, 0x7c, 0x3b, 0xbb,
0x40, 0x46, 0x9c, 0x0d, 0xf1, 0x6c, 0x3a, 0xc6, 0xd7, 0xae, 0xdc, 0x0b, 0xb8, 0x2f, 0x7d, 0x52,
0x4c, 0xda, 0xaa, 0x30, 0xf2, 0x47, 0x7e, 0xe4, 0xa9, 0x96, 0x26, 0x28, 0x99, 0xeb, 0x9d, 0xcd,
0xfe, 0x8b, 0x3e, 0x77, 0x90, 0x8b, 0xe8, 0xcf, 0xac, 0xc3, 0x6e, 0x17, 0xa5, 0xe5, 0x7b, 0x9d,
0xd7, 0xae, 0x74, 0xbd, 0xd1, 0x31, 0x93, 0x38, 0x1e, 0xbb, 0x12, 0x05, 0xc5, 0x1f, 0xa7, 0x28,
0xa4, 0x79, 0x00, 0xf7, 0xfa, 0x9e, 0x2b, 0x5d, 0x26, 0xb1, 0xab, 0xd7, 0x50, 0x58, 0xed, 0x26,
0xef, 0xc3, 0xaa, 0xe7, 0x3b, 0x68, 0xbb, 0x4e, 0xc5, 0xa8, 0x1b, 0x8d, 0xe2, 0x7e, 0xe9, 0xf7,
0x37, 0xb5, 0xcc, 0xdf, 0x6f, 0x6a, 0x39, 0xcb, 0x77, 0xb0, 0xdf, 0xa6, 0x39, 0xe5, 0xee, 0x3b,
0xe6, 0x4f, 0xb0, 0xb5, 0x64, 0x99, 0x1b, 0xc7, 0x93, 0x1a, 0x14, 0x1c, 0x7f, 0xc2, 0x5c, 0xcf,
0xf6, 0xd8, 0x04, 0x2b, 0xd9, 0xba, 0xd1, 0xc8, 0x53, 0x88, 0x4c, 0x16, 0x9b, 0x20, 0x79, 0x00,
0x20, 0x02, 0x36, 0x44, 0x7b, 0x2a, 0xd0, 0xa9, 0xac, 0xd4, 0x8d, 0x86, 0x41, 0xf3, 0xa1, 0xe5,
0x54, 0xa0, 0x63, 0x3a, 0x50, 0xbb, 0x72, 0xa7, 0x22, 0xf0, 0x3d, 0x81, 0xa4, 0x05, 0x20, 0x62,
0x6b, 0xc5, 0xa8, 0xaf, 0x34, 0x0a, 0xcd, 0x87, 0x7b, 0x29, 0xb6, 0x97, 0xc4, 0xd3, 0x44, 0x90,
0x59, 0x81, 0xed, 0x2e, 0x4a, 0x05, 0x39, 0xe2, 0xfe, 0x88, 0xa3, 0x88, 0x79, 0x7c, 0x0e, 0x3b,
0x0b, 0x1e, 0xbd, 0xee, 0x63, 0x58, 0x0b, 0xb4, 0x4d, 0xaf, 0x5a, 0x4d, 0xaf, 0x9a, 0x8a, 0x8a,
0xb1, 0xe6, 0xaf, 0x06, 0x14, 0x93, 0xae, 0x79, 0x8e, 0x8c, 0x05, 0x8e, 0x12, 0x6c, 0x67, 0xaf,
0x65, 0xfb, 0x11, 0x94, 0x03, 0xe4, 0x43, 0xf4, 0xa4, 0x3d, 0xf4, 0x27, 0xc1, 0x18, 0x25, 0x86,
0x94, 0x66, 0xe9, 0x86, 0xb6, 0x3f, 0xd5, 0x66, 0xb2, 0x0b, 0x20, 0xa6, 0xc3, 0x21, 0x0a, 0x71,
0x36, 0x1d, 0x57, 0x6e, 0xd5, 0x8d, 0xc6, 0x1a, 0x4d, 0x58, 0xcc, 0xdf, 0xb2, 0xb0, 0x79, 0xc2,
0x99, 0x27, 0xce, 0x90, 0x1f, 0x2b, 0x33, 0x3a, 0xe8, 0x90, 0xe7, 0x70, 0x97, 0x39, 0x8e, 0xaa,
0x1a, 0x1d, 0x3b, 0x94, 0xa4, 0x3d, 0x76, 0x27, 0xae, 0x0c, 0x8b, 0x2e, 0x34, 0x1f, 0xec, 0xc5,
0xb2, 0x6d, 0xcd, 0x60, 0x03, 0x85, 0x3a, 0x54, 0x20, 0xba, 0xc5, 0x16, 0x8d, 0xa4, 0x05, 0x5b,
0x3e, 0x77, 0x47, 0xae, 0xc7, 0xc6, 0x76, 0xe0, 0xe2, 0x10, 0xed, 0x73, 0x26, 0xce, 0xc3, 0x8d,
0x16, 0x9a, 0x9b, 0x7b, 0x5a, 0xf7, 0x47, 0xca, 0xd3, 0x63, 0xe2, 0x9c, 0x6e, 0xce, 0xd0, 0xb1,
0x89, 0x74, 0x61, 0x9b, 0x63, 0x30, 0x66, 0x43, 0x9c, 0xa8, 0xad, 0x27, 0xb2, 0xac, 0x5c, 0x95,
0xe5, 0x4e, 0x22, 0xe0, 0x32, 0xd1, 0x13, 0xd8, 0x9c, 0xab, 0xc5, 0x75, 0x42, 0x6e, 0x8a, 0xfb,
0x1b, 0x9a, 0xf2, 0xd5, 0x10, 0xdd, 0x6f, 0xd3, 0x8d, 0x54, 0x1d, 0x7d, 0xc7, 0xfc, 0xd3, 0x80,
0xd2, 0x8c, 0xb1, 0x03, 0xe6, 0x8e, 0xd1, 0x59, 0x9e, 0xcf, 0xb8, 0x59, 0x3e, 0xf2, 0x39, 0xdc,
0x46, 0xce, 0x7d, 0x1e, 0x52, 0x51, 0x6a, 0x9a, 0x69, 0x71, 0xa5, 0x57, 0xda, 0xeb, 0x28, 0x24,
0x8d, 0x02, 0xcc, 0x16, 0xdc, 0x0e, 0xff, 0xc9, 0x3a, 0xe4, 0xad, 0xc1, 0x89, 0x7d, 0x30, 0x38,
0xb5, 0xda, 0xe5, 0x0c, 0xb9, 0x0f, 0x95, 0xe3, 0x93, 0x01, 0x6d, 0x75, 0x3b, 0xb6, 0x35, 0x68,
0x77, 0xec, 0x53, 0xab, 0xf5, 0xa2, 0xd5, 0x3f, 0x6c, 0xed, 0x1f, 0x76, 0xca, 0x06, 0x29, 0xc0,
0xea, 0xa9, 0xf5, 0xcc, 0x1a, 0x7c, 0x63, 0x95, 0xb3, 0xe6, 0xcf, 0x06, 0x90, 0x63, 0xe9, 0x73,
0x36, 0x42, 0xa5, 0xb1, 0xaf, 0x51, 0x08, 0x36, 0x42, 0xf2, 0x25, 0xe4, 0xc5, 0x4c, 0x0c, 0xba,
0xe7, 0xb5, 0xe5, 0x75, 0xc5, 0x9a, 0xe9, 0x65, 0xe8, 0x65, 0x0c, 0x79, 0x0c, 0xb9, 0xb3, 0xb0,
0x62, 0xdd, 0xe0, 0xfb, 0xd7, 0xed, 0xaa, 0x97, 0xa1, 0x1a, 0xbd, 0x9f, 0x87, 0x55, 0x5d, 0x83,
0x09, 0xb0, 0x66, 0xf9, 0x92, 0x22, 0x73, 0x2e, 0xcc, 0xbf, 0x0c, 0x58, 0x9f, 0xc5, 0x84, 0xbc,
0xbd, 0x2d, 0xe5, 0x85, 0x80, 0xbb, 0xaf, 0x98, 0x44, 0xfb, 0x07, 0xbc, 0xd0, 0x87, 0x6d, 0x47,
0x87, 0x6d, 0x84, 0xa8, 0xa3, 0xc8, 0xff, 0x0c, 0x2f, 0x28, 0x04, 0xf1, 0xf7, 0xd5, 0x07, 0x63,
0xe5, 0xff, 0x1e, 0x0c, 0xf3, 0x2b, 0x28, 0xb4, 0x51, 0x9d, 0xd5, 0xb7, 0xdf, 0x98, 0xd9, 0x85,
0x75, 0x35, 0x72, 0x66, 0xa7, 0x5f, 0xf5, 0x61, 0x47, 0x11, 0x1e, 0x8f, 0x09, 0x5b, 0xb8, 0x23,
0x8f, 0xc9, 0x29, 0x8f, 0xe6, 0x4f, 0x91, 0xde, 0xc5, 0x04, 0xfe, 0x78, 0xe6, 0x34, 0x7f, 0x31,
0x00, 0x54, 0x26, 0x2d, 0xf0, 0x4f, 0x60, 0x3b, 0x4c, 0xa3, 0xba, 0x34, 0xe5, 0x8b, 0x59, 0xee,
0xa0, 0xc6, 0x4e, 0xf9, 0x65, 0x12, 0xf2, 0x19, 0xe4, 0x38, 0x32, 0xe1, 0x7b, 0x5a, 0xda, 0xb5,
0xc5, 0xb9, 0xa9, 0x65, 0x4d, 0x43, 0x18, 0xd5, 0x70, 0xf3, 0x21, 0xe4, 0x22, 0x0b, 0xd9, 0x81,
0xad, 0x17, 0x1d, 0xda, 0x3f, 0xe8, 0x3f, 0x6d, 0x9d, 0xf4, 0x07, 0x96, 0x7d, 0xd0, 0xea, 0x1f,
0x76, 0xda, 0xe5, 0x8c, 0xf9, 0x4f, 0x16, 0xca, 0xf1, 0x90, 0x9f, 0xc9, 0xf6, 0x53, 0xc8, 0x7b,
0xbe, 0xb4, 0xb9, 0xd2, 0x8c, 0x96, 0xed, 0xf6, 0xfc, 0x0d, 0x11, 0x29, 0xaa, 0x97, 0xa1, 0x6b,
0x9e, 0xfe, 0x26, 0x6d, 0x28, 0x49, 0x2d, 0xae, 0x88, 0x72, 0x2d, 0xda, 0x7b, 0xcb, 0x45, 0x1b,
0xcd, 0x91, 0x0c, 0x5d, 0x97, 0x29, 0x45, 0x7e, 0x01, 0x45, 0x27, 0xec, 0xa3, 0xce, 0x11, 0x29,
0xe2, 0x9d, 0x74, 0x8e, 0x44, 0xa7, 0x7b, 0x19, 0x5a, 0x70, 0x12, 0x8d, 0x6f, 0x43, 0x29, 0xd5,
0xaa, 0x68, 0x22, 0x2d, 0x54, 0x91, 0xea, 0xaf, 0xaa, 0x02, 0x53, 0x0d, 0x7f, 0x02, 0x85, 0xb8,
0x53, 0xe8, 0x54, 0x6e, 0x87, 0x29, 0x2a, 0x57, 0x11, 0xdf, 0xcb, 0x50, 0xc0, 0xf8, 0x2f, 0x71,
0xfa, 0x9a, 0x7f, 0x64, 0xa1, 0xac, 0x26, 0x42, 0xf2, 0x55, 0x41, 0x5e, 0x85, 0xb7, 0xe4, 0xb2,
0x5b, 0x9a, 0x7c, 0x90, 0x5e, 0xe2, 0xfa, 0x67, 0x4b, 0xf5, 0xc3, 0x1b, 0xa2, 0xf5, 0x15, 0xfc,
0x1d, 0xdc, 0x59, 0xf6, 0xca, 0x21, 0x8f, 0xd2, 0x69, 0xae, 0x79, 0x09, 0x55, 0xaf, 0xb9, 0xb3,
0xc9, 0xf7, 0xb0, 0x31, 0x77, 0xf9, 0x93, 0x77, 0x17, 0x0a, 0x5c, 0xf2, 0x6a, 0xa8, 0xbe, 0xf7,
0x1f, 0xa8, 0xa8, 0xfc, 0xe6, 0x39, 0xdc, 0x8d, 0x37, 0x95, 0xaa, 0x7f, 0x00, 0xab, 0x47, 0xdc,
0x57, 0x57, 0x31, 0xa9, 0xa7, 0x53, 0x2d, 0xce, 0xe4, 0xea, 0xee, 0x1c, 0x62, 0x4e, 0xfc, 0x0d,
0xe3, 0x23, 0x63, 0xff, 0xd6, 0xb7, 0xd9, 0xe0, 0xe5, 0xcb, 0x5c, 0xf8, 0x7a, 0xfc, 0xf8, 0xdf,
0x00, 0x00, 0x00, 0xff, 0xff, 0xb3, 0xe2, 0xc3, 0xb2, 0x8b, 0x0a, 0x00, 0x00,
}
type DRPCNodeGracefulExitClient interface {
DRPCConn() drpc.Conn
// GetSatellitesList returns a list of satellites that the storagenode has not begun a graceful exit for.
// GetSatellitesList returns a list of satellites that the storagenode has not exited.
GetNonExitingSatellites(ctx context.Context, in *GetNonExitingSatellitesRequest) (*GetNonExitingSatellitesResponse, error)
// StartExit updates one or more satellites in the storagenode's database to be gracefully exiting.
StartExit(ctx context.Context, in *StartExitRequest) (*StartExitResponse, error)
// InitiateGracefulExit updates one or more satellites in the storagenode's database to be gracefully exiting.
InitiateGracefulExit(ctx context.Context, in *InitiateGracefulExitRequest) (*ExitProgress, error)
// GetExitProgress returns graceful exit status on each satellite for a given storagenode.
GetExitProgress(ctx context.Context, in *GetExitProgressRequest) (*GetExitProgressResponse, error)
}
type drpcNodeGracefulExitClient struct {
@ -1084,9 +1128,18 @@ func (c *drpcNodeGracefulExitClient) GetNonExitingSatellites(ctx context.Context
return out, nil
}
func (c *drpcNodeGracefulExitClient) StartExit(ctx context.Context, in *StartExitRequest) (*StartExitResponse, error) {
out := new(StartExitResponse)
err := c.cc.Invoke(ctx, "/gracefulexit.NodeGracefulExit/StartExit", in, out)
func (c *drpcNodeGracefulExitClient) InitiateGracefulExit(ctx context.Context, in *InitiateGracefulExitRequest) (*ExitProgress, error) {
out := new(ExitProgress)
err := c.cc.Invoke(ctx, "/gracefulexit.NodeGracefulExit/InitiateGracefulExit", in, out)
if err != nil {
return nil, err
}
return out, nil
}
func (c *drpcNodeGracefulExitClient) GetExitProgress(ctx context.Context, in *GetExitProgressRequest) (*GetExitProgressResponse, error) {
out := new(GetExitProgressResponse)
err := c.cc.Invoke(ctx, "/gracefulexit.NodeGracefulExit/GetExitProgress", in, out)
if err != nil {
return nil, err
}
@ -1094,15 +1147,17 @@ func (c *drpcNodeGracefulExitClient) StartExit(ctx context.Context, in *StartExi
}
type DRPCNodeGracefulExitServer interface {
// GetSatellitesList returns a list of satellites that the storagenode has not begun a graceful exit for.
// GetSatellitesList returns a list of satellites that the storagenode has not exited.
GetNonExitingSatellites(context.Context, *GetNonExitingSatellitesRequest) (*GetNonExitingSatellitesResponse, error)
// StartExit updates one or more satellites in the storagenode's database to be gracefully exiting.
StartExit(context.Context, *StartExitRequest) (*StartExitResponse, error)
// InitiateGracefulExit updates one or more satellites in the storagenode's database to be gracefully exiting.
InitiateGracefulExit(context.Context, *InitiateGracefulExitRequest) (*ExitProgress, error)
// GetExitProgress returns graceful exit status on each satellite for a given storagenode.
GetExitProgress(context.Context, *GetExitProgressRequest) (*GetExitProgressResponse, error)
}
type DRPCNodeGracefulExitDescription struct{}
func (DRPCNodeGracefulExitDescription) NumMethods() int { return 2 }
func (DRPCNodeGracefulExitDescription) NumMethods() int { return 3 }
func (DRPCNodeGracefulExitDescription) Method(n int) (string, drpc.Handler, interface{}, bool) {
switch n {
@ -1116,14 +1171,23 @@ func (DRPCNodeGracefulExitDescription) Method(n int) (string, drpc.Handler, inte
)
}, DRPCNodeGracefulExitServer.GetNonExitingSatellites, true
case 1:
return "/gracefulexit.NodeGracefulExit/StartExit",
return "/gracefulexit.NodeGracefulExit/InitiateGracefulExit",
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCNodeGracefulExitServer).
StartExit(
InitiateGracefulExit(
ctx,
in1.(*StartExitRequest),
in1.(*InitiateGracefulExitRequest),
)
}, DRPCNodeGracefulExitServer.StartExit, true
}, DRPCNodeGracefulExitServer.InitiateGracefulExit, true
case 2:
return "/gracefulexit.NodeGracefulExit/GetExitProgress",
func(srv interface{}, ctx context.Context, in1, in2 interface{}) (drpc.Message, error) {
return srv.(DRPCNodeGracefulExitServer).
GetExitProgress(
ctx,
in1.(*GetExitProgressRequest),
)
}, DRPCNodeGracefulExitServer.GetExitProgress, true
default:
return "", nil, nil, false
}
@ -1149,16 +1213,32 @@ func (x *drpcNodeGracefulExitGetNonExitingSatellitesStream) SendAndClose(m *GetN
return x.CloseSend()
}
type DRPCNodeGracefulExit_StartExitStream interface {
type DRPCNodeGracefulExit_InitiateGracefulExitStream interface {
drpc.Stream
SendAndClose(*StartExitResponse) error
SendAndClose(*ExitProgress) error
}
type drpcNodeGracefulExitStartExitStream struct {
type drpcNodeGracefulExitInitiateGracefulExitStream struct {
drpc.Stream
}
func (x *drpcNodeGracefulExitStartExitStream) SendAndClose(m *StartExitResponse) error {
func (x *drpcNodeGracefulExitInitiateGracefulExitStream) SendAndClose(m *ExitProgress) error {
if err := x.MsgSend(m); err != nil {
return err
}
return x.CloseSend()
}
type DRPCNodeGracefulExit_GetExitProgressStream interface {
drpc.Stream
SendAndClose(*GetExitProgressResponse) error
}
type drpcNodeGracefulExitGetExitProgressStream struct {
drpc.Stream
}
func (x *drpcNodeGracefulExitGetExitProgressStream) SendAndClose(m *GetExitProgressResponse) error {
if err := x.MsgSend(m); err != nil {
return err
}
@ -1275,10 +1355,12 @@ const _ = grpc.SupportPackageIsVersion4
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type NodeGracefulExitClient interface {
// GetSatellitesList returns a list of satellites that the storagenode has not begun a graceful exit for.
// GetSatellitesList returns a list of satellites that the storagenode has not exited.
GetNonExitingSatellites(ctx context.Context, in *GetNonExitingSatellitesRequest, opts ...grpc.CallOption) (*GetNonExitingSatellitesResponse, error)
// StartExit updates one or more satellites in the storagenode's database to be gracefully exiting.
StartExit(ctx context.Context, in *StartExitRequest, opts ...grpc.CallOption) (*StartExitResponse, error)
// InitiateGracefulExit updates one or more satellites in the storagenode's database to be gracefully exiting.
InitiateGracefulExit(ctx context.Context, in *InitiateGracefulExitRequest, opts ...grpc.CallOption) (*ExitProgress, error)
// GetExitProgress returns graceful exit status on each satellite for a given storagenode.
GetExitProgress(ctx context.Context, in *GetExitProgressRequest, opts ...grpc.CallOption) (*GetExitProgressResponse, error)
}
type nodeGracefulExitClient struct {
@ -1298,9 +1380,18 @@ func (c *nodeGracefulExitClient) GetNonExitingSatellites(ctx context.Context, in
return out, nil
}
func (c *nodeGracefulExitClient) StartExit(ctx context.Context, in *StartExitRequest, opts ...grpc.CallOption) (*StartExitResponse, error) {
out := new(StartExitResponse)
err := c.cc.Invoke(ctx, "/gracefulexit.NodeGracefulExit/StartExit", in, out, opts...)
func (c *nodeGracefulExitClient) InitiateGracefulExit(ctx context.Context, in *InitiateGracefulExitRequest, opts ...grpc.CallOption) (*ExitProgress, error) {
out := new(ExitProgress)
err := c.cc.Invoke(ctx, "/gracefulexit.NodeGracefulExit/InitiateGracefulExit", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *nodeGracefulExitClient) GetExitProgress(ctx context.Context, in *GetExitProgressRequest, opts ...grpc.CallOption) (*GetExitProgressResponse, error) {
out := new(GetExitProgressResponse)
err := c.cc.Invoke(ctx, "/gracefulexit.NodeGracefulExit/GetExitProgress", in, out, opts...)
if err != nil {
return nil, err
}
@ -1309,10 +1400,12 @@ func (c *nodeGracefulExitClient) StartExit(ctx context.Context, in *StartExitReq
// NodeGracefulExitServer is the server API for NodeGracefulExit service.
type NodeGracefulExitServer interface {
// GetSatellitesList returns a list of satellites that the storagenode has not begun a graceful exit for.
// GetSatellitesList returns a list of satellites that the storagenode has not exited.
GetNonExitingSatellites(context.Context, *GetNonExitingSatellitesRequest) (*GetNonExitingSatellitesResponse, error)
// StartExit updates one or more satellites in the storagenode's database to be gracefully exiting.
StartExit(context.Context, *StartExitRequest) (*StartExitResponse, error)
// InitiateGracefulExit updates one or more satellites in the storagenode's database to be gracefully exiting.
InitiateGracefulExit(context.Context, *InitiateGracefulExitRequest) (*ExitProgress, error)
// GetExitProgress returns graceful exit status on each satellite for a given storagenode.
GetExitProgress(context.Context, *GetExitProgressRequest) (*GetExitProgressResponse, error)
}
func RegisterNodeGracefulExitServer(s *grpc.Server, srv NodeGracefulExitServer) {
@ -1337,20 +1430,38 @@ func _NodeGracefulExit_GetNonExitingSatellites_Handler(srv interface{}, ctx cont
return interceptor(ctx, in, info, handler)
}
func _NodeGracefulExit_StartExit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StartExitRequest)
func _NodeGracefulExit_InitiateGracefulExit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(InitiateGracefulExitRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(NodeGracefulExitServer).StartExit(ctx, in)
return srv.(NodeGracefulExitServer).InitiateGracefulExit(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/gracefulexit.NodeGracefulExit/StartExit",
FullMethod: "/gracefulexit.NodeGracefulExit/InitiateGracefulExit",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(NodeGracefulExitServer).StartExit(ctx, req.(*StartExitRequest))
return srv.(NodeGracefulExitServer).InitiateGracefulExit(ctx, req.(*InitiateGracefulExitRequest))
}
return interceptor(ctx, in, info, handler)
}
func _NodeGracefulExit_GetExitProgress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetExitProgressRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(NodeGracefulExitServer).GetExitProgress(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/gracefulexit.NodeGracefulExit/GetExitProgress",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(NodeGracefulExitServer).GetExitProgress(ctx, req.(*GetExitProgressRequest))
}
return interceptor(ctx, in, info, handler)
}
@ -1364,8 +1475,12 @@ var _NodeGracefulExit_serviceDesc = grpc.ServiceDesc{
Handler: _NodeGracefulExit_GetNonExitingSatellites_Handler,
},
{
MethodName: "StartExit",
Handler: _NodeGracefulExit_StartExit_Handler,
MethodName: "InitiateGracefulExit",
Handler: _NodeGracefulExit_InitiateGracefulExit_Handler,
},
{
MethodName: "GetExitProgress",
Handler: _NodeGracefulExit_GetExitProgress_Handler,
},
},
Streams: []grpc.StreamDesc{},

View File

@ -12,37 +12,42 @@ package gracefulexit;
// NodeGracefulExit is a private service on storagenodes
service NodeGracefulExit {
// GetSatellitesList returns a list of satellites that the storagenode has not begun a graceful exit for.
// GetSatellitesList returns a list of satellites that the storagenode has not exited.
rpc GetNonExitingSatellites(GetNonExitingSatellitesRequest) returns (GetNonExitingSatellitesResponse);
// StartExit updates one or more satellites in the storagenode's database to be gracefully exiting.
rpc StartExit(StartExitRequest) returns (StartExitResponse);
// InitiateGracefulExit updates one or more satellites in the storagenode's database to be gracefully exiting.
rpc InitiateGracefulExit(InitiateGracefulExitRequest) returns (ExitProgress);
// GetExitProgress returns graceful exit status on each satellite for a given storagenode.
rpc GetExitProgress(GetExitProgressRequest) returns (GetExitProgressResponse);
}
message GetNonExitingSatellitesRequest{}
message StartExitRequest {
repeated bytes node_ids = 1 [(gogoproto.customtype) = "NodeID", (gogoproto.nullable) = false];
message InitiateGracefulExitRequest {
bytes node_id = 1 [(gogoproto.customtype) = "NodeID", (gogoproto.nullable) = false];
}
// NonExitingSatellite contains information that's needed for a storagenode to start graceful exit
message NonExitingSatellite {
bytes node_id = 1 [(gogoproto.customtype) = "NodeID", (gogoproto.nullable) = false];
string domain_name = 2;
double space_used = 3;
bytes node_id = 1 [(gogoproto.customtype) = "NodeID", (gogoproto.nullable) = false];
string domain_name = 2;
double space_used = 3;
}
message GetNonExitingSatellitesResponse {
repeated NonExitingSatellite satellites = 1;
repeated NonExitingSatellite satellites = 1;
}
// StartExitStatus indicates the result of graceful exit initialization from a storagenode
message StartExitStatus {
string domain_name = 1;
bool success = 2;
message GetExitProgressRequest {}
message GetExitProgressResponse {
repeated ExitProgress progress = 1;
}
message StartExitResponse {
repeated StartExitStatus statuses = 1;
message ExitProgress {
string domain_name = 1;
bytes node_id = 2 [(gogoproto.customtype) = "NodeID", (gogoproto.nullable) = false];
float percent_complete = 3;
bool successful = 4;
}
service SatelliteGracefulExit {

View File

@ -881,13 +881,12 @@
"name": "GetNonExitingSatellitesRequest"
},
{
"name": "StartExitRequest",
"name": "InitiateGracefulExitRequest",
"fields": [
{
"id": 1,
"name": "node_ids",
"name": "node_id",
"type": "bytes",
"is_repeated": true,
"options": [
{
"name": "(gogoproto.customtype)",
@ -943,7 +942,21 @@
]
},
{
"name": "StartExitStatus",
"name": "GetExitProgressRequest"
},
{
"name": "GetExitProgressResponse",
"fields": [
{
"id": 1,
"name": "progress",
"type": "ExitProgress",
"is_repeated": true
}
]
},
{
"name": "ExitProgress",
"fields": [
{
"id": 1,
@ -952,19 +965,28 @@
},
{
"id": 2,
"name": "success",
"type": "bool"
}
]
},
{
"name": "StartExitResponse",
"fields": [
"name": "node_id",
"type": "bytes",
"options": [
{
"name": "(gogoproto.customtype)",
"value": "NodeID"
},
{
"name": "(gogoproto.nullable)",
"value": "false"
}
]
},
{
"id": 1,
"name": "statuses",
"type": "StartExitStatus",
"is_repeated": true
"id": 3,
"name": "percent_complete",
"type": "float"
},
{
"id": 4,
"name": "successful",
"type": "bool"
}
]
},
@ -1172,9 +1194,14 @@
"out_type": "GetNonExitingSatellitesResponse"
},
{
"name": "StartExit",
"in_type": "StartExitRequest",
"out_type": "StartExitResponse"
"name": "InitiateGracefulExit",
"in_type": "InitiateGracefulExitRequest",
"out_type": "ExitProgress"
},
{
"name": "GetExitProgress",
"in_type": "GetExitProgressRequest",
"out_type": "GetExitProgressResponse"
}
]
},

View File

@ -88,41 +88,71 @@ func (e *Endpoint) GetNonExitingSatellites(ctx context.Context, req *pb.GetNonEx
}, nil
}
// StartExit updates one or more satellites in the storagenode's database to be gracefully exiting.
func (e *Endpoint) StartExit(ctx context.Context, req *pb.StartExitRequest) (*pb.StartExitResponse, error) {
e.log.Debug("initialize graceful exit: StartExit", zap.Int("satellite count", len(req.NodeIds)))
// save satellites info into db
resp := &pb.StartExitResponse{}
for _, satelliteID := range req.NodeIds {
e.log.Debug("initialize graceful exit: StartExit", zap.String("satellite ID", satelliteID.String()))
// InitiateGracefulExit updates one or more satellites in the storagenode's database to be gracefully exiting.
func (e *Endpoint) InitiateGracefulExit(ctx context.Context, req *pb.InitiateGracefulExitRequest) (*pb.ExitProgress, error) {
e.log.Debug("initialize graceful exit: start", zap.String("satellite ID", req.NodeId.String()))
status := &pb.StartExitStatus{
Success: false,
}
domain, err := e.trust.GetAddress(ctx, satelliteID)
if err != nil {
e.log.Debug("initialize graceful exit: StartExit", zap.Error(err))
resp.Statuses = append(resp.Statuses, status)
continue
}
status.DomainName = domain
// get space usage by satellites
spaceUsed, err := e.usageCache.SpaceUsedBySatellite(ctx, satelliteID)
if err != nil {
e.log.Debug("initialize graceful exit: StartExit", zap.Error(err))
resp.Statuses = append(resp.Statuses, status)
continue
}
err = e.satellites.InitiateGracefulExit(ctx, satelliteID, time.Now().UTC(), spaceUsed)
if err != nil {
e.log.Debug("initialize graceful exit: StartExit", zap.Error(err))
resp.Statuses = append(resp.Statuses, status)
continue
}
status.Success = true
resp.Statuses = append(resp.Statuses, status)
domain, err := e.trust.GetAddress(ctx, req.NodeId)
if err != nil {
e.log.Debug("initialize graceful exit: retrieve satellite address", zap.Error(err))
return nil, errs.Wrap(err)
}
// get space usage by satellites
spaceUsed, err := e.usageCache.SpaceUsedBySatellite(ctx, req.NodeId)
if err != nil {
e.log.Debug("initialize graceful exit: retrieve space used", zap.String("Satellite ID", req.NodeId.String()), zap.Error(err))
return nil, errs.Wrap(err)
}
err = e.satellites.InitiateGracefulExit(ctx, req.NodeId, time.Now().UTC(), spaceUsed)
if err != nil {
e.log.Debug("initialize graceful exit: save info into satellites table", zap.String("Satellite ID", req.NodeId.String()), zap.Error(err))
return nil, errs.Wrap(err)
}
return &pb.ExitProgress{
DomainName: domain,
NodeId: req.NodeId,
PercentComplete: float32(0),
}, nil
}
// GetExitProgress returns graceful exit progress on each satellite that a storagde node has started exiting.
func (e *Endpoint) GetExitProgress(ctx context.Context, req *pb.GetExitProgressRequest) (*pb.GetExitProgressResponse, error) {
exitProgress, err := e.satellites.ListGracefulExits(ctx)
if err != nil {
return nil, errs.Wrap(err)
}
resp := &pb.GetExitProgressResponse{
Progress: make([]*pb.ExitProgress, 0, len(exitProgress)),
}
for _, progress := range exitProgress {
domain, err := e.trust.GetAddress(ctx, progress.SatelliteID)
if err != nil {
e.log.Debug("graceful exit: get satellite domain name", zap.String("satelliteID", progress.SatelliteID.String()), zap.Error(err))
continue
}
var percentCompleted float32
var hasCompleted bool
if progress.StartingDiskUsage != 0 {
percentCompleted = (float32(progress.BytesDeleted) / float32(progress.StartingDiskUsage)) * 100
}
if progress.CompletionReceipt != nil {
hasCompleted = true
}
resp.Progress = append(resp.Progress,
&pb.ExitProgress{
DomainName: domain,
NodeId: progress.SatelliteID,
PercentComplete: percentCompleted,
Successful: hasCompleted,
},
)
}
return resp, nil
}

View File

@ -12,7 +12,6 @@ import (
"storj.io/storj/internal/testcontext"
"storj.io/storj/internal/testplanet"
"storj.io/storj/pkg/pb"
"storj.io/storj/pkg/storj"
)
func TestGetNonExitingSatellites(t *testing.T) {
@ -42,12 +41,11 @@ func TestGetNonExitingSatellites(t *testing.T) {
}
}
func TestStartExiting(t *testing.T) {
func TestInitiateGracefulExit(t *testing.T) {
ctx := testcontext.New(t)
defer ctx.Cleanup()
totalSatelliteCount := 3
const exitingSatelliteCount = 2
planet, err := testplanet.New(t, totalSatelliteCount, 1, 1)
require.NoError(t, err)
defer ctx.Check(planet.Shutdown)
@ -55,24 +53,48 @@ func TestStartExiting(t *testing.T) {
planet.Start(ctx)
storagenode := planet.StorageNodes[0]
exitingSatelliteIDs := []storj.NodeID{
planet.Satellites[0].ID(),
planet.Satellites[1].ID(),
}
req := &pb.StartExitRequest{
NodeIds: exitingSatelliteIDs,
exitingSatelliteID := planet.Satellites[0].ID()
req := &pb.InitiateGracefulExitRequest{
NodeId: exitingSatelliteID,
}
resp, err := storagenode.GracefulExit.Endpoint.StartExit(ctx, req)
resp, err := storagenode.GracefulExit.Endpoint.InitiateGracefulExit(ctx, req)
require.NoError(t, err)
for _, status := range resp.GetStatuses() {
require.True(t, status.GetSuccess())
}
// check progress is 0
require.EqualValues(t, 0, resp.GetPercentComplete())
require.False(t, resp.GetSuccessful())
exitStatuses, err := storagenode.DB.Satellites().ListGracefulExits(ctx)
require.NoError(t, err)
require.Len(t, exitStatuses, exitingSatelliteCount)
for _, status := range exitStatuses {
require.Contains(t, exitingSatelliteIDs, status.SatelliteID)
}
require.Len(t, exitStatuses, 1)
require.Equal(t, exitingSatelliteID, exitStatuses[0].SatelliteID)
}
func TestGetExitProgress(t *testing.T) {
ctx := testcontext.New(t)
totalSatelliteCount := 3
planet, err := testplanet.New(t, totalSatelliteCount, 1, 1)
require.NoError(t, err)
defer ctx.Check(planet.Shutdown)
planet.Start(ctx)
exitingSatellite := planet.Satellites[0]
storagenode := planet.StorageNodes[0]
// start graceful exit
err = storagenode.DB.Satellites().InitiateGracefulExit(ctx, exitingSatellite.ID(), time.Now().UTC(), 100)
require.NoError(t, err)
err = storagenode.DB.Satellites().UpdateGracefulExit(ctx, exitingSatellite.ID(), 20)
require.NoError(t, err)
// check graceful exit progress
resp, err := storagenode.GracefulExit.Endpoint.GetExitProgress(ctx, &pb.GetExitProgressRequest{})
require.NoError(t, err)
require.Len(t, resp.GetProgress(), 1)
progress := resp.GetProgress()[0]
require.Equal(t, progress.GetDomainName(), exitingSatellite.Addr())
require.Equal(t, progress.NodeId, exitingSatellite.ID())
require.EqualValues(t, 20, progress.GetPercentComplete())
}