diff --git a/src/machi.proto b/src/machi.proto index 9b69dd6..d83c791 100644 --- a/src/machi.proto +++ b/src/machi.proto @@ -547,6 +547,8 @@ message Mpb_LL_Request { optional Mpb_LL_ChecksumListReq checksum_list = 33; optional Mpb_LL_ListFilesReq list_files = 34; optional Mpb_LL_WedgeStatusReq wedge_status = 35; + optional Mpb_LL_DeleteMigrationReq delete_migration = 36; + optional Mpb_LL_TruncHackReq trunc_hack = 37; } message Mpb_LL_Response { @@ -578,4 +580,6 @@ message Mpb_LL_Response { optional Mpb_LL_ChecksumListResp checksum_list = 33; optional Mpb_LL_ListFilesResp list_files = 34; optional Mpb_LL_WedgeStatusResp wedge_status = 35; + optional Mpb_LL_DeleteMigrationResp delete_migration = 36; + optional Mpb_LL_TruncHackResp trunc_hack = 37; } diff --git a/src/machi_flu1.erl b/src/machi_flu1.erl index fcef4e2..1d335bf 100644 --- a/src/machi_flu1.erl +++ b/src/machi_flu1.erl @@ -339,7 +339,11 @@ do_pb_request3({low_checksum_list, _EpochID, File}, S) -> do_pb_request3({low_list_files, _EpochID}, S) -> {do_pb_server_list_files(S), S}; do_pb_request3({low_wedge_status, _EpochID}, S) -> - {do_pb_server_wedge_status(S), S}. + {do_pb_server_wedge_status(S), S}; +do_pb_request3({low_delete_migration, _EpochID, File}, S) -> + {do_pb_server_delete_migration(File, S), S}; +do_pb_request3({low_trunc_hack, _EpochID, File}, S) -> + {do_pb_server_trunc_hack(File, S), S}. do_pb_server_append_chunk(PKey, Prefix, Chunk, CSum_tag, CSum, ChunkExtra, S) -> @@ -540,6 +544,45 @@ do_pb_server_wedge_status(S) -> {Wedged_p, CurrentEpochID} = ets:lookup_element(S#state.etstab, epoch, 2), {Wedged_p, CurrentEpochID}. +do_pb_server_delete_migration(File, #state{data_dir=DataDir}=_S) -> + case sanitize_file_string(File) of + ok -> + {_, Path} = machi_util:make_data_filename(DataDir, File), + case file:delete(Path) of + ok -> + ok; + {error, enoent} -> + {error, no_such_file}; + _ -> + {error, bad_arg} + end; + _ -> + {error, bad_arg} + end. + +do_pb_server_trunc_hack(File, #state{data_dir=DataDir}=_S) -> + case sanitize_file_string(File) of + ok -> + {_, Path} = machi_util:make_data_filename(DataDir, File), + case file:open(Path, [read, write, binary, raw]) of + {ok, FH} -> + try + {ok, ?MINIMUM_OFFSET} = file:position(FH, + ?MINIMUM_OFFSET), + ok = file:truncate(FH), + ok + after + file:close(FH) + end; + {error, enoent} -> + {error, no_such_file}; + _ -> + {error, bad_arg} + end; + _ -> + {error, bad_arg} + end. + net_server_loop_old(Sock, #state{flu_name=FluName, data_dir=DataDir}=S) -> %% TODO: Add testing control knob to adjust this timeout and/or inject %% timeout condition. diff --git a/src/machi_flu1_client.erl b/src/machi_flu1_client.erl index 40bb84c..ca52b71 100644 --- a/src/machi_flu1_client.erl +++ b/src/machi_flu1_client.erl @@ -571,70 +571,16 @@ checksum_list_finish(Chunks) -> Line /= <<>>]. delete_migration2(Sock, EpochID, File) -> - erase(bad_sock), - try - {EpochNum, EpochCSum} = EpochID, - EpochIDHex = machi_util:bin_to_hexstr( - <>), - Cmd = [<<"DEL-migration ">>, EpochIDHex, File, <<"\n">>], - ok = w_send(Sock, Cmd), - ok = w_setopts(Sock, [{packet, line}]), - case w_recv(Sock, 0) of - {ok, <<"OK\n">>} -> - ok; - {ok, <<"ERROR NO-SUCH-FILE", _/binary>>} -> - {error, no_such_file}; - {ok, <<"ERROR BAD-ARG", _/binary>>} -> - {error, bad_arg}; - {ok, <<"ERROR WEDGED", _/binary>>} -> - {error, wedged}; - {ok, Else} -> - throw({server_protocol_error, Else}) - end - catch - throw:Error -> - put(bad_sock, Sock), - Error; - error:{case_clause,_}=Noo -> - put(bad_sock, Sock), - {error, {badmatch, Noo, erlang:get_stacktrace()}}; - error:{badmatch,_}=BadMatch -> - put(bad_sock, Sock), - {error, {badmatch, BadMatch}} - end. + ReqID = <<"id">>, + Req = machi_pb_translate:to_pb_request( + ReqID, {low_delete_migration, EpochID, File}), + do_pb_request_common(Sock, ReqID, Req). trunc_hack2(Sock, EpochID, File) -> - erase(bad_sock), - try - {EpochNum, EpochCSum} = EpochID, - EpochIDHex = machi_util:bin_to_hexstr( - <>), - Cmd = [<<"TRUNC-hack--- ">>, EpochIDHex, File, <<"\n">>], - ok = w_send(Sock, Cmd), - ok = w_setopts(Sock, [{packet, line}]), - case w_recv(Sock, 0) of - {ok, <<"OK\n">>} -> - ok; - {ok, <<"ERROR NO-SUCH-FILE", _/binary>>} -> - {error, no_such_file}; - {ok, <<"ERROR BAD-ARG", _/binary>>} -> - {error, bad_arg}; - {ok, <<"ERROR WEDGED", _/binary>>} -> - {error, wedged}; - {ok, Else} -> - throw({server_protocol_error, Else}) - end - catch - throw:Error -> - put(bad_sock, Sock), - Error; - error:{case_clause,_}=Noo -> - put(bad_sock, Sock), - {error, {badmatch, Noo, erlang:get_stacktrace()}}; - error:{badmatch,_}=BadMatch -> - put(bad_sock, Sock), - {error, {badmatch, BadMatch}} - end. + ReqID = <<"id-trunc">>, + Req = machi_pb_translate:to_pb_request( + ReqID, {low_trunc_hack, EpochID, File}), + do_pb_request_common(Sock, ReqID, Req). get_latest_epochid2(Sock, ProjType) -> ReqID = <<42>>, diff --git a/src/machi_pb_translate.erl b/src/machi_pb_translate.erl index 165ac88..dc5b331 100644 --- a/src/machi_pb_translate.erl +++ b/src/machi_pb_translate.erl @@ -94,6 +94,20 @@ from_pb_request(#mpb_ll_request{ req_id=ReqID, wedge_status=#mpb_ll_wedgestatusreq{}}) -> {ReqID, {low_wedge_status, undefined}}; +from_pb_request(#mpb_ll_request{ + req_id=ReqID, + delete_migration=#mpb_ll_deletemigrationreq{ + epoch_id=PB_EpochID, + file=File}}) -> + EpochID = conv_to_epoch_id(PB_EpochID), + {ReqID, {low_delete_migration, EpochID, File}}; +from_pb_request(#mpb_ll_request{ + req_id=ReqID, + trunc_hack=#mpb_ll_trunchackreq{ + epoch_id=PB_EpochID, + file=File}}) -> + EpochID = conv_to_epoch_id(PB_EpochID), + {ReqID, {low_trunc_hack, EpochID, File}}; %%qqq from_pb_request(#mpb_request{req_id=ReqID, echo=#mpb_echoreq{message=Msg}}) -> @@ -205,6 +219,16 @@ from_pb_response(#mpb_ll_response{ PB_Wedged == 0 -> false end, {ReqID, {ok, {Wedged_p, EpochID}}}; +from_pb_response(#mpb_ll_response{ + req_id=ReqID, + delete_migration=#mpb_ll_deletemigrationresp{ + status=Status}}) -> + {ReqID, machi_pb_high_client:convert_general_status_code(Status)}; +from_pb_response(#mpb_ll_response{ + req_id=ReqID, + trunc_hack=#mpb_ll_trunchackresp{ + status=Status}}) -> + {ReqID, machi_pb_high_client:convert_general_status_code(Status)}; %%qqq from_pb_response(#mpb_ll_response{ req_id=ReqID, @@ -309,17 +333,29 @@ to_pb_request(ReqID, {low_read_chunk, EpochID, File, Offset, Size, _Opts}) -> size=Size}}; to_pb_request(ReqID, {low_checksum_list, EpochID, File}) -> PB_EpochID = conv_from_epoch_id(EpochID), - #mpb_ll_request{ - req_id=ReqID, - checksum_list=#mpb_ll_checksumlistreq{epoch_id=PB_EpochID, - file=File}}; + #mpb_ll_request{req_id=ReqID, + checksum_list=#mpb_ll_checksumlistreq{ + epoch_id=PB_EpochID, + file=File}}; to_pb_request(ReqID, {low_list_files, EpochID}) -> PB_EpochID = conv_from_epoch_id(EpochID), #mpb_ll_request{req_id=ReqID, list_files=#mpb_ll_listfilesreq{epoch_id=PB_EpochID}}; to_pb_request(ReqID, {low_wedge_status, _BogusEpochID}) -> #mpb_ll_request{req_id=ReqID, - wedge_status=#mpb_ll_wedgestatusreq{}}. + wedge_status=#mpb_ll_wedgestatusreq{}}; +to_pb_request(ReqID, {low_delete_migration, EpochID, File}) -> + PB_EpochID = conv_from_epoch_id(EpochID), + #mpb_ll_request{req_id=ReqID, + delete_migration=#mpb_ll_deletemigrationreq{ + epoch_id=PB_EpochID, + file=File}}; +to_pb_request(ReqID, {low_trunc_hack, EpochID, File}) -> + PB_EpochID = conv_from_epoch_id(EpochID), + #mpb_ll_request{req_id=ReqID, + trunc_hack=#mpb_ll_trunchackreq{ + epoch_id=PB_EpochID, + file=File}}. %%qqq to_pb_response(ReqID, {low_echo, _BogusEpochID, _Msg}, Resp) -> @@ -400,6 +436,14 @@ to_pb_response(ReqID, {low_wedge_status, _BogusEpochID}, Resp) -> #mpb_ll_response{req_id=ReqID, wedge_status=#mpb_ll_wedgestatusresp{epoch_id=PB_EpochID, wedged_flag=PB_Wedged}}; +to_pb_response(ReqID, {low_delete_migration, _EID, _Fl}, Resp)-> + Status = conv_from_status(Resp), + #mpb_ll_response{req_id=ReqID, + delete_migration=#mpb_ll_deletemigrationresp{status=Status}}; +to_pb_response(ReqID, {low_trunc_hack, _EID, _Fl}, Resp)-> + Status = conv_from_status(Resp), + #mpb_ll_response{req_id=ReqID, + trunc_hack=#mpb_ll_trunchackresp{status=Status}}; %%qqq to_pb_response(ReqID, {high_echo, _Msg}, Resp) -> Msg = Resp,