ONCRPC と Google Protobuf を使用して、HDFS の C++ 実装を作成しています。私が直面している問題は、複数のフィールドが入力されたprotobufオブジェクトを送信していることです(シリアル化された文字列を送信し、受信側でそれを解析します)が、受信側でフィールドの1つが設定されていません/存在しません。
これは私の hdfs.proto ファイルの一部です:
message AssignBlockRequest {
optional int32 handle = 1; // obtain using call to OpenFile
}
message AssignBlockResponse {
optional int32 status = 1;
optional BlockLocations newBlock = 2;
}
message BlockLocations {
optional int32 blockNumber = 1;
repeated DataNodeLocation locations = 2;
}
message DataNodeLocation {
optional string ip = 1;
optional int32 port = 2;
}
これを「クライアント」アプリケーションで使用して、「namenode サーバー」に新しいブロックと、書き込むデータを送信できる datanodelocations のリストを照会します。
だから、私のクライアントで:
AssignBlockResponse assignnewblock_ ( int fhandle, CLIENT* clnt ) {
AssignBlockRequest req;
req.set_handle(fhandle);
//send request to nn
string str;
req.SerializeToString(&str);
static char *cstr = new char[str.length() + 1];
memcpy(cstr, str.c_str(), str.length()+1);
char **result_abreq;
result_abreq = assignblock_1( &cstr, clnt );
//handle response
AssignBlockResponse rsp;
string str_arg (*result_abreq);
rsp.ParseFromString(str_arg);
cout << "NN RETURNED : " << rsp.status() << " " << rsp.has_newblock() << endl;
return rsp;
}
私のnamenode server.ccにいる間
char **
assignblock_1_svc(char **argp, struct svc_req *rqstp)
{
AssignBlockRequest req;
string str_arg (*argp);
req.ParseFromString(str_arg);
AssignBlockResponse rsp;
if ( DataNodeList.empty() ) { // no DN available
rsp.set_status (1);
}
else {
rsp.set_status (0);
int BL_NUM = 0;
vector<int> shuf;
BlockLocations bl;// = new BlockLocations;
bl.set_blocknumber(BL_NUM);
rsp.mutable_newblock()->CopyFrom(bl);
}
cout << "NN RETURNED : " << rsp.status() << " " << rsp.has_newblock() << endl;
string str;
rsp.SerializeToString(&str);
static char *cstr = new char[str.length() + 1];
memcpy(cstr, str.c_str(), str.length()+1);
return &cstr;
}
NN は「0 1」を出力しますが、この AssignBlockResponse タイプのリクエストを受信したクライアントは「0 0」を示します。つまり、正しいステータスを取得します (AssignBlockResponse メッセージで設定されたステータスを変更することによってテストされます)。それにserver.cc。
どんな助けでも大歓迎です。
-- 編集 1 --
継承によるプロトコル バッファのシリアル化。派生クラスは空です
これは興味深いかもしれません。ただし、まだコードを機能させることはできません。