From da66eb5714700940039fc79088a3f384e6e13251 Mon Sep 17 00:00:00 2001 From: Evgeniy Khramtsov Date: Sat, 15 Apr 2017 13:07:56 +0300 Subject: [PATCH] Add Riak as router RAM backend --- src/ejabberd_router_riak.erl | 83 ++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 src/ejabberd_router_riak.erl diff --git a/src/ejabberd_router_riak.erl b/src/ejabberd_router_riak.erl new file mode 100644 index 000000000..4b270a41d --- /dev/null +++ b/src/ejabberd_router_riak.erl @@ -0,0 +1,83 @@ +%%%------------------------------------------------------------------- +%%% @author Evgeny Khramtsov +%%% Created : 15 Apr 2017 by Evgeny Khramtsov +%%% +%%% +%%% ejabberd, Copyright (C) 2002-2017 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License along +%%% with this program; if not, write to the Free Software Foundation, Inc., +%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +%%% +%%%------------------------------------------------------------------- +-module(ejabberd_router_riak). +-behaviour(ejabberd_router). + +%% API +-export([init/0, register_route/5, unregister_route/3, find_routes/1, + get_all_routes/0]). + +-include("logger.hrl"). +-include("ejabberd_router.hrl"). + +%%%=================================================================== +%%% API +%%%=================================================================== +init() -> + clean_table(). + +register_route(Domain, ServerHost, LocalHint, _, Pid) -> + ejabberd_riak:put(#route{domain = Domain, + server_host = ServerHost, + local_hint = LocalHint, + pid = Pid}, + route_schema(), + [{i, {Domain, Pid}}, {'2i', [{<<"route">>, Domain}]}]). + +unregister_route(Domain, _, Pid) -> + ejabberd_riak:delete(route, {Domain, Pid}). + +find_routes(Domain) -> + ejabberd_riak:get_by_index(route, route_schema(), <<"route">>, Domain). + +get_all_routes() -> + case ejabberd_riak:get(route, route_schema()) of + {ok, Routes} -> + {ok, lists:flatmap( + fun(#route{domain = D, server_host = S}) when D /= S -> + [D]; + (_) -> + [] + end, Routes)}; + Err -> + Err + end. + +%%%=================================================================== +%%% Internal functions +%%%=================================================================== +route_schema() -> + {record_info(fields, route), #route{}}. + +clean_table() -> + ?INFO_MSG("Cleaning Riak 'route' table...", []), + case ejabberd_riak:get(route, route_schema()) of + {ok, Routes} -> + lists:foreach( + fun(#route{pid = Pid}) -> + ejabberd_riak:delete(route, Pid) + end, Routes); + {error, Err} -> + ?ERROR_MSG("failed to clean Riak 'route' table: ~p", [Err]), + Err + end.