0

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 --

継承によるプロトコル バッファのシリアル化。派生クラスは空です

これは興味深いかもしれません。ただし、まだコードを機能させることはできません。

4

1 に答える 1