Browse Source

shell: add lock/unlock command

pull/1293/head
Chris Lu 5 years ago
parent
commit
69f336e59f
  1. 55
      weed/shell/command_fs_lock_unlock.go
  2. 5
      weed/shell/exclusive_locker.go

55
weed/shell/command_fs_lock_unlock.go

@ -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
}

5
weed/shell/exclusive_locker.go

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

Loading…
Cancel
Save