Implement a simple client for GFS (Google File System, a distributed file system), it provides the following methods:
read(filename)
. Read the file with given filename from GFS.write(filename, content)
. Write a file with given filename & content to GFS.
There are two private methods that already implemented in the base class:
readChunk(filename, chunkIndex)
. Read a chunk from GFS.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);
}
}
};