shell: add lock/unlock command

This commit is contained in:
Chris Lu 2020-04-23 03:11:07 -07:00
parent ff0a7c1d18
commit 69f336e59f
2 changed files with 58 additions and 2 deletions

View file

@ -0,0 +1,55 @@
package shell
import (
"io"
)
func init() {
Commands = append(Commands, &commandUnlock{})
Commands = append(Commands, &commandLock{})
}
// =========== Lock ==============
type commandLock struct {
}
func (c *commandLock) Name() string {
return "lock"
}
func (c *commandLock) Help() string {
return `lock in order to exclusively manage the cluster
This is a blocking operation if there is alread another lock.
`
}
func (c *commandLock) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) {
commandEnv.locker.RequestLock()
return nil
}
// =========== Unlock ==============
type commandUnlock struct {
}
func (c *commandUnlock) Name() string {
return "unlock"
}
func (c *commandUnlock) Help() string {
return `unlock the cluster-wide lock
`
}
func (c *commandUnlock) Do(args []string, commandEnv *CommandEnv, writer io.Writer) (err error) {
commandEnv.locker.ReleaseLock()
return nil
}

View file

@ -36,7 +36,7 @@ func (l *ExclusiveLocker) GetToken() (token int64, lockTsNs int64) {
return atomic.LoadInt64(&l.token), atomic.LoadInt64(&l.lockTsNs) return atomic.LoadInt64(&l.token), atomic.LoadInt64(&l.lockTsNs)
} }
func (l *ExclusiveLocker) Lock() { func (l *ExclusiveLocker) RequestLock() {
// retry to get the lease // retry to get the lease
for { for {
if err := l.masterClient.WithClient(func(client master_pb.SeaweedClient) error { if err := l.masterClient.WithClient(func(client master_pb.SeaweedClient) error {
@ -69,6 +69,7 @@ func (l *ExclusiveLocker) Lock() {
if err == nil { if err == nil {
atomic.StoreInt64(&l.token, resp.Token) atomic.StoreInt64(&l.token, resp.Token)
atomic.StoreInt64(&l.lockTsNs, resp.LockTsNs) atomic.StoreInt64(&l.lockTsNs, resp.LockTsNs)
// println("ts", l.lockTsNs, "token", l.token)
} }
return err return err
}); err != nil { }); err != nil {
@ -83,7 +84,7 @@ func (l *ExclusiveLocker) Lock() {
} }
func (l *ExclusiveLocker) Unlock() { func (l *ExclusiveLocker) ReleaseLock() {
l.isLocking = false l.isLocking = false
l.masterClient.WithClient(func(client master_pb.SeaweedClient) error { l.masterClient.WithClient(func(client master_pb.SeaweedClient) error {
client.ReleaseAdminToken(context.Background(), &master_pb.ReleaseAdminTokenRequest{ client.ReleaseAdminToken(context.Background(), &master_pb.ReleaseAdminTokenRequest{