Cache session/[{cursor, config}] for reuse and spawn threads when needed. #9

Merged
gburd merged 30 commits from gsb-ctx-cache into master 2013-07-03 12:31:15 +00:00
4 changed files with 14 additions and 10 deletions
Showing only changes of commit 778ba20352 - Show all commits

View file

@ -24,7 +24,6 @@
extern "C" { extern "C" {
#endif #endif
#define DEBUG 1
#if !(__STDC_VERSION__ >= 199901L || defined(__GNUC__)) #if !(__STDC_VERSION__ >= 199901L || defined(__GNUC__))
# undef DEBUG # undef DEBUG
# define DEBUG 0 # define DEBUG 0

View file

@ -189,6 +189,7 @@ __ctx_cache_evict(WterlConnHandle *conn_handle)
* Evict anything older than the mean time in queue by removing those * Evict anything older than the mean time in queue by removing those
* items from the lists stored in the tree. * items from the lists stored in the tree.
*/ */
num_evicted = 0;
for (itr = kh_begin(h); itr != kh_end(h); ++itr) { for (itr = kh_begin(h); itr != kh_end(h); ++itr) {
if (kh_exist(h, itr)) { if (kh_exist(h, itr)) {
e = kh_val(h, itr); e = kh_val(h, itr);
@ -277,6 +278,7 @@ __ctx_cache_add(WterlConnHandle *conn_handle, struct wterl_ctx *c)
itr = kh_get(cache_entries, h, c->sig); itr = kh_get(cache_entries, h, c->sig);
if (itr == kh_end(h)) { if (itr == kh_end(h)) {
e = enif_alloc(sizeof(struct cache_entry)); // TODO: enomem e = enif_alloc(sizeof(struct cache_entry)); // TODO: enomem
memset(e, 0, sizeof(struct cache_entry));
SLIST_INIT(&e->contexts); SLIST_INIT(&e->contexts);
itr = kh_put(cache_entries, h, c->sig, &itr_status); itr = kh_put(cache_entries, h, c->sig, &itr_status);
kh_value(h, itr) = e; kh_value(h, itr) = e;
@ -468,9 +470,11 @@ __close_all_sessions(WterlConnHandle *conn_handle)
for (i = 0; i < ASYNC_NIF_MAX_WORKERS; i++) { for (i = 0; i < ASYNC_NIF_MAX_WORKERS; i++) {
c = conn_handle->last_ctx_used[i]; c = conn_handle->last_ctx_used[i];
c->session->close(c->session, NULL); if (c) {
enif_free(c); c->session->close(c->session, NULL);
conn_handle->last_ctx_used[i] = NULL; enif_free(c);
conn_handle->last_ctx_used[i] = NULL;
}
} }
khiter_t itr; khiter_t itr;
for (itr = kh_begin(h); itr != kh_end(h); ++itr) { for (itr = kh_begin(h); itr != kh_end(h); ++itr) {
@ -688,10 +692,11 @@ ASYNC_NIF_DECL(
int rc = wiredtiger_open(args->homedir, int rc = wiredtiger_open(args->homedir,
(WT_EVENT_HANDLER*)&args->priv->eh.handlers, (WT_EVENT_HANDLER*)&args->priv->eh.handlers,
config.data[0] != 0 ? (const char*)config.data : NULL, (config.size > 1) ? (const char *)config.data : NULL,
&conn); &conn);
if (rc == 0) { if (rc == 0) {
WterlConnHandle *conn_handle = enif_alloc_resource(wterl_conn_RESOURCE, sizeof(WterlConnHandle)); WterlConnHandle *conn_handle = enif_alloc_resource(wterl_conn_RESOURCE, sizeof(WterlConnHandle));
memset(conn_handle, 0, sizeof(WterlConnHandle));
if (!conn_handle) { if (!conn_handle) {
ASYNC_NIF_REPLY(__strerror_term(env, ENOMEM)); ASYNC_NIF_REPLY(__strerror_term(env, ENOMEM));
return; return;
@ -1134,7 +1139,6 @@ ASYNC_NIF_DECL(
} }
args->config = enif_make_copy(ASYNC_NIF_WORK_ENV, argv[4]); args->config = enif_make_copy(ASYNC_NIF_WORK_ENV, argv[4]);
enif_keep_resource((void*)args->conn_handle); enif_keep_resource((void*)args->conn_handle);
affinity = __str_hash(args->uri);
}, },
{ // work { // work
@ -1603,7 +1607,6 @@ ASYNC_NIF_DECL(
} }
args->config = enif_make_copy(ASYNC_NIF_WORK_ENV, argv[2]); args->config = enif_make_copy(ASYNC_NIF_WORK_ENV, argv[2]);
enif_keep_resource((void*)args->conn_handle); enif_keep_resource((void*)args->conn_handle);
affinity = __str_hash(args->uri);
}, },
{ // work { // work
@ -1637,6 +1640,7 @@ ASYNC_NIF_DECL(
ASYNC_NIF_REPLY(__strerror_term(env, ENOMEM)); ASYNC_NIF_REPLY(__strerror_term(env, ENOMEM));
return; return;
} }
memset(cursor_handle, 0, sizeof(WterlCursorHandle));
cursor_handle->session = session; cursor_handle->session = session;
cursor_handle->cursor = cursor; cursor_handle->cursor = cursor;
ERL_NIF_TERM result = enif_make_resource(env, cursor_handle); ERL_NIF_TERM result = enif_make_resource(env, cursor_handle);

View file

@ -96,7 +96,8 @@ nif_stub_error(Line) ->
-spec init() -> ok | {error, any()}. -spec init() -> ok | {error, any()}.
init() -> init() ->
erlang:load_nif(filename:join([priv_dir(), atom_to_list(?MODULE)]), erlang:load_nif(filename:join([priv_dir(), atom_to_list(?MODULE)]),
[{wterl_vsn, "a1459ce"}, {wiredtiger_vsn, "1.5.2-2-g8f2685b"}]). [{wterl_vsn, "f1b7d8322da904a3385b97456819afd63ff41afe"},
{wiredtiger_vsn, "1.6.1-a06b59e47db7b120575049bd7d6314df53e78e54"}]).
-spec connection_open(string(), config_list()) -> {ok, connection()} | {error, term()}. -spec connection_open(string(), config_list()) -> {ok, connection()} | {error, term()}.
-spec connection_open(string(), config_list(), config_list()) -> {ok, connection()} | {error, term()}. -spec connection_open(string(), config_list(), config_list()) -> {ok, connection()} | {error, term()}.

View file

@ -3,7 +3,7 @@
# Note: also, remember to update version numbers in rpath specs so that shared libs can be found at runtime!!! # Note: also, remember to update version numbers in rpath specs so that shared libs can be found at runtime!!!
wterl=`git log -n 1 --pretty=format:"%H"` wterl=`git log -n 1 --pretty=format:"%H"`
wiredtiger0=`(cd c_src/wiredtiger && git log -n 1 --pretty=format:"%H")` wiredtiger0=`(cd c_src/wiredtiger-develop && git log -n 1 --pretty=format:"%H")`
wiredtiger=`echo $wiredtiger0 | awk '{print $2}'` wiredtiger=`echo $wiredtiger0 | awk '{print $2}'`
echo $wterl echo $wterl