diff options
author | Adam Kocoloski <adam@cloudant.com> | 2010-06-30 16:41:47 -0400 |
---|---|---|
committer | Adam Kocoloski <adam@cloudant.com> | 2010-08-12 01:22:58 -0400 |
commit | dcc02f9b3ef2083f89c54ea3e9a8ad7cccf791d3 (patch) | |
tree | 64870aa574c8c0a2e7174123ce2389cb8b051aa3 /src/mem3_sync_event.erl | |
parent | b3172298ca9445c83f045e2c9a9ae1335a2c0841 (diff) |
better naming for event manager and sync event handler
Diffstat (limited to 'src/mem3_sync_event.erl')
-rw-r--r-- | src/mem3_sync_event.erl | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/src/mem3_sync_event.erl b/src/mem3_sync_event.erl new file mode 100644 index 00000000..1a360bde --- /dev/null +++ b/src/mem3_sync_event.erl @@ -0,0 +1,74 @@ +-module(mem3_sync_event). + +-behaviour(gen_event). + +-export([init/1, handle_event/2, handle_call/2, handle_info/2, terminate/2, + code_change/3]). + +-include("mem3.hrl"). + +init([]) -> + {ok, []}. + +handle_event({node_join, Node}, State) -> + start_repl({node_join, Node}, State); + +handle_event({nodeup, Node}, State) -> + start_repl({nodeup, Node}, State); + +handle_event({node_leave, Node}, State) -> + stop_repl({node_leave, Node}, State); + +handle_event({nodedown, Node}, State) -> + stop_repl({nodedown, Node}, State); + +handle_event(Event, State) -> + ?LOG_ERROR("unexpected event in dbs handler ~p", [Event]), + {ok, State}. + +handle_call(Request, State) -> + ?LOG_ERROR("unexpected call in dbs handler ~p", [Request]), + {ok, ok, State}. + +handle_info(Info, State) -> + ?LOG_ERROR("unexpected msg in dbs handler ~p", [Info]), + {ok, State}. + +terminate(_Reason, _State) -> + ok. + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. + +%% +%% internal +%% + +start_repl({Reason, Node}, State) -> + ChildSpec = dbs:childspec(Node), + case supervisor:start_child(dbs, ChildSpec) of + {ok, _} -> + ok; + {error, {already_started, _Child}} -> + ok; + {error, running} -> + ok; + {error, already_present} -> + case supervisor:restart_child(dbs, ChildSpec) of + {ok, _} -> + ok; + {error, running} -> + ok; + {error, Reason} -> + ?LOG_ERROR("dbs repl restart failed ~p", [Reason]) + end; + {error, Reason} -> + ?LOG_ERROR("dbs repl start failed ~p", [Reason]) + end, + {ok, State}. + +stop_repl({Reason, Node}, State) -> + ?LOG_INFO("dbs repl ~p --> ~p terminating (~p)", [node(), Node, Reason]), + supervisor:terminate_child(dbs, Node), + supervisor:delete_child(dbs, Node), + {ok, State}. |