WIP: 1/2 of low-level projection proto finished, machi_flu1_test fails
This commit is contained in:
parent
725b10ba90
commit
31c5bcc0c7
4 changed files with 114 additions and 33 deletions
|
@ -78,7 +78,7 @@ message Mpb_ChunkCSum {
|
||||||
|
|
||||||
// epoch_id() type
|
// epoch_id() type
|
||||||
message Mpb_EpochID {
|
message Mpb_EpochID {
|
||||||
required uint32 epoch_num = 1;
|
required uint32 epoch_number = 1;
|
||||||
required bytes epoch_csum = 2;
|
required bytes epoch_csum = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -321,7 +321,7 @@ message Mpb_LL_GetLatestEpochIDReq {
|
||||||
}
|
}
|
||||||
|
|
||||||
message Mpb_LL_GetLatestEpochIDResp {
|
message Mpb_LL_GetLatestEpochIDResp {
|
||||||
required uint32 Mpb_GeneralStatusCode = 1;
|
required Mpb_GeneralStatusCode status = 1;
|
||||||
optional Mpb_EpochID epoch_id = 2;
|
optional Mpb_EpochID epoch_id = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ message Mpb_LL_ReadLatestProjectionReq {
|
||||||
}
|
}
|
||||||
|
|
||||||
message Mpb_LL_ReadLatestProjectionResp {
|
message Mpb_LL_ReadLatestProjectionResp {
|
||||||
required uint32 Mpb_GeneralStatusCode = 1;
|
required Mpb_GeneralStatusCode status = 1;
|
||||||
optional Mpb_ProjectionV1 proj = 1;
|
optional Mpb_ProjectionV1 proj = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -344,7 +344,7 @@ message Mpb_LL_ReadProjectionReq {
|
||||||
}
|
}
|
||||||
|
|
||||||
message Mpb_LL_ReadProjectionResp {
|
message Mpb_LL_ReadProjectionResp {
|
||||||
required uint32 Mpb_GeneralStatusCode = 1;
|
required Mpb_GeneralStatusCode status = 1;
|
||||||
optional Mpb_ProjectionV1 proj = 2;
|
optional Mpb_ProjectionV1 proj = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -356,7 +356,7 @@ message Mpb_LL_WriteProjectionReq {
|
||||||
}
|
}
|
||||||
|
|
||||||
message Mpb_LL_WriteProjectionResp {
|
message Mpb_LL_WriteProjectionResp {
|
||||||
required uint32 Mpb_GeneralStatusCode = 1;
|
required Mpb_GeneralStatusCode status = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Low level API: get_all_projections() request & response
|
// Low level API: get_all_projections() request & response
|
||||||
|
@ -366,7 +366,7 @@ message Mpb_LL_GetAllProjectionsReq {
|
||||||
}
|
}
|
||||||
|
|
||||||
message Mpb_LL_GetAllProjectionsResp {
|
message Mpb_LL_GetAllProjectionsResp {
|
||||||
required uint32 Mpb_GeneralStatusCode = 1;
|
required Mpb_GeneralStatusCode status = 1;
|
||||||
repeated Mpb_ProjectionV1 proj = 2;
|
repeated Mpb_ProjectionV1 proj = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +377,7 @@ message Mpb_LL_ListAllProjectionsReq {
|
||||||
}
|
}
|
||||||
|
|
||||||
message Mpb_LL_ListAllProjectionsResp {
|
message Mpb_LL_ListAllProjectionsResp {
|
||||||
required uint32 Mpb_GeneralStatusCode = 1;
|
required Mpb_GeneralStatusCode status = 1;
|
||||||
repeated uint32 epochs = 2;
|
repeated uint32 epochs = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -400,12 +400,12 @@ message Mpb_LL_Request {
|
||||||
// that not all languages might care about? (Erlang doesn't)
|
// that not all languages might care about? (Erlang doesn't)
|
||||||
optional Mpb_EchoReq echo = 10; // Re-use from high level API
|
optional Mpb_EchoReq echo = 10; // Re-use from high level API
|
||||||
optional Mpb_AuthReq auth = 11; // 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_GetLatestEpochIDReq proj_gl = 12;
|
||||||
optional Mpb_LL_ReadLatestProjectionReq = 13;
|
optional Mpb_LL_ReadLatestProjectionReq proj_rl = 13;
|
||||||
optional Mpb_LL_ReadProjectionReq = 14;
|
optional Mpb_LL_ReadProjectionReq proj_rp = 14;
|
||||||
optional Mpb_LL_WriteProjectionReq = 15;
|
optional Mpb_LL_WriteProjectionReq proj_wp = 15;
|
||||||
optional Mpb_LL_GetAllProjectionsReq = 16;
|
optional Mpb_LL_GetAllProjectionsReq proj_ga = 16;
|
||||||
optional Mpb_LL_ListAllProjectionsReq = 17;
|
optional Mpb_LL_ListAllProjectionsReq proj_la = 17;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Mpb_LL_Response {
|
message Mpb_LL_Response {
|
||||||
|
@ -424,5 +424,10 @@ message Mpb_LL_Response {
|
||||||
// Specific responses.
|
// Specific responses.
|
||||||
optional Mpb_EchoResp echo = 10; // Re-use from high level API
|
optional Mpb_EchoResp echo = 10; // Re-use from high level API
|
||||||
optional Mpb_AuthResp auth = 11; // 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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -802,38 +802,44 @@ trunc_hack2(Sock, EpochID, File) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
get_latest_epochid2(Sock, ProjType) ->
|
get_latest_epochid2(Sock, ProjType) ->
|
||||||
ProjCmd = {get_latest_epochid, ProjType},
|
Req = machi_pb_wrap:make_projection_req(
|
||||||
do_projection_common(Sock, ProjCmd).
|
<<42>>, {get_latest_epochid, ProjType}),
|
||||||
|
do_projection_common(Sock, Req).
|
||||||
|
|
||||||
read_latest_projection2(Sock, ProjType) ->
|
read_latest_projection2(Sock, ProjType) ->
|
||||||
ProjCmd = {read_latest_projection, ProjType},
|
Req = machi_pb_wrap:make_projection_req(
|
||||||
do_projection_common(Sock, ProjCmd).
|
<<42>>, {read_latest_projection, ProjType}),
|
||||||
|
do_projection_common(Sock, Req).
|
||||||
|
|
||||||
read_projection2(Sock, ProjType, Epoch) ->
|
read_projection2(Sock, ProjType, Epoch) ->
|
||||||
ProjCmd = {read_projection, ProjType, Epoch},
|
Req = machi_pb_wrap:make_projection_req(
|
||||||
do_projection_common(Sock, ProjCmd).
|
<<42>>, {read_projection, ProjType, Epoch}),
|
||||||
|
do_projection_common(Sock, Req).
|
||||||
|
|
||||||
write_projection2(Sock, ProjType, Proj) ->
|
write_projection2(Sock, ProjType, Proj) ->
|
||||||
ProjCmd = {write_projection, ProjType, Proj},
|
Req = machi_pb_wrap:make_projection_req(
|
||||||
do_projection_common(Sock, ProjCmd).
|
<<42>>, {write_projection, ProjType, Proj}),
|
||||||
|
do_projection_common(Sock, Req).
|
||||||
|
|
||||||
get_all_projections2(Sock, ProjType) ->
|
get_all_projections2(Sock, ProjType) ->
|
||||||
ProjCmd = {get_all_projections, ProjType},
|
Req = machi_pb_wrap:make_projection_req(
|
||||||
do_projection_common(Sock, ProjCmd).
|
<<42>>, {get_all_projections, ProjType}),
|
||||||
|
do_projection_common(Sock, Req).
|
||||||
|
|
||||||
list_all_projections2(Sock, ProjType) ->
|
list_all_projections2(Sock, ProjType) ->
|
||||||
ProjCmd = {list_all_projections, ProjType},
|
Req = machi_pb_wrap:make_projection_req(
|
||||||
do_projection_common(Sock, ProjCmd).
|
<<42>>, {list_all_projections, ProjType}),
|
||||||
|
do_projection_common(Sock, Req).
|
||||||
|
|
||||||
do_projection_common(Sock, ProjCmd) ->
|
do_projection_common(Sock, Req) ->
|
||||||
erase(bad_sock),
|
erase(bad_sock),
|
||||||
try
|
try
|
||||||
ProjCmdBin = term_to_binary(ProjCmd),
|
ReqBin = machi_pb:encode_mpb_ll_request(Req),
|
||||||
Len = iolist_size(ProjCmdBin),
|
Len = iolist_size(ReqBin),
|
||||||
true = (Len =< ?MAX_CHUNK_SIZE),
|
true = (Len =< ?MAX_CHUNK_SIZE),
|
||||||
LenHex = machi_util:int_to_hexbin(Len, 32),
|
LenHex = machi_util:int_to_hexbin(Len, 32),
|
||||||
Cmd = [<<"PROJ ">>, LenHex, <<"\n">>],
|
Cmd = [<<"PROJ ">>, LenHex, <<"\n">>],
|
||||||
ok = w_send(Sock, [Cmd, ProjCmdBin]),
|
ok = w_send(Sock, [Cmd, ReqBin]),
|
||||||
ok = w_setopts(Sock, [{packet, line}]),
|
ok = w_setopts(Sock, [{packet, line}]),
|
||||||
case w_recv(Sock, 0) of
|
case w_recv(Sock, 0) of
|
||||||
{ok, Line} ->
|
{ok, Line} ->
|
||||||
|
@ -841,9 +847,10 @@ do_projection_common(Sock, ProjCmd) ->
|
||||||
<<"OK ", ResLenHex:8/binary, "\n">> ->
|
<<"OK ", ResLenHex:8/binary, "\n">> ->
|
||||||
ResLen = machi_util:hexstr_to_int(ResLenHex),
|
ResLen = machi_util:hexstr_to_int(ResLenHex),
|
||||||
ok = w_setopts(Sock, [{packet, raw}]),
|
ok = w_setopts(Sock, [{packet, raw}]),
|
||||||
{ok, ResBin} = w_recv(Sock, ResLen),
|
{ok, RespBin} = w_recv(Sock, ResLen),
|
||||||
ok = w_setopts(Sock, [{packet, line}]),
|
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 ->
|
Else ->
|
||||||
{error, Else}
|
{error, Else}
|
||||||
end
|
end
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
checksum_list/2, checksum_list/3,
|
checksum_list/2, checksum_list/3,
|
||||||
list_files/1, list_files/2
|
list_files/1, list_files/2
|
||||||
]).
|
]).
|
||||||
|
-export([convert_general_status_code/1]).
|
||||||
|
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
|
-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_append_chunk_resp(#mpb_appendchunkresp{status=Status}) ->
|
||||||
convert_general_status_code(Status).
|
convert_general_status_code(Status).
|
||||||
|
|
||||||
|
convert_general_status_code('OK') ->
|
||||||
|
ok;
|
||||||
convert_general_status_code('BAD_ARG') ->
|
convert_general_status_code('BAD_ARG') ->
|
||||||
{error, bad_arg};
|
{error, bad_arg};
|
||||||
convert_general_status_code('WEDGED') ->
|
convert_general_status_code('WEDGED') ->
|
||||||
|
|
|
@ -19,13 +19,23 @@
|
||||||
%% under the License.
|
%% 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).
|
-module(machi_pb_wrap).
|
||||||
|
|
||||||
-include("machi_pb.hrl").
|
-include("machi_pb.hrl").
|
||||||
-include("machi_projection.hrl").
|
-include("machi_projection.hrl").
|
||||||
|
|
||||||
-export([enc_p_srvr/1, dec_p_srvr/1,
|
-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).
|
-ifdef(TEST).
|
||||||
-compile(export_all).
|
-compile(export_all).
|
||||||
-endif. % TEST
|
-endif. % TEST
|
||||||
|
@ -124,6 +134,57 @@ conv_to_projection_v1(#mpb_projectionv1{epoch_number=Epoch,
|
||||||
dbg2=dec_sexp(Dbg2),
|
dbg2=dec_sexp(Dbg2),
|
||||||
members_dict=conv_to_members_dict(MembersDict)}.
|
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) ->
|
enc_sexp(T) ->
|
||||||
|
@ -192,3 +253,8 @@ conv_from_mode(cp_mode) -> 'CP_MODE'.
|
||||||
conv_to_mode('AP_MODE') -> ap_mode;
|
conv_to_mode('AP_MODE') -> ap_mode;
|
||||||
conv_to_mode('CP_MODE') -> cp_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.
|
||||||
|
|
Loading…
Reference in a new issue