Implement a simple client for GFS (Google File System, a distributed file system), it provides the following methods:

  1. read(filename) . Read the file with given filename from GFS.
  2. write(filename, content) . Write a file with given filename & content to GFS.

There are two private methods that already implemented in the base class:

  1. readChunk(filename, chunkIndex) . Read a chunk from GFS.
  2. writeChunk(filename, chunkIndex, chunkData) . Write a chunk to GFS.

To simplify this question, we can assume that the chunk size is_chunkSize_bytes. (In a real world system, it is 64M). The GFS Client's job is splitting a file into multiple chunks (if need) and save to the remote GFS server._chunkSize_will be given in the constructor. You need to call these two private methods to implement read & write methods.

Have you met this question in a real interview?

Yes

Example

GFSClient(5)
read("a.txt")

>
>
 null
write("a.txt", "World")

>
>
 You don't need to return anything, but you need to call writeChunk("a.txt", 0, "World") to write a 5 bytes chunk to GFS.
read("a.txt")

>
>
 "World"
write("b.txt", "111112222233")

>
>
 You need to save "11111" at chink 0, "22222" at chunk 1, "33" at chunk 2.
write("b.txt", "aaaaabbbbb")
read("b.txt")

>
>
 "aaaaabbbbb"
/* Definition of BaseGFSClient
 * class BaseGFSClient {
 * private: map<string, string> chunk_list;
 * public:
 *     string readChunk(string& filename, int chunkIndex) {
 *         // Read a chunk from GFS
 *     }
 *     void writeChunk(string& filename, int chunkIndex,
 *                     string& content) {
 *         // Write a chunk to GFS     
 *     }
 *  };
 */
class GFSClient : public BaseGFSClient {
private:
    int m_chunkSize;
    map<string, int> m_chunkNum;

public:
    GFSClient(int chunkSize) {
        // initialize your data structure here
        m_chunkSize = chunkSize;
    }

    // @param filename a file name
    // @return conetent of the file given from GFS
    string read(string& filename) {
        // Write your code here
        if (m_chunkNum.find(filename) == m_chunkNum.end())
            return "";
        int size = m_chunkNum[filename];
        string content;
        for (int i = 0; i < size; ++i) {
            content += readChunk(filename, i);
        }
        return content;
    }

    // @param filename a file name
    // @param content a string
    // @return void
    void write(string& filename, string& content) {
        // Write your code here
        if (content.empty()) {
            return;
        }
        int len = content.size();
        int chunkNum = (len - 1) / m_chunkSize + 1;
        m_chunkNum[filename] = chunkNum;
        for (int i = 0; i < chunkNum; ++i) {
            string subStr = content.substr(i * m_chunkSize, m_chunkSize);
            writeChunk(filename, i, subStr);     
        }
    }
};

results matching ""

    No results matching ""