Cache session/[{cursor, config}] for reuse and spawn threads when needed. #9
4 changed files with 14 additions and 10 deletions
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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()}.
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue