1
0
Fork 0

Refactor node self-removal

Still needs unit tests.
master
Philip O'Toole 1 year ago
parent 46c9ae3bd1
commit f6b0cdb747

1
.gitignore vendored

@ -29,6 +29,7 @@ _test
# Temporary data files
cmd/rqlited/data*
system_test/e2e/__pycache__/
# Notes
TODO

@ -0,0 +1,53 @@
package cluster
import (
"time"
"github.com/rqlite/rqlite/command"
)
// Control is an interface for interacting with a cluster.
type Control interface {
LeaderAddr() (string, error)
WaitForRemoval(string, time.Duration) error
}
// Remover executes a node-removal operation.
type Remover struct {
timeout time.Duration
control Control
client *Client
}
// / NewRemover returns an instantiated Remover.
func NewRemover(client *Client, timeout time.Duration, control Control) *Remover {
return &Remover{
client: client,
timeout: timeout,
control: control,
}
}
// Do executes the node-removal operation.
func (r *Remover) Do(id string, confirm bool) error {
laddr, err := r.control.LeaderAddr()
if err != nil {
return err
}
rn := &command.RemoveNodeRequest{
Id: id,
}
if err := r.client.RemoveNode(rn, laddr, nil, r.timeout); err != nil {
return err
}
if confirm {
if err := r.control.WaitForRemoval(id, r.timeout); err != nil {
return err
}
}
return nil
}

@ -24,7 +24,6 @@ import (
"github.com/rqlite/rqlite/aws"
"github.com/rqlite/rqlite/cluster"
"github.com/rqlite/rqlite/cmd"
"github.com/rqlite/rqlite/command"
"github.com/rqlite/rqlite/db"
"github.com/rqlite/rqlite/disco"
httpd "github.com/rqlite/rqlite/http"
@ -202,15 +201,12 @@ func main() {
httpServ.Close()
if cfg.RaftClusterRemoveOnShutdown {
remover := cluster.NewRemover(clstrClient, 5*time.Second, str)
log.Printf("initiating removal of this node from cluster before shutdown")
if err := removeSelf(cfg, str, clstrClient); err != nil {
log.Printf("failed to remove this node from cluster before shutdown: %s", err.Error())
if err := remover.Do(cfg.NodeID, true); err != nil {
log.Fatalf("failed to remove this node from cluster before shutdown: %s", err.Error())
} else {
if err := str.WaitForRemoval(cfg.NodeID, 5*time.Second); err != nil {
log.Printf("timed-out waiting removal of node from config before shutdown: %s", err.Error())
} else {
log.Printf("removed this node successfully from cluster before shutdown")
}
log.Printf("removed this node successfully from cluster before shutdown")
}
}
@ -644,14 +640,3 @@ func createHTTPTLSConfig(cfg *Config) (*tls.Config, error) {
return rtls.CreateClientConfig(cfg.HTTPx509Cert, cfg.HTTPx509Key, cfg.HTTPx509CACert,
cfg.NoHTTPVerify, cfg.TLS1011)
}
func removeSelf(cfg *Config, str *store.Store, client *cluster.Client) error {
laddr, err := str.LeaderAddr()
if err != nil {
return fmt.Errorf("failed to get leader address: %s", err.Error())
}
rn := &command.RemoveNodeRequest{
Id: cfg.NodeID,
}
return client.RemoveNode(rn, laddr, nil, 5*time.Second)
}

Loading…
Cancel
Save