Hi,

It seems to work with these changes: 
http://bitbucket.org/tamasnagy/riak/changeset/3908ab72b12b

I've sent a pull request as well.

Regards,
        Tamas

Tamas Nagy
Erlang Solutions
http://www.erlang-solutions.com

On 23 Jun 2010, at 20:20, Jon Meredith wrote:

> Thanks for the detailed explanation Tamas, I should have reviewed the 
> changeset as well as the commit log.
> 
> I'll try and take a look at it this afternoon.
> 
> --Jon
> 
> 
> On 6/23/10 1:09 PM, Tamas Nagy wrote:
>> Hi,
>> 
>> I feel that is not going to fix the issue. I can prove it without compiling. 
>> (I know He who enters... :) )
>> riak_kv_multi_backend is not a process only riak_kv_vnode is. Hence these 
>> messages ({riak_kv_bitcask_backend, merge_check} and 
>> {riak_kv_bitcask_backend, {sync, SyncIntervalMs}}):
>> 
>> riak_kv_bitcask_backend:
>> start(Partition, _Config) ->
>>     %% Schedule sync (if necessary)
>>     case application:get_env(bitcask, sync_strategy) of
>>         {ok, {seconds, Seconds}} ->
>>             SyncIntervalMs = timer:seconds(Seconds),
>>             erlang:send_after(SyncIntervalMs, self(),
>>                               {?MODULE, {sync, SyncIntervalMs}});
>>         _ ->               ok    end,
>>     %% Schedule merge checks
>>     erlang:send_after(?MERGE_CHECK_INTERVAL, self(), {?MODULE, merge_check}),
>> 
>> will be sent to riak_kv_node handle_info (this did not change in the 
>> changeset you've linked in):
>> 
>> %% @private
>> handle_info(vnode_shutdown, _StateName, StateData) ->
>>     {stop,normal,StateData};
>> handle_info(ok, StateName, StateData) ->
>>     {next_state, StateName, StateData, ?TIMEOUT};
>> handle_info({Mod, Msg}, StateName, #state { mod = Mod } = StateData) ->
>>     Mod:handle_info(StateData#state.modstate, Msg),
>>     {next_state, StateName, StateData, ?TIMEOUT}.
>> 
>> So the Mod in handle_info will be riak_kv_bitcask_backend but Mod is going 
>> to be riak_kv_multi_backend, because of this:
>> 
>> init([VNodeIndex]) ->
>>     Mod = app_helper:get_env(riak_kv, storage_backend),
>>     Configuration = app_helper:get_env(riak_kv),
>>     {ok, ModState} = Mod:start(VNodeIndex, Configuration),
>>     StateData0 = #state{idx=VNodeIndex,mod=Mod,modstate=ModState,
>>                         handoff_q=not_in_handoff},
>>     case hometest(StateData0) of
>>         {next_state, StateName, StateData, Timeout} ->
>>             {ok, StateName, StateData, Timeout};
>>         {stop,normal,StateData} ->
>>             {ok, ModState1} = Mod:start(VNodeIndex, Configuration),
>>             {ok, active, StateData#state{mod=Mod, modstate=ModState1}, 
>> ?TIMEOUT}
>>     end.
>> 
>> I hope this makes sense. So the linked changeset is a step toward the right 
>> direction, but there is still some work left.
>> All three of my possible solutions are based on tip. If I will have time 
>> today I will fork the code and show you what I mean.
>> 
>> Regards,
>>     Tamas
>> 
>> 
>> 
>> ----- "Jon Meredith"<[email protected]>  wrote:
>> 
>>   
>>> Hi Tamas,
>>> 
>>> Are you using the 0.11.0 release?  We found an issue with the multi
>>> backend a few days ago detailed here
>>> http://issues.basho.com/show_bug.cgi?id=274 .  It should be fixed in
>>> tip
>>> after this change
>>> http://bitbucket.org/basho/riak/changeset/bf66258beaac
>>> 
>>> You'll have to build from source source and check if that resolves
>>> your
>>> issue?
>>> 
>>> --Jon Meredith
>>> Basho Technologies
>>> 
>>> On 6/23/10 12:36 PM, Tamas Nagy wrote:
>>>     
>>>> Hi,
>>>> 
>>>> Thanks for the link. Should I create a ticket there from this
>>>>       
>>> thread?
>>>     
>>>> Well the error I saw was this (actually a lot of these because of
>>>>       
>>> the restarts):
>>>     
>>>> =ERROR REPORT==== 23-Jun-2010::12:40:34 ===
>>>> ** State machine<0.201.0>   terminating
>>>> ** Last message in was {riak_kv_bitcask_backend,merge_check}
>>>> ** When State == active
>>>> **      Data  == {state,0,[],riak_kv_multi_backend,
>>>>                       {state,
>>>> 
>>>>       
>>> [{riak_ets,riak_kv_ets_backend,<0.203.0>},
>>>     
>>>>                            {riak_bitcask,riak_kv_bitcask_backend,
>>>> 
>>>>       
>>> {#Ref<0.0.0.762>,"data/bitcask/0"}}],
>>>     
>>>>                           riak_ets},
>>>>                       not_in_handoff,undefined}
>>>> ** Reason for termination =
>>>> ** {function_clause,
>>>>         [{riak_kv_vnode,handle_info,
>>>>              [{riak_kv_bitcask_backend,merge_check},
>>>>               active,
>>>>               {state,0,[],riak_kv_multi_backend,
>>>>                   {state,
>>>>                       [{riak_ets,riak_kv_ets_backend,<0.203.0>},
>>>>                        {riak_bitcask,riak_kv_bitcask_backend,
>>>>                            {#Ref<0.0.0.762>,"data/bitcask/0"}}],
>>>>                       riak_ets},
>>>>                   not_in_handoff,undefined}]},
>>>>          {gen_fsm,handle_msg,7},
>>>>          {proc_lib,init_p_do_apply,3}]}
>>>> 
>>>> So as you can see riak_kv_vnode cannot handle
>>>>       
>>> riak_kv_bitcask_backend messages ({riak_kv_bitcask, Whatever}) if the
>>> backend type is riak_kv_multi_backend. There is simply no case for it
>>> in the handle_info callback of riak_kv_vnode module. In the current
>>> handle_info cases the Mod tag of the message has to be the same as the
>>> value of the state's mod element. One of the possible fixes relaxes
>>> this check.
>>>     
>>>> Regards,
>>>>      Tamas
>>>> 
>>>> ----- "Dan Reverri"<[email protected]>   wrote:
>>>> 
>>>> 
>>>>       
>>>>> Hi Tamas,
>>>>> 
>>>>> 
>>>>> You can find the public bug tracker here:
>>>>> https://issues.basho.com/
>>>>> 
>>>>> 
>>>>> Regarding using Bitcask with multiple backends, the only issue
>>>>>         
>>> I've
>>>     
>>>>> seen is trying to setup multiple bitcask backends. Bitcask defines
>>>>> options using the "bitcask" application specification which is
>>>>> globally set for the node; this prevents multiple instances of the
>>>>> bitcask backend from running on a single node:
>>>>> https://issues.basho.com/show_bug.cgi?id=210
>>>>> 
>>>>> 
>>>>> You should be able to run a bitcask backend along side other
>>>>>         
>>> backend
>>>     
>>>>> types such as dets.
>>>>> 
>>>>> 
>>>>> I did not completely follow your description; what issues did you
>>>>>         
>>> see
>>>     
>>>>> after setting bitcask as a backend in the multibackend options?
>>>>>         
>>> Were
>>>     
>>>>> keys not stored? Did you see errors in the log files? Did you try
>>>>>         
>>> to
>>>     
>>>>> setup multiple bitcask backends?
>>>>> 
>>>>> 
>>>>> Thanks,
>>>>> Dan
>>>>> 
>>>>> Daniel Reverri
>>>>> Developer Advocate
>>>>> Basho Technologies, Inc.
>>>>> [email protected]
>>>>> 
>>>>> 
>>>>> 
>>>>> On Wed, Jun 23, 2010 at 1:45 PM, Tamas Nagy<
>>>>> [email protected]>   wrote:
>>>>> 
>>>>> 
>>>>> Hi,
>>>>> 
>>>>> I'm pretty new to the list (and riak) so please forgive my
>>>>>         
>>> ignorance
>>>     
>>>>> but I didn't manage to find a public bugtracker for riak. Hence
>>>>>         
>>> I'm
>>>     
>>>>> posting my problem here. (Bitbucket and Internet Explorer(using it
>>>>>         
>>> not
>>>     
>>>>> by choice) do not mix well. So that might be the problem why I
>>>>>         
>>> didn't
>>>     
>>>>> find it).
>>>>> 
>>>>> I've tried to use riak_kv_multi_backend with one of the backends
>>>>>         
>>> being
>>>     
>>>>> the riak_kv_bitcask_backend. This does not seem to work with
>>>>> riak-0.11.0. I checked tip as well, and I do not think it would
>>>>>         
>>> work
>>>     
>>>>> either. The problem boils to these few lines (code snippets from
>>>>>         
>>> tip):
>>>     
>>>>> riak_kv_vnode:
>>>>> 
>>>>> handle_info({Mod, Msg}, StateName, #state { mod = Mod } =
>>>>>         
>>> StateData)
>>>     
>>>>> ->
>>>>>     Mod:handle_info(StateData#state.modstate, Msg),
>>>>>     {next_state, StateName, StateData, ?TIMEOUT}.
>>>>> 
>>>>> riak_kv_bitcask_backend:
>>>>> 
>>>>> start(Partition, _Config) ->
>>>>>     %% Schedule sync (if necessary)
>>>>>     case application:get_env(bitcask, sync_strategy) of
>>>>>         {ok, {seconds, Seconds}} ->
>>>>>             SyncIntervalMs = timer:seconds(Seconds),
>>>>>             erlang:send_after(SyncIntervalMs, self(),
>>>>>                               {?MODULE, {sync, SyncIntervalMs}});
>>>>>         _ ->               ok    end,
>>>>>     %% Schedule merge checks
>>>>>     erlang:send_after(?MERGE_CHECK_INTERVAL, self(), {?MODULE,
>>>>> merge_check}),
>>>>> 
>>>>> 
>>>>> riak_kv_multi_backend:
>>>>> 
>>>>> handle_info(State, Msg) ->
>>>>>     F = fun(_Name, Module, SubState) ->
>>>>>                 Module:handle_info(SubState, Msg)
>>>>>         end,    [F(X) || X<- State#state.backends],
>>>>>     ok.
>>>>> 
>>>>> If riak_kv_multi_backend is configured in riak_kv_vnode the
>>>>>         
>>> state's
>>>     
>>>>> mod is riak_kv_multi_backend but the messages scheduled in
>>>>> riak_kv_bitcask_backend are going to have riak_kv_bitcask_backend
>>>>>         
>>> as
>>>     
>>>>> their Mod tag.
>>>>> 
>>>>> With my limited understanding about the rest of the sytem it seems
>>>>>         
>>> to
>>>     
>>>>> me that adding this case to riak_kv_vnode would fix the problem:
>>>>> handle_info({Mod, Msg}, StateName, #state { mod =
>>>>> riak_kv_multi_backend } = StateData) ->
>>>>>     riak_kv_multi_backend:handle_info(StateData#state.modstate,
>>>>>         
>>> Msg),
>>>     
>>>>>     {next_state, StateName, StateData, ?TIMEOUT};
>>>>> 
>>>>> It is a bit wasteful because all the configured backends will get
>>>>> called with this message, but it is the best I can think of
>>>>>         
>>> without
>>>     
>>>>> leaking too much information about the specific backends into the
>>>>> generic code.
>>>>> 
>>>>> Modifying the handle_info case would work as well however one
>>>>>         
>>> check
>>>     
>>>>> would need to disappear:
>>>>> 
>>>>> handle_info({_ModTag, Msg}, StateName, #state { mod = Mod } =
>>>>> StateData) ->
>>>>>     Mod:handle_info(StateData#state.modstate, Msg),
>>>>>     {next_state, StateName, StateData, ?TIMEOUT}.
>>>>> 
>>>>> There are a plethora of other ways to fix this like passing the
>>>>>         
>>> Mod
>>>     
>>>>> tag to riak_kv_multi_backend so that it can filter based on it
>>>>>         
>>> (this
>>>     
>>>>> is probably my favourite as it is not wasteful and there aren't
>>>>>         
>>> many
>>>     
>>>>> code changes needed either):
>>>>> riak_kv_vnode:
>>>>> handle_info({Mod, Msg}, StateName, #state { mod =
>>>>> riak_kv_multi_backend } = StateData) ->
>>>>>     riak_kv_multi_backend:handle_info(StateData#state.modstate,
>>>>>         
>>> {Mod,
>>>     
>>>>> Msg}),
>>>>>     {next_state, StateName, StateData, ?TIMEOUT};
>>>>> 
>>>>> riak_kv_multi_backend:
>>>>> handle_info(State, {Mod, Msg}) ->
>>>>>     F = fun(_Name, Module, SubState) ->
>>>>>                 Module:handle_info(SubState, Msg)
>>>>>         end,    [F(X) || X = {_, Module, _}<-
>>>>>         
>>> State#state.backends,
>>>     
>>>>> Module =:= Mod],
>>>>>     ok.
>>>>> 
>>>>> Code is not tested, but should compile. :)
>>>>> 
>>>>> Regards,
>>>>>     Tamas
>>>>> 
>>>>> --
>>>>> Tamas Nagy
>>>>> Erlang Solutions Ltd.
>>>>> http://www.erlang-solutions.com
>>>>> ---------------------------------------------------
>>>>> 
>>>>> ---------------------------------------------------
>>>>> 
>>>>> WE'VE CHANGED NAMES!
>>>>> 
>>>>> Since January 1st 2010 Erlang Training and Consulting Ltd. has
>>>>>         
>>> become
>>>     
>>>>> ERLANG SOLUTIONS LTD.
>>>>> 
>>>>> www.erlang-solutions.com
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> riak-users mailing list
>>>>> [email protected]
>>>>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
>>>>> 
>>>>>         
>>>> 
>>>>       
>>> 
>>> _______________________________________________
>>> riak-users mailing list
>>> [email protected]
>>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com
>>>     
>>   
> 

---------------------------------------------------

---------------------------------------------------

WE'VE CHANGED NAMES!

Since January 1st 2010 Erlang Training and Consulting Ltd. has become ERLANG 
SOLUTIONS LTD.

www.erlang-solutions.com


_______________________________________________
riak-users mailing list
[email protected]
http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com

Reply via email to