2016-05-20 6 views
1

Je suis en train de créer un cluster ejabbered + Riak, où je dois utiliser Riak de base (get, put, supprimer ..) fonctions dans le fichier ejabberd/src/ejabberd_riak.erlejabberd_riak supprimer des fonctions

  1. Les fonctions mises, obtenir, get_by_index etc fonctionne très bien et en utilisant l'utilisation du module dans le fichier, je pourrais comprendre ce qui est quoi.

  2. Je suis confronté à un problème avec la fonction delete_by_index et aussi get_keys_by_index, qui est appelé par delete_by_index, de toute façon.

L'erreur lancée quand je le fais ->

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) 

Répondre

1

Vous devriez probablement charger ejabberd_riak sur le côté Riak

Vous utilisez actuellement Riak comme application Erlang séparée, la communication avec la base de données par protobuf. Dans cette configuration, vous avez des ensembles de modules indépendants (les uns des autres) chargés dans les applications ejabbered et riak. ejabberd_riak module chargé dans l'application ejabberd, mais pas dans l'application riak.

Cependant get_by_index utilise mapred qui exige ejabberd_riak chargé sur le côté Riak

-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. 

Vous pouvez personnaliser votre Riak et ajouter ejabberd_riak à l'application Riak (vous n'êtes pas obligé de commencer toute application ejabberd sur le Riak côté, cependant)

Avec l'approche monckeypatching, vous devez copier ejabberd_riak.erl, ejabberd.hrl, logger.hrl au riak/deps/riak_kv/src. Puis reconstruire riak. Vous devez répartir vos fichiers sur l'ensemble du cluster, car la phase map est exécutée sur chaque nœud de cluster.

+0

@ Lol4to Ceci est intéressant et merci pour la réponse .. pouvez-vous me montrer comment je peux ajouter 'ejabberd_riak' à l'application riak? Toute documentation/lien ou tout dossier que je devrais ajouter des fichiers src ejabberd? Actuellement, j'ai trois machines servant de cluster pour riak, est-ce que je devrais répéter le même processus pour toutes les machines ou seulement le maître Node? – minocha

+0

@minocha J'ai ajouté des informations à la réponse – Lol4t0

+0

pouvez-vous changer le riak_rv à 'riak_kv'. Cela a fonctionné comme un charme et maintenant je reçois le point entier pour la construction. Merci beaucoup! Si ce n'était de cette information, cela m'aurait pris quelques jours de plus puisque je ne cherchais pas au bon endroit, d'autant plus que j'installais des build deb et non de la source. – minocha