Implements and extends WatDFS (FUSE over RPC) for CS454/654 Assignments 2 and 3. Use when editing watdfs_client.cpp, watdfs_server.cpp, P2/P3 specs, RPC calls, client caching, or server concurrency (e.g. rw_lock).
rpcCall("name", arg_types, args). Do not modify watdfs_client.h.get_full_path(short_path) and syscalls, sets *ret to 0 or -errno. Registers handlers in main with rpcRegister("name", argTypes, handler).rpcClientInit, rpcServerInit, rpcRegister, rpcCall, rpcExecute), arg type macros (ARG_INPUT, ARG_OUTPUT, ARG_ARRAY, ARG_CHAR, ARG_INT, ARG_LONG), MAX_ARRAY_LEN (65535).cd /u5/y3739zhang/cs454/p2
make clean && make all # builds libwatdfs.a watdfs_server watdfs_client
Server (blocking; prints address/port then serves):
mkdir -p /tmp/$USER/p2_server
./watdfs_server /tmp/$USER/p2_server # stdout: export SERVER_ADDRESS=... export SERVER_PORT=...
Client (needs env from server):
export SERVER_ADDRESS=<from server>
export SERVER_PORT=<from server>
./watdfs_client -f <mount_point> <path_to_cache> <cache_interval>
void **args, int arg_types[N+1]. Set types with (1u << ARG_INPUT)|(1u << ARG_ARRAY)|(ARG_CHAR << 16u)| length, etc. Last arg_types[N] = 0. Call rpcCall("name", arg_types, args). Check rpc_ret < 0 and server retcode; return retcode or -EINVAL. Free buffers.args[i] to path, structs, int *ret. Use get_full_path(short_path) for path-based calls; free(full_path) after. Set *ret = 0 or *ret = -errno. Return 0 from handler.rw_lock.cpp/rw_lock.h to server Makefile; use reader–writer locks for shared server state (e.g. around global or per-file state).rpcServerInit(); use DLOG for debug; zero stat on client when returning negative ret. Read/write in chunks ≤ MAX_ARRAY_LEN. Do not modify rpc.h.