You may work on this programming assignment in groups of 2 people. Again, you can work along but it's probably wiser to get a partner.
We are giving you a working user-level NFS server written in Java. This server is quite cool in that you can mount it on a client machine and run normal programs such as cat, vi, etc., on the files exported by the server. However, it only runs on a single node and relies on the native file system of the node for persistent data storage as shown in the following figure:

Your task is to write a remote accessible block server and modify the server that we give you to use multiple block servers for persistent storage of its files. The architecture should become:
In our implementation, each file is just represented by a mapping to a file in the native file system on the local disk. In your modified file system, each file will have to be represented by an inode and a number of blocks as the single-node file system you previously worked on. Both the inodes and the data blocks must be stored on the block server. You do need to maintain a persistent inode map on your NFS server though to help you locate the inode of a file on the block servers when given a filename by the client. Your NFS server must also implement a buffer cache for efficiency. At the same time, you must have explicit durability and availability goals in mind and design your system to meet these goals. Your durability and availability goals should require you to replicate each block and inode to at least two block servers. Also, you must consider how to preserve the consistency of your system if any of the components crashes. (The most troubling is probably when the NFS server itself crashes.) If your system can become inconsistent because of crashes, then you should also write a tool such as fsck to correct any inconsistencies. Alternatively, you can try to design your system to never enter an inconsistent state (e.g., by using transactions for example). This latter alternative may have a large performance cost. Finally, similar to the single-node file system, your design should be driven by properties of an envisioned workload (e.g., normal interactive access vs. storage and playing of multi-media files).
In other words, you must create a design with specific performance, durability, and availability goals and implement a distributed block-based file system to achieve these goals.
Again, it might be in your interest to schedule a meeting with us (instructor & TA) to discuss your design once you have done some prototyping to understand the challenges that you are faced with.
As always, turn in your assignment using WebCT once you are done.
You should handin the following: