2012-05-07 6 views
1

私はモジュールがたくさんあり、それぞれには実行スレッドが異なります。 「古い」を実行中のスレッドが存在しない場合にのみコードをパージsoft_purge()関数を使用していますブロッキングエラースレッドの発見

reload_all() ->     
    ?MODULE:reload_all(?MODULE_LIST). 
reload_all([]) -> ok;   
reload_all([T|C]) -> 
    io:fwrite("Purging ~w\n",[T]), 
    try_purge(T),    
    {module,T} = code:load_file(T), 
    ?MODULE:reload_all(C).  

try_purge(T) -> try_purge(T,1). 
try_purge(T,Wait) ->   
    case code:soft_purge(T) of 
    true -> ok; 
    false -> 
     io:fwrite("* Waiting ~w seconds for ~w module\n",[Wait,T]), 
     timer:sleep(Wait*1000), 
     try_purge(T,Wait+1)  
    end. 

:私は、一つ一つを通過し、安全に(ホットスワップ用)のコードをリロードする小さなスクリプトを書きました通常のパージコマンドによって強制終了されるコード。それは、間隔を広げて待って、試し続けます。私は待ち時間が1分以上にならないようにプロジェクトを設計しましたが、現実的にはそれは常に瞬時になるはずです。

私が遭遇している問題は、あるモジュールがある理由か他の理由で無期限にブロックされるバグがあり、reload_all()スクリプトが完了しないことがあることです。これは望ましい動作です。何かが間違っていることがわかります。問題は、バグを追跡するには、バグがテスト環境だけではなく実稼働環境でしか表示されないため、コードのテストと分析が必要な場合があります。

私の質問は:どのスレッドがモジュール内の「古い」コードを実行しているかを特定し、現在機能しているモジュールを確認する方法はありますか?

+0

どのようにモジュールを使用しているプロセスを強制終了しますか?この関数は、それらが死ぬまで待つだけですか? – rvirding

+0

私はそうではありません、soft_purgeのポイントは、スレッドが死ぬことはないということです。まだ古いコードを使用しているスレッドがある場合、パージは行われません。 –

答えて

1

erlang:check_old_code/1とerlang:check_process_code/2を使用して、旧バージョンまたは新バージョンのモジュールを使用しているかどうかを確認できます。ちょうどErlang manualを参照してください。

+0

check_process_codeが動作しますが、モジュールの古いコードを実行しているすべてのスレッドを取得するために、list:filter(fun(Pid) - > erlang:check_process_code(Pid、?MODULE)end、erlang:processes())を実行できます。ありがとう! –