Introduction

In this lab, you will continue to add functionality to YFS supporting SETATTR, OPEN, WRITE and READ operations.

Getting started

First, merge your solution to Lab 2 with the new code for Lab 3. There are no substantive differences in our code between the labs, except for a new tester. We have also provided stubs for the FUSE functions you need to implement in order to make your job easier. You can use the following commands to get the Lab 3 sources; see the directions for Lab 2 for more background on git.
% cd lab
% git commit -am 'my solution to lab2'
Created commit ...
% git pull
remote: Generating pack...
...
% git checkout -b lab3 origin/lab3
Branch lab3 set up to track remote branch refs/remotes/origin/lab3.
Switched to a new branch "lab3"
% git merge lab2
As before, if git reports any conflicts, edit the files to merge them manually, then run git commit -a. Lab 3 builds upon Lab 2 so make sure you pass the Lab 2 tester before proceeding. When you're done with Lab 3, you should be able to read and write files in your file system. For example, use the start.sh script to start up two separate yfs_clients with mountpoints at "./yfs1" and "./yfs2", which both use the same extent server for organizing its data:
% cd ~/lab
% ./start.sh
Then, you can write files to one directory and read them from the other:
% ls -l yfs1 yfs2
yfs1:
total 0

yfs2:
total 0
% echo "Hello world" > yfs1/hello.txt
% ls -l yfs1 yfs2
yfs1:
total 0
-rw-rw-rw- 1 root root 12 Sep  6 20:14 hello.txt

yfs2:
total 0
-rw-rw-rw- 1 root root 12 Sep  6 20:14 hello.txt
% cat yfs2/hello.txt 
Hello world

Afterwards, be sure to stop your all the processes:

% ./stop.sh

If you try the above commands without implementing the required SETATTR, WRITE and READ operations, you will get an error.

Your Job

Your job is to implement SETATTR, OPEN, WRITE, and READ FUSE operations in fuse.cc. You must store the file system's contents in the extent server, so that you can share one file system among multiple yfs_clients.

If your server passes the tester test-lab-3.pl, then you are done. If you have questions about whether you have to implement specific pieces of FUSE functionality, then you should be guided by the tester: if you can pass the tests without implementing something, then don't bother implementing it. Please don't modify the test program or the RPC library in any way; we will be using our own versions of these files during grading.

The test-lab-3.pl script tests reading, writing, and appending to files, as well as testing whether files written on one yfs_client instance can be read through a second one. To run the tester, first start two yfs_clients using the start.sh script. It runs two yfs_client processes each mounting the same file system under a different name (yfs1 or yfs2).

% ./start.sh

Now run test-lab-3.pl by passing the yfs1 and yfs2 mountpoints. Since the script tests each yfs_client sequentially, we do not need to worry about locking for this lab.

% ./test-lab-3.pl ./yfs1 ./yfs2
Write and read one file: OK
Write and read a second file: OK
Overwrite an existing file: OK
Append to an existing file: OK
Write into the middle of an existing file: OK
Check that one cannot open non-existant file: OK
Check directory listing: OK
Read files via second server: OK
Check directory listing on second server: OK
Passed all tests
% ./stop.sh

If test-lab-3.pl exits without printing "Passed all tests!" or hangs indefinitely, then something is wrong with your file server.

Detailed Guidance

Handin procedure

Prepare a tar file by executing these commands:
% cd ~/ds-class/lab
% make clean
% cd ..
% tar czvf yfs-lab3.tgz lab/
That should produce a file called yfs-lab3.tgz in your ds-class/ directory. Go to submit site to upload yfs-lab3.tgz

You will receive full credit if your software passes the same tests we gave you when we run your software on our machines.