2012-01-29 4 views
1

(편집 : 나는 ... 그래서 bitcask 태그를 생성하는 몇 가지 명성을 그리워)스탠드로 bitcask 사용하는 방법을 혼자

(TL을, 박사를 => bitcask :/2 작동하지 않습니다 얻을 bitcask_nifs : keydir_get_int에서 badarg를 발생 시킴)

올바른 방법으로 riak하지 않고 bitcask를 사용하는 방법을 알고 싶습니다.

첫째,이 시도되었다

bitcask:put(Handle, 3, {this, is, data}). 
bitcask:get(Handle, 3). 

이 두 호출이 같은 오류가 발생 : 얼랑와 badarg : 크기/1 만 바이너리 또는 튜플을 받아 들인다 : 크기/1

문제는 얼랑가 . 얼랑로, 다음

bitcask:put(Handle, {thing, 3}, {this, is, data}). 
bitcask:get(Handle, {thing, 3}). 

새로운 badarg 오류 : CRC32를하고 값은 내가 저장할 그래서 나는이 시도되었다.

이제이 코드를 사용합니다. 버킷은 핸들을 상태로 유지하는 등록 된 gen_server 의 원자 이름입니다. cask_wrapper는 gen_servers 코드입니다. 아래 코드는 theese gen 서버에 대한 액세스입니다.

-module(sr_db). 
... 
get(Type, Key) when not is_binary(Key) -> 
    ?MODULE:get(Type, term_to_binary(Key)); 
get(Type, Key) -> 
    Bucket = type2bucket(Type), 
    cask_wrapper:get(Bucket, {get, Key}). 

put(Type, Key, Data) when not is_binary(Key) -> 
    ?MODULE:put(Type, term_to_binary(Key), Data); 

put(Type, Key, Data) when not is_binary(Data) -> 
    ?MODULE:put(Type, Key, term_to_binary(Data)); 

put(Type, Key, Data) -> 
    Bucket = type2bucket(Type), 
    cask_wrapper:put(Bucket, Key, Data), 
    ok. 
%% syncput(Type, Key, Data) -> call au lieu de cast 

type2bucket(user) -> users_cask. 

나는 다음과 같은 코드를 사용

sr_db:get(user, 3). 
%% then a call is made to cask_wrapper:get(users_cask, {get, 3}). 

get(Bucket, Key) -> 
    gen_server:call(Bucket, {get, Key}). 

handle_call({get, Key}, _From, State) -> 
    Fetch = bitcask:get(State#state.handle, Key), 
    {reply, Fetch, State}. 

내가 넣어 기능과 같은 메커니즘을 사용하는 cask_wrapper 기능이 있습니다. (하지만 gen_server : cast 사용)

첫 번째 질문은 모든 호출에서 term_to_binary 변환을 수행하고 있습니까? 좋은 습관입니까, 아니면 느린가? 내가 가져온 값을 erlang 이라는 용어로 다시 변환해야합니다.

현재 put 작업은 'ok'를 반환합니다. 그것은 작동합니다. 그러나 작업을 수행 할 수 없습니다. 이것은 오류입니다 :

=ERROR REPORT==== 29-Jan-2012::20:21:24 === 
** Generic server users_cask terminating 
** Last message in was {get,{get,<<131,97,3>>}} 
** When Server state == {state,#Ref<0.0.0.353>} 
** Reason for termination == 
** {badarg,[{bitcask_nifs,keydir_get_int,[<<>>,{get,<<131,97,3>>}]}, 
      {bitcask_nifs,keydir_get,2}, 
      {bitcask,get,3}, 
      {cask_wrapper,handle_call,3}, 
      {gen_server,handle_msg,5}, 
      {proc_lib,init_p_do_apply,3}]} 
Bitcask dir : "/home/niahoo/src/skyraiders/priv/bitcasks/users" 
options : [read_write]** exception exit: {{badarg, 
         [{bitcask_nifs,keydir_get_int, 
          [<<>>,{get,<<131,97,3>>}]}, 
         {bitcask_nifs,keydir_get,2}, 
         {bitcask,get,3}, 
         {cask_wrapper,handle_call,3}, 
         {gen_server,handle_msg,5}, 
         {proc_lib,init_p_do_apply,3}]}, 
        {gen_server,call,[users_cask,{get,{get,<<131,97,3>>}}]}} 
    in function gen_server:call/2 

나는 그것이 작동하지 않는 이유를 알 수 없으며 도움을 주실 것입니다. (이미 눈치)

+0

감사를 태그 :이 aaaaarf – niahoo

답변

1

Bitcask 키와 값이 모두 바이너리있을 것으로 기대 부탁드립니다. term_to_binary/binary_to_term이 얼마나 빠를 지 잘 모르겠지만 디스크에 용어를 저장하려는 경우에는 그럴 수 없습니다. 물론 키와 값을 바이너리로 변환 할 수있는 코드를 만들 수도 있지만 내장 함수보다 훨씬 빠르며 유연성이 떨어지는 것은 아닙니다. 하지만 하루가 끝날 때면 애플리케이션 프로필을 측정하고 term_to_binary/binary_to_term이 전체 시스템의 핫스팟인지 결정해야합니다. 데이터가 디스크에 기록되어야하는 실제 응용 프로그램의 경우에는 매우 놀랍습니다.

이제 sr_db를 호출 할 때 오류가 발생합니다. get/2.{get, Key} 튜플 안에서 키를 두 번 감싸고 있습니다. 한 번 sr_db 안에 : get/2를 입력하고 cask_wrapper : get/2를 사용합니다. 그러나 cask_wrapper : handle_call/3에서 일치 시켜서 한 번만 언랩합니다. 당신은 바로 그 두 줄에 오류 보고서에서 이것을 발견 할 수 있습니다

** Last message in was {get,{get,<<131,97,3>>}}

{gen_server,call,[users_cask,{get,{get,<<131,97,3>>}}]}}

+0

바보 복사 - 붙여 넣기 오류 :)에 많은 감사했다 당신. 이진 변환에 대해서 나는 bitcask가이 문제를 해결할 자신 만의 방법을 제공한다고 생각했다. 그래서 나는 나중에 내 코드와 프로파일을 고수 할 것이다. 감사. – niahoo

관련 문제