2016-05-20 25 views
1

ich eine ejabbered + Riak Cluster bin Einrichtung, wo ich grundlegende Riak verwenden müssen (get, put, löschen ..) Funktionen in der Datei ejabberd/src/ejabberd_riak.erlejabberd_riak Funktionen löschen

  1. Die Funktionen setzen, erhalten sie, get_by_index etc. funktioniert super und mit der Verwendung des Moduls in der Datei konnte ich herausfinden, was was ist.

  2. Ich habe ein Problem mit der Funktion delete_by_index und auch get_keys_by_index, die sowieso von delete_by_index aufgerufen wird.

Der Fehler wird ausgelöst, wenn ich dies tun ->

ejabberd_riak:get_keys_by_index(game <<"language">>,  
term_to_binary("English")). 
{error,<<"Phase 0: invalid module named in PhaseSpec function:\n must be a valid module name (failed to load ejabberd_r"...>>} 
([email protected])57> 12:28:55.177 [error] database error: 
** Function: get_keys_by_index 
** Table: game 
** Index = <<"language">> 
** Key: <<131,107,0,7,69,110,103,108,105,115,104>> 
** Error: Phase 0: invalid module named in PhaseSpec function: 
must be a valid module name (failed to load ejabberd_riak: nofile) 

Antwort

1

Sie wahrscheinlich ejabberd_riak auf der Riak Seite

Sie derzeit mit der Datenbank Riak als separate erlang-Anwendung verwenden, die Kommunikation laden soll von protobuf. In dieser Konfiguration haben Sie unabhängige (voneinander unabhängige) Modulsätze, die in ejabbered und riak Anwendungen geladen sind. ejabberd_riak Modul in Ejabberd-Anwendung geladen, aber nicht in Riak-Anwendung.

jedoch get_by_index verwendet mapred die ejabberd_riak geladen auf der Riak Seite

-spec get_keys_by_index(atom(), binary(), 
         any()) -> {ok, [any()]} | {error, any()}. 
%% @doc Returns a list of primary keys of objects indexed by `Key'. 
get_keys_by_index(Table, Index, Key) -> 
    {NewIndex, NewKey} = encode_index_key(Index, Key), 
    Bucket = make_bucket(Table), 
    case catch riakc_pb_socket:mapred(
     get_random_pid(), 
     {index, Bucket, NewIndex, NewKey}, 
     [{map, {modfun, ?MODULE, map_key}, none, true}]) of 
     %%    ^^^^^^ 
     %%  here is the problem 
     {ok, [{_, Keys}]} -> 
      {ok, Keys}; 
    {ok, []} -> 
     {ok, []}; 
     {error, _} = Error -> 
      log_error(Error, get_keys_by_index, [{table, Table}, 
               {index, Index}, 
               {key, Key}]), 
      Error 
    end. 

Sie Ihre Riak anpassen können und fügen Sie ejabberd_riak zum Riak Anwendung verlangt (Sie brauchen nicht die ganze ejabberd-Anwendung auf dem Riak zu starten Seite, jedoch)

Mit monckeypatching Ansatz sollten Sie ejabberd_riak.erl, ejabberd.hrl, logger.hrl auf die riak/deps/riak_kv/src kopieren. Dann baue Riak neu auf. Sie sollten Ihre Dateien über den gesamten Cluster verteilen, da auf jedem Cluster-Knoten die Phase map ausgeführt wird.

+0

@ Lol4to Das ist interessant und danke für die Antwort .. können Sie mir zeigen, wie ich 'ejabberd_riak' zur Riak-Anwendung hinzufügen kann? Irgendwelche Dokumentation/Link oder irgendeinen Ordner, dem ich ejabberd src Dateien hinzufügen sollte? Derzeit habe ich drei Maschinen, die als Cluster für Riak dienen, müsste ich den gleichen Prozess für alle Maschinen oder nur den Master-Knoten wiederholen? – minocha

+0

@minocha Ich habe Informationen zur Antwort hinzugefügt – Lol4t0

+0

können Sie die riak_rv zu 'riak_kv' ändern. Das hat wie ein Zauber funktioniert und jetzt bekomme ich den entscheidenden Punkt für den Build. Vielen Dank! Ohne diese Information hätte ich ein paar zusätzliche Tage gebraucht, da ich nicht an der richtigen Stelle gesucht habe, besonders seit ich Deb-Builds installiert habe und nicht aus der Quelle. – minocha