WIP: 1/2 of low-level projection proto finished, machi_flu1_test fails

This commit is contained in:
Scott Lystig Fritchie 2015-06-24 17:20:18 +09:00
parent 725b10ba90
commit 31c5bcc0c7
4 changed files with 114 additions and 33 deletions

View file

@ -78,7 +78,7 @@ message Mpb_ChunkCSum {
// epoch_id() type
message Mpb_EpochID {
required uint32 epoch_num = 1;
required uint32 epoch_number = 1;
required bytes epoch_csum = 2;
}
@ -321,7 +321,7 @@ message Mpb_LL_GetLatestEpochIDReq {
}
message Mpb_LL_GetLatestEpochIDResp {
required uint32 Mpb_GeneralStatusCode = 1;
required Mpb_GeneralStatusCode status = 1;
optional Mpb_EpochID epoch_id = 2;
}
@ -332,7 +332,7 @@ message Mpb_LL_ReadLatestProjectionReq {
}
message Mpb_LL_ReadLatestProjectionResp {
required uint32 Mpb_GeneralStatusCode = 1;
required Mpb_GeneralStatusCode status = 1;
optional Mpb_ProjectionV1 proj = 1;
}
@ -344,7 +344,7 @@ message Mpb_LL_ReadProjectionReq {
}
message Mpb_LL_ReadProjectionResp {
required uint32 Mpb_GeneralStatusCode = 1;
required Mpb_GeneralStatusCode status = 1;
optional Mpb_ProjectionV1 proj = 2;
}
@ -356,7 +356,7 @@ message Mpb_LL_WriteProjectionReq {
}
message Mpb_LL_WriteProjectionResp {
required uint32 Mpb_GeneralStatusCode = 1;
required Mpb_GeneralStatusCode status = 1;
}
// Low level API: get_all_projections() request & response
@ -366,7 +366,7 @@ message Mpb_LL_GetAllProjectionsReq {
}
message Mpb_LL_GetAllProjectionsResp {
required uint32 Mpb_GeneralStatusCode = 1;
required Mpb_GeneralStatusCode status = 1;
repeated Mpb_ProjectionV1 proj = 2;
}
@ -377,7 +377,7 @@ message Mpb_LL_ListAllProjectionsReq {
}
message Mpb_LL_ListAllProjectionsResp {
required uint32 Mpb_GeneralStatusCode = 1;
required Mpb_GeneralStatusCode status = 1;
repeated uint32 epochs = 2;
}
@ -400,12 +400,12 @@ message Mpb_LL_Request {
// that not all languages might care about? (Erlang doesn't)
optional Mpb_EchoReq echo = 10; // Re-use from high level API
optional Mpb_AuthReq auth = 11; // Re-use from high level API
optional Mpb_LL_GetLatestEpochIDReq = 12;
optional Mpb_LL_ReadLatestProjectionReq = 13;
optional Mpb_LL_ReadProjectionReq = 14;
optional Mpb_LL_WriteProjectionReq = 15;
optional Mpb_LL_GetAllProjectionsReq = 16;
optional Mpb_LL_ListAllProjectionsReq = 17;
optional Mpb_LL_GetLatestEpochIDReq proj_gl = 12;
optional Mpb_LL_ReadLatestProjectionReq proj_rl = 13;
optional Mpb_LL_ReadProjectionReq proj_rp = 14;
optional Mpb_LL_WriteProjectionReq proj_wp = 15;
optional Mpb_LL_GetAllProjectionsReq proj_ga = 16;
optional Mpb_LL_ListAllProjectionsReq proj_la = 17;
}
message Mpb_LL_Response {
@ -424,5 +424,10 @@ message Mpb_LL_Response {
// Specific responses.
optional Mpb_EchoResp echo = 10; // Re-use from high level API
optional Mpb_AuthResp auth = 11; // Re-use from high level API
optional Mpb_LL_GetLatestEpochIDResp = 12;
optional Mpb_LL_GetLatestEpochIDResp proj_gl = 12;
optional Mpb_LL_ReadLatestProjectionResp proj_rl = 13;
optional Mpb_LL_ReadProjectionResp proj_rp = 14;
optional Mpb_LL_WriteProjectionResp proj_wp = 15;
optional Mpb_LL_GetAllProjectionsResp proj_ga = 16;
optional Mpb_LL_ListAllProjectionsResp proj_la = 17;
}

View file

@ -802,38 +802,44 @@ trunc_hack2(Sock, EpochID, File) ->
end.
get_latest_epochid2(Sock, ProjType) ->
ProjCmd = {get_latest_epochid, ProjType},
do_projection_common(Sock, ProjCmd).
Req = machi_pb_wrap:make_projection_req(
<<42>>, {get_latest_epochid, ProjType}),
do_projection_common(Sock, Req).
read_latest_projection2(Sock, ProjType) ->
ProjCmd = {read_latest_projection, ProjType},
do_projection_common(Sock, ProjCmd).
Req = machi_pb_wrap:make_projection_req(
<<42>>, {read_latest_projection, ProjType}),
do_projection_common(Sock, Req).
read_projection2(Sock, ProjType, Epoch) ->
ProjCmd = {read_projection, ProjType, Epoch},
do_projection_common(Sock, ProjCmd).
Req = machi_pb_wrap:make_projection_req(
<<42>>, {read_projection, ProjType, Epoch}),
do_projection_common(Sock, Req).
write_projection2(Sock, ProjType, Proj) ->
ProjCmd = {write_projection, ProjType, Proj},
do_projection_common(Sock, ProjCmd).
Req = machi_pb_wrap:make_projection_req(
<<42>>, {write_projection, ProjType, Proj}),
do_projection_common(Sock, Req).
get_all_projections2(Sock, ProjType) ->
ProjCmd = {get_all_projections, ProjType},
do_projection_common(Sock, ProjCmd).
Req = machi_pb_wrap:make_projection_req(
<<42>>, {get_all_projections, ProjType}),
do_projection_common(Sock, Req).
list_all_projections2(Sock, ProjType) ->
ProjCmd = {list_all_projections, ProjType},
do_projection_common(Sock, ProjCmd).
Req = machi_pb_wrap:make_projection_req(
<<42>>, {list_all_projections, ProjType}),
do_projection_common(Sock, Req).
do_projection_common(Sock, ProjCmd) ->
do_projection_common(Sock, Req) ->
erase(bad_sock),
try
ProjCmdBin = term_to_binary(ProjCmd),
Len = iolist_size(ProjCmdBin),
ReqBin = machi_pb:encode_mpb_ll_request(Req),
Len = iolist_size(ReqBin),
true = (Len =< ?MAX_CHUNK_SIZE),
LenHex = machi_util:int_to_hexbin(Len, 32),
Cmd = [<<"PROJ ">>, LenHex, <<"\n">>],
ok = w_send(Sock, [Cmd, ProjCmdBin]),
ok = w_send(Sock, [Cmd, ReqBin]),
ok = w_setopts(Sock, [{packet, line}]),
case w_recv(Sock, 0) of
{ok, Line} ->
@ -841,9 +847,10 @@ do_projection_common(Sock, ProjCmd) ->
<<"OK ", ResLenHex:8/binary, "\n">> ->
ResLen = machi_util:hexstr_to_int(ResLenHex),
ok = w_setopts(Sock, [{packet, raw}]),
{ok, ResBin} = w_recv(Sock, ResLen),
{ok, RespBin} = w_recv(Sock, ResLen),
ok = w_setopts(Sock, [{packet, line}]),
binary_to_term(ResBin);
Resp = machi_pb:decode_mbp_ll_response(RespBin),
machi_pb_wrap:unmake_projection_resp(Resp);
Else ->
{error, Else}
end

View file

@ -44,6 +44,7 @@
checksum_list/2, checksum_list/3,
list_files/1, list_files/2
]).
-export([convert_general_status_code/1]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@ -354,6 +355,8 @@ convert_append_chunk_resp(#mpb_appendchunkresp{status='OK', chunk_pos=CP}) ->
convert_append_chunk_resp(#mpb_appendchunkresp{status=Status}) ->
convert_general_status_code(Status).
convert_general_status_code('OK') ->
ok;
convert_general_status_code('BAD_ARG') ->
{error, bad_arg};
convert_general_status_code('WEDGED') ->

View file

@ -19,13 +19,23 @@
%% under the License.
%%
%% -------------------------------------------------------------------
%% @doc Wrappers for Protocol Buffers encoding, including hacks to fix
%% impedance mismatches between Erlang terms and PB encodings.
%%
%% TODO: Any use of enc_sexp() and dec_sexp() should be eliminated,
%% except for the possibility of items where we are 100% sure
%% that a non-Erlang software component can get away with always
%% treating that item as an opaque thing.
-module(machi_pb_wrap).
-include("machi_pb.hrl").
-include("machi_projection.hrl").
-export([enc_p_srvr/1, dec_p_srvr/1,
enc_projection_v1/1, dec_projection_v1/1]).
enc_projection_v1/1, dec_projection_v1/1,
make_projection_req/2, unmake_projection_resp/1]).
-ifdef(TEST).
-compile(export_all).
-endif. % TEST
@ -124,6 +134,57 @@ conv_to_projection_v1(#mpb_projectionv1{epoch_number=Epoch,
dbg2=dec_sexp(Dbg2),
members_dict=conv_to_members_dict(MembersDict)}.
make_projection_req(ID, {get_latest_epochid, ProjType}) ->
#mpb_ll_request{req_id=ID,
proj_gl=#mpb_ll_getlatestepochidreq{type=conv_from_type(ProjType)}};
make_projection_req(ID, {read_latest_projection, ProjType}) ->
#mpb_ll_request{req_id=ID,
proj_rl=#mpb_ll_readlatestprojectionreq{type=conv_from_type(ProjType)}};
make_projection_req(ID, {read_projection, ProjType, Epoch}) ->
#mpb_ll_request{req_id=ID,
proj_rp=#mpb_ll_readprojectionreq{type=conv_from_type(ProjType),
epoch_number=Epoch}};
make_projection_req(ID, {write_projection, ProjType, Proj}) ->
ProjM = conv_from_projection_v1(Proj),
#mpb_ll_request{req_id=ID,
proj_wp=#mpb_ll_writeprojectionreq{type=conv_from_type(ProjType),
proj=ProjM}};
make_projection_req(ID, {get_all_projections, ProjType}) ->
#mpb_ll_request{req_id=ID,
proj_ga=#mpb_ll_getallprojectionsreq{type=conv_from_type(ProjType)}};
make_projection_req(ID, {list_all_projections, ProjType}) ->
#mpb_ll_request{req_id=ID,
proj_la=#mpb_ll_listallprojectionsreq{type=conv_from_type(ProjType)}}.
unmake_projection_resp(#mpb_ll_response{proj_gl=#mpb_ll_getlatestepochidresp{
status=Status, epoch_id=EID}}) ->
case Status of
'OK' ->
#mpb_epochid{epoch_number=Epoch, epoch_csum=CSum} = EID,
{ok, {Epoch, CSum}};
_ ->
machi_pb_high_client:convert_general_status_code(Status)
end;
unmake_projection_resp(#mpb_ll_response{proj_rl=#mpb_ll_readlatestprojectionresp{
status=Status, proj=P}}) ->
case Status of
'OK' ->
{ok, conv_to_projection_v1(P)};
_ ->
machi_pb_high_client:convert_general_status_code(Status)
end;
unmake_projection_resp(#mpb_ll_response{proj_rp=#mpb_ll_readprojectionresp{
status=Status, proj=P}}) ->
case Status of
'OK' ->
{ok, conv_to_projection_v1(P)};
_ ->
machi_pb_high_client:convert_general_status_code(Status)
end;
unmake_projection_resp(#mpb_ll_response{proj_wp=#mpb_ll_writeprojectionresp{
status=Status}}) ->
machi_pb_high_client:convert_general_status_code(Status).
%%%%%%%%%%%%%%%%%%%
enc_sexp(T) ->
@ -192,3 +253,8 @@ conv_from_mode(cp_mode) -> 'CP_MODE'.
conv_to_mode('AP_MODE') -> ap_mode;
conv_to_mode('CP_MODE') -> cp_mode.
conv_from_type(private) -> 'PRIVATE';
conv_from_type(public) -> 'PUBLIC'.
conv_to_type('PRIVATE') -> private;
conv_to_type('PUBLIC') -> public.