Navigation Menu

Skip to content

Commit

Permalink
update to strategy that doesn't lock up beam
Browse files Browse the repository at this point in the history
  • Loading branch information
evanmcc committed Oct 25, 2013
1 parent 4b5b2e2 commit 619a2e3
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 80 deletions.
48 changes: 8 additions & 40 deletions c_src/bitcask_nifs.c
Expand Up @@ -254,8 +254,6 @@ ERL_NIF_TERM bitcask_nifs_keydir_itr_release(ErlNifEnv* env, int argc, const ERL
ERL_NIF_TERM bitcask_nifs_keydir_info(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM bitcask_nifs_keydir_release(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);

ERL_NIF_TERM bitcask_nifs_take_keydir_lock(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM bitcask_nifs_release_keydir_lock(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM bitcask_nifs_increment_file_id(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM bitcask_nifs_decrement_file_id(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);

Expand Down Expand Up @@ -304,8 +302,6 @@ static ErlNifFunc nif_funcs[] =
{"keydir_info", 1, bitcask_nifs_keydir_info},
{"keydir_release", 1, bitcask_nifs_keydir_release},

{"take_keydir_lock", 1, bitcask_nifs_take_keydir_lock},
{"release_keydir_lock", 1, bitcask_nifs_release_keydir_lock},
{"increment_file_id", 1, bitcask_nifs_increment_file_id},
{"decrement_file_id", 1, bitcask_nifs_decrement_file_id},

Expand Down Expand Up @@ -1715,48 +1711,18 @@ ERL_NIF_TERM bitcask_nifs_keydir_release(ErlNifEnv* env, int argc, const ERL_NIF
}
}

ERL_NIF_TERM bitcask_nifs_take_keydir_lock(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
bitcask_keydir_handle* handle;

if (enif_get_resource(env, argv[0], bitcask_keydir_RESOURCE, (void**)&handle))
{
LOCK(handle->keydir);
return ATOM_OK;
}
else
{
return enif_make_badarg(env);
}
}

ERL_NIF_TERM bitcask_nifs_release_keydir_lock(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
bitcask_keydir_handle* handle;

if (enif_get_resource(env, argv[0], bitcask_keydir_RESOURCE, (void**)&handle))
{
UNLOCK(handle->keydir);
return ATOM_OK;
}
else
{
return enif_make_badarg(env);
}
}

//increment and decrement assume the keydir they're operating on is locked.
ERL_NIF_TERM bitcask_nifs_increment_file_id(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
bitcask_keydir_handle* handle;

if (enif_get_resource(env, argv[0], bitcask_keydir_RESOURCE, (void**)&handle))
{

LOCK(handle->keydir);
(handle->keydir->biggest_file_id)++;
return enif_make_tuple2(env, ATOM_OK,
enif_make_uint(env,
handle->keydir->
biggest_file_id));
uint32_t id = handle->keydir->biggest_file_id;
UNLOCK(handle->keydir);
return enif_make_tuple2(env, ATOM_OK, enif_make_uint(env, id));
}
else
{
Expand All @@ -1770,7 +1736,9 @@ ERL_NIF_TERM bitcask_nifs_decrement_file_id(ErlNifEnv* env, int argc, const ERL_

if (enif_get_resource(env, argv[0], bitcask_keydir_RESOURCE, (void**)&handle))
{
(handle->keydir->biggest_file_id)--;
LOCK(handle->keydir);
(handle->keydir->biggest_file_id)--;
UNLOCK(handle->keydir);
return ATOM_OK;
}
else
Expand Down
62 changes: 30 additions & 32 deletions src/bitcask_fileops.erl
Expand Up @@ -66,38 +66,36 @@
reference()) ->
{ok, #filestate{}}.
create_file(DirName, Opts, Keydir) ->
Rep =
try
bitcask_nifs:take_keydir_lock(Keydir),
{ok, Newest} = bitcask_nifs:increment_file_id(Keydir),

Filename = mk_filename(DirName, Newest),
ok = ensure_dir(Filename),

%% Check for o_sync strategy and add to opts
FinalOpts =
case bitcask:get_opt(sync_strategy, Opts) of
o_sync ->
[o_sync | Opts];
_ ->
Opts
end,

{ok, FD} = bitcask_io:file_open(Filename, FinalOpts),
HintFD = open_hint_file(Filename, FinalOpts),
{ok, #filestate{mode = read_write,
filename = Filename,
tstamp = file_tstamp(Filename),
hintfd = HintFD, fd = FD, ofs = 0}}
catch Error:Reason ->
%% if we fail somehow, do we need to nuke any partial
%% state?
bitcask_nifs:decrement_file_id(Keydir),
{Error, Reason}
after
bitcask_nifs:release_keydir_lock(Keydir)
end,
Rep.
{ok, Lock} = bitcask_lockops:acquire(create, DirName),
try
{ok, Newest} = bitcask_nifs:increment_file_id(Keydir),

Filename = mk_filename(DirName, Newest),
ok = ensure_dir(Filename),

%% Check for o_sync strategy and add to opts
FinalOpts =
case bitcask:get_opt(sync_strategy, Opts) of
o_sync ->
[o_sync | Opts];
_ ->
Opts
end,

{ok, FD} = bitcask_io:file_open(Filename, FinalOpts),
HintFD = open_hint_file(Filename, FinalOpts),
{ok, #filestate{mode = read_write,
filename = Filename,
tstamp = file_tstamp(Filename),
hintfd = HintFD, fd = FD, ofs = 0}}
catch Error:Reason ->
%% if we fail somehow, do we need to nuke any partial
%% state?
bitcask_nifs:decrement_file_id(Keydir),
{Error, Reason}
after
bitcask_lockops:release(Lock)
end.

%% @doc Open an existing file for reading.
%% Called with fully-qualified filename.
Expand Down
8 changes: 0 additions & 8 deletions src/bitcask_nifs.erl
Expand Up @@ -39,8 +39,6 @@
keydir_wait_pending/1,
keydir_info/1,
keydir_release/1,
take_keydir_lock/1,
release_keydir_lock/1,
increment_file_id/1,
decrement_file_id/1,
lock_acquire/2,
Expand Down Expand Up @@ -252,12 +250,6 @@ keydir_itr_release(_Ref) ->
ok.


take_keydir_lock(_Ref) ->
erlang:nif_error({error, not_loaded}).

release_keydir_lock(_Ref) ->
erlang:nif_error({error, not_loaded}).

increment_file_id(_Ref) ->
erlang:nif_error({error, not_loaded}).

Expand Down

0 comments on commit 619a2e3

Please sign in to comment.