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