57 lines
1.9 KiB
Go
57 lines
1.9 KiB
Go
package kvsrv
|
|
|
|
import (
|
|
"6.5840/kvsrv1/rpc"
|
|
"6.5840/kvtest1"
|
|
"6.5840/tester1"
|
|
)
|
|
|
|
|
|
type Clerk struct {
|
|
clnt *tester.Clnt
|
|
server string
|
|
}
|
|
|
|
func MakeClerk(clnt *tester.Clnt, server string) kvtest.IKVClerk {
|
|
ck := &Clerk{clnt: clnt, server: server}
|
|
// You may add code here.
|
|
return ck
|
|
}
|
|
|
|
// Get fetches the current value and version for a key. It returns
|
|
// ErrNoKey if the key does not exist. It keeps trying forever in the
|
|
// face of all other errors.
|
|
//
|
|
// You can send an RPC with code like this:
|
|
// ok := ck.clnt.Call(ck.server, "KVServer.Get", &args, &reply)
|
|
//
|
|
// The types of args and reply (including whether they are pointers)
|
|
// must match the declared types of the RPC handler function's
|
|
// arguments. Additionally, reply must be passed as a pointer.
|
|
func (ck *Clerk) Get(key string) (string, rpc.Tversion, rpc.Err) {
|
|
// You will have to modify this function.
|
|
return "", 0, rpc.ErrNoKey
|
|
}
|
|
|
|
// Put updates key with value only if the version in the
|
|
// request matches the version of the key at the server. If the
|
|
// versions numbers don't match, the server should return
|
|
// ErrVersion. If Put receives an ErrVersion on its first RPC, Put
|
|
// should return ErrVersion, since the Put was definitely not
|
|
// performed at the server. If the server returns ErrVersion on a
|
|
// resend RPC, then Put must return ErrMaybe to the application, since
|
|
// its earlier RPC might have been processed by the server successfully
|
|
// but the response was lost, and the the Clerk doesn't know if
|
|
// the Put was performed or not.
|
|
//
|
|
// You can send an RPC with code like this:
|
|
// ok := ck.clnt.Call(ck.server, "KVServer.Put", &args, &reply)
|
|
//
|
|
// The types of args and reply (including whether they are pointers)
|
|
// must match the declared types of the RPC handler function's
|
|
// arguments. Additionally, reply must be passed as a pointer.
|
|
func (ck *Clerk) Put(key, value string, version rpc.Tversion) rpc.Err {
|
|
// You will have to modify this function.
|
|
return rpc.ErrNoKey
|
|
}
|