This commit is contained in:
Frans Kaashoek 2025-02-26 06:55:12 -05:00
parent d9bd8fe4da
commit b8a42074a2
2 changed files with 0 additions and 107 deletions

View File

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

View File

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