update
This commit is contained in:
parent
d9bd8fe4da
commit
b8a42074a2
@ -1,49 +0,0 @@
|
||||
package shardctrler
|
||||
|
||||
import (
|
||||
// "log"
|
||||
"sync/atomic"
|
||||
|
||||
"6.5840/kvsrv1/rpc"
|
||||
"6.5840/tester1"
|
||||
)
|
||||
|
||||
type Clerk struct {
|
||||
clnt *tester.Clnt
|
||||
servers []string
|
||||
deposed *int32
|
||||
// You will have to modify this struct.
|
||||
}
|
||||
|
||||
// The shard controller can use MakeClerk to make a clerk for the kvraft
|
||||
// group with the servers `servers`.
|
||||
func MakeClerk(clnt *tester.Clnt, servers []string, deposed *int32) *Clerk {
|
||||
ck := &Clerk{clnt: clnt, servers: servers, deposed: deposed}
|
||||
// You may add code here.
|
||||
return ck
|
||||
}
|
||||
|
||||
func (ck *Clerk) isDeposed() bool {
|
||||
z := atomic.LoadInt32(ck.deposed)
|
||||
return z == 1
|
||||
}
|
||||
|
||||
// You can reuse your kvraft Get
|
||||
func (ck *Clerk) Get(key string) (string, rpc.Tversion, rpc.Err) {
|
||||
args := rpc.GetArgs{}
|
||||
args.Key = key
|
||||
|
||||
// You'll have to add code here.
|
||||
return "", 0, ""
|
||||
}
|
||||
|
||||
// You can reuse your kvraft Put
|
||||
func (ck *Clerk) Put(key string, value string, version rpc.Tversion) rpc.Err {
|
||||
args := rpc.PutArgs{}
|
||||
args.Key = key
|
||||
args.Value = value
|
||||
args.Version = version
|
||||
|
||||
// You'll have to add code here.
|
||||
return ""
|
||||
}
|
@ -1,58 +0,0 @@
|
||||
package lock
|
||||
|
||||
import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"6.5840/kvsrv1/rpc"
|
||||
"6.5840/kvtest1"
|
||||
)
|
||||
|
||||
type Lock struct {
|
||||
kvtest.IKVClerk
|
||||
l string
|
||||
id string
|
||||
ver rpc.Tversion
|
||||
}
|
||||
|
||||
func MakeLock(ck kvtest.IKVClerk, l string) *Lock {
|
||||
lk := &Lock{IKVClerk: ck}
|
||||
// You may add core here
|
||||
return lk
|
||||
}
|
||||
|
||||
func (lk *Lock) AcquireLeadership() {
|
||||
for {
|
||||
if val, ver, err := lk.Get(lk.l); err == rpc.OK {
|
||||
if val == "" { // put only when lock is free
|
||||
if err := lk.Put(lk.l, lk.id, ver); err == rpc.OK {
|
||||
lk.ver = ver + 1
|
||||
return
|
||||
} else if err == rpc.ErrMaybe { // check if put succeeded?
|
||||
if val, ver, err := lk.Get(lk.l); err == rpc.OK {
|
||||
if val == lk.id {
|
||||
lk.ver = ver
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
time.Sleep(1 * time.Millisecond)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// for two testing purposes: 1) for the ctrler that is a leader to
|
||||
// give up its leadership; 2) to take back leadership from a
|
||||
// partitioned/deposed ctrler using a new ctrler.
|
||||
func (lk *Lock) ReleaseLeadership() rpc.Err {
|
||||
_, ver, err := lk.Get(lk.l)
|
||||
if err != rpc.OK {
|
||||
log.Printf("ResetLock: %v err %v", lk.l, err)
|
||||
}
|
||||
if err := lk.Put(lk.l, "", ver); err == rpc.OK || err == rpc.ErrMaybe {
|
||||
return rpc.OK
|
||||
} else {
|
||||
return err
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user