diff options
author | Andrzej Telezynski <[email protected]> | 2011-07-21 13:08:28 +0200 |
---|---|---|
committer | Henrik Nord <[email protected]> | 2011-08-30 15:22:19 +0200 |
commit | 2d319d3fcdc9bf7b8ac7d389ce5ee0a38645882f (patch) | |
tree | 779cfe9868ad88c8d93110370d816bb31ca949a2 /lib/observer | |
parent | 4e3b8ccfa74785ca78f70e4d745c123037aada7f (diff) | |
download | otp-2d319d3fcdc9bf7b8ac7d389ce5ee0a38645882f.tar.gz otp-2d319d3fcdc9bf7b8ac7d389ce5ee0a38645882f.tar.bz2 otp-2d319d3fcdc9bf7b8ac7d389ce5ee0a38645882f.zip |
It is safe to change cwd on control node or remote nodes while tracing
Diffstat (limited to 'lib/observer')
-rw-r--r-- | lib/observer/src/ttb.erl | 37 | ||||
-rw-r--r-- | lib/observer/test/ttb_SUITE.erl | 64 |
2 files changed, 79 insertions, 22 deletions
diff --git a/lib/observer/src/ttb.erl b/lib/observer/src/ttb.erl index be996512af..342826a482 100644 --- a/lib/observer/src/ttb.erl +++ b/lib/observer/src/ttb.erl @@ -668,18 +668,18 @@ loop(NodeInfo, SessionInfo) -> receive {init_node,Node,MetaFile,PI,Traci} -> erlang:monitor_node(Node,true), - MetaPid = + {AbsoluteMetaFile, MetaPid} = case rpc:call(Node, observer_backend, ttb_init_node, [MetaFile,PI,Traci]) of - {ok,MP} -> - MP; + {ok,MF,MP} -> + {MF,MP}; {badrpc,nodedown} -> %% We will get a nodedown message - undefined + {MetaFile,undefined} end, - loop(dict:store(Node,{MetaFile,MetaPid},NodeInfo), SessionInfo); + loop(dict:store(Node,{AbsoluteMetaFile,MetaPid},NodeInfo), SessionInfo); {get_nodes,Sender} -> Sender ! {?MODULE,dict:fetch_keys(NodeInfo)}, loop(NodeInfo, SessionInfo); @@ -839,23 +839,14 @@ fetch_report(Localhost, Dir, Node, MetaFile) -> fetch(Localhost,Dir,Node,MetaFile) -> case (host(Node) == Localhost) orelse is_local(MetaFile) of - true -> % same host, just move the files + true -> % same host, just move the files Files = get_filenames(Node,MetaFile), lists:foreach( - fun(File0) -> - case MetaFile of - {local, _, _} -> - File = filename:join(Dir,filename:basename(File0)), - file:rename(File0, File); - _ -> - %%Other nodes may still have different CWD - {ok, Cwd} = rpc:call(Node, file, get_cwd, []), - File1 = filename:join(Cwd, File0), - File = filename:join(Dir,filename:basename(File1)), - file:rename(File1,File) - end - end, - Files); + fun(File0) -> + Dest = filename:join(Dir,filename:basename(File0)), + file:rename(File0, Dest) + end, + Files); false -> {ok, LSock} = gen_tcp:listen(0, [binary,{packet,2},{active,false}]), {ok,Port} = inet:port(LSock), @@ -917,13 +908,15 @@ wait_for_fetch(Nodes) -> %%% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - write_info(Nodes,PI,Traci) -> + {ok, Cwd} = file:get_cwd(), lists:foreach(fun({N,{local,C,_},F}) -> MetaFile = case F of none -> none; F -> - file:delete(F ++ ".ti"), - F ++ ".ti" + AbsFile = filename:join(Cwd, F) ++ ".ti", + file:delete(AbsFile), + AbsFile end, Traci1 = [{node,N},{file,C}|Traci], {ok,Port} = dbg:get_tracer(N), diff --git a/lib/observer/test/ttb_SUITE.erl b/lib/observer/test/ttb_SUITE.erl index 0c154a796c..93319d16c8 100644 --- a/lib/observer/test/ttb_SUITE.erl +++ b/lib/observer/test/ttb_SUITE.erl @@ -65,6 +65,8 @@ all() -> trace_to_remote_files_on_localhost_with_different_pwd, trace_to_local_files_on_localhost_with_different_pwd, trace_to_remote_files_on_localhost_with_different_pwd_abs, + changing_cwd_on_control_node, changing_cwd_on_remote_node, + changing_cwd_on_control_node_with_local_trace, one_command_trace_setup, dbg_style_fetch, shell_tracing_init, only_one_state_for_format_handler, only_one_state_with_default_format_handler, only_one_state_with_initial_format_handler, run_trace_with_shortcut1, @@ -1002,6 +1004,8 @@ format_on_trace_stop(Config) when is_list(Config) -> ?line true = filelib:is_file("HANDLER_OK"), ?line ok = file:delete("HANDLER_OK"). +%% The following three tests are for the issue "fixes fetch fail when nodes on the same host +%% have different cwd" trace_to_remote_files_on_localhost_with_different_pwd(suite) -> []; trace_to_remote_files_on_localhost_with_different_pwd(doc) -> @@ -1043,6 +1047,66 @@ trace_to_remote_files_on_localhost_with_different_pwd_abs(Config) when is_list(C ?line ?t:stop_node(ClientNode), ?line ok = file:set_cwd(OldDir). +%% Trace is not affected by changes of cwd on control node or remote nodes during tracing +%% (three tests) +changing_cwd_on_control_node(suite) -> + []; +changing_cwd_on_control_node(doc) -> + ["Changing cwd on control node during tracing is safe"]; +changing_cwd_on_control_node(Config) when is_list(Config) -> + ?line {ok, OldDir} = file:get_cwd(), + ?line {ServerNode, ClientNode} = start_client_and_server(), + ?line begin_trace(ServerNode, ClientNode, ?FNAME), + ?line NumMsgs = 3, + ?line ttb_helper:msgs(NumMsgs), + ?line ok = file:set_cwd(".."), + ?line ttb_helper:msgs(NumMsgs), + ?line {_, D} = ttb:stop([fetch, return]), + ?line ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]), + ?line {ok, Ret} = file:consult(?OUTPUT), + ?line true = (2*(NumMsgs + 1) == length(Ret)), + ?line ?t:stop_node(ServerNode), + ?line ?t:stop_node(ClientNode), + ?line ok = file:set_cwd(OldDir). + +changing_cwd_on_control_node_with_local_trace(suite) -> + []; +changing_cwd_on_control_node_with_local_trace(doc) -> + ["Changing cwd on control node during local tracing is safe"]; +changing_cwd_on_control_node_with_local_trace(Config) when is_list(Config) -> + ?line {ok, OldDir} = file:get_cwd(), + ?line {ServerNode, ClientNode} = start_client_and_server(), + ?line begin_trace(ServerNode, ClientNode, {local, ?FNAME}), + ?line NumMsgs = 3, + ?line ttb_helper:msgs(NumMsgs), + ?line ok = file:set_cwd(".."), + ?line ttb_helper:msgs(NumMsgs), + ?line {_, D} = ttb:stop([fetch, return]), + ?line ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]), + ?line {ok, Ret} = file:consult(?OUTPUT), + ?line true = (2*(NumMsgs + 1) == length(Ret)), + ?line ?t:stop_node(ServerNode), + ?line ?t:stop_node(ClientNode), + ?line ok = file:set_cwd(OldDir). + +changing_cwd_on_remote_node(suite) -> + []; +changing_cwd_on_remote_node(doc) -> + ["Changing cwd on remote node during tracing is safe"]; +changing_cwd_on_remote_node(Config) when is_list(Config) -> + ?line {ServerNode, ClientNode} = start_client_and_server(), + ?line begin_trace(ServerNode, ClientNode, ?FNAME), + ?line NumMsgs = 2, + ?line ttb_helper:msgs(NumMsgs), + ?line ok = rpc:call(ClientNode, file, set_cwd, [".."]), + ?line ttb_helper:msgs(NumMsgs), + ?line {_, D} = ttb:stop([fetch, return]), + ?line ttb:format(D, [{out, ?OUTPUT}, {handler, simple_call_handler()}]), + ?line {ok, Ret} = file:consult(?OUTPUT), + ?line true = (2*(NumMsgs + 1) == length(Ret)), + ?line ?t:stop_node(ServerNode), + ?line ?t:stop_node(ClientNode). + one_command_trace_setup(suite) -> []; one_command_trace_setup(doc) -> |