diff options
Diffstat (limited to 'src/third_party/wiredtiger/src/cursor/cur_file.c')
-rw-r--r-- | src/third_party/wiredtiger/src/cursor/cur_file.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/src/third_party/wiredtiger/src/cursor/cur_file.c b/src/third_party/wiredtiger/src/cursor/cur_file.c index 93f1392aef9..0b26b931f6c 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_file.c +++ b/src/third_party/wiredtiger/src/cursor/cur_file.c @@ -469,15 +469,18 @@ __curfile_close(WT_CURSOR *cursor) cbt = (WT_CURSOR_BTREE *)cursor; CURSOR_API_CALL_PREPARE_ALLOWED(cursor, session, close, cbt->btree); - released = false; +err: - /* - * If releasing the cursor fails in any way, it will be left - * in a state that allows it to be normally closed. - */ - WT_TRET(__wt_cursor_cache_release(session, cursor, &released)); - if (released) - goto done; + /* Only try to cache the cursor if there's no error. */ + if (ret == 0) { + /* + * If releasing the cursor fails in any way, it will be left in + * a state that allows it to be normally closed. + */ + ret = __wt_cursor_cache_release(session, cursor, &released); + if (released) + goto done; + } dead = F_ISSET(cursor, WT_CURSTD_DEAD); if (F_ISSET(cursor, WT_CURSTD_BULK)) { @@ -494,7 +497,7 @@ __curfile_close(WT_CURSOR *cursor) WT_ASSERT(session, session->dhandle == NULL || session->dhandle->session_inuse > 0); - WT_TRET(__wt_cursor_close(cursor)); + __wt_cursor_close(cursor); /* * Note: release the data handle last so that cursor statistics are @@ -513,8 +516,7 @@ __curfile_close(WT_CURSOR *cursor) WT_TRET(__wt_session_release_dhandle(session)); } -done: -err: API_END_RET(session, ret); +done: API_END_RET(session, ret); } /* @@ -632,18 +634,16 @@ __curfile_create(WT_SESSION_IMPL *session, WT_STATIC_ASSERT(offsetof(WT_CURSOR_BTREE, iface) == 0); - cbt = NULL; - cacheable = F_ISSET(session, WT_SESSION_CACHE_CURSORS) && !bulk; - btree = S2BT(session); WT_ASSERT(session, btree != NULL); csize = bulk ? sizeof(WT_CURSOR_BULK) : sizeof(WT_CURSOR_BTREE); - WT_RET(__wt_calloc(session, 1, csize, &cbt)); + cacheable = F_ISSET(session, WT_SESSION_CACHE_CURSORS) && !bulk; - cursor = &cbt->iface; + WT_RET(__wt_calloc(session, 1, csize, &cbt)); + cursor = (WT_CURSOR *)cbt; *cursor = iface; - cursor->session = &session->iface; + cursor->session = (WT_SESSION *)session; cursor->internal_uri = btree->dhandle->name; cursor->key_format = btree->key_format; cursor->value_format = btree->value_format; @@ -693,6 +693,10 @@ __curfile_create(WT_SESSION_IMPL *session, cacheable = false; } + WT_ERR(__wt_config_gets_def(session, cfg, "read_once", 0, &cval)); + if (cval.val != 0) + F_SET(cbt, WT_CBT_READ_ONCE); + /* Underlying btree initialization. */ __wt_btcur_open(cbt); @@ -710,7 +714,7 @@ __curfile_create(WT_SESSION_IMPL *session, * WiredTiger.wt should not be cached, doing so interferes * with named checkpoints. */ - if (cacheable && !WT_STREQ(WT_METAFILE_URI, cursor->internal_uri)) + if (cacheable && strcmp(WT_METAFILE_URI, cursor->internal_uri) != 0) F_SET(cursor, WT_CURSTD_CACHEABLE); WT_ERR(__wt_cursor_init( @@ -724,8 +728,7 @@ err: /* * Our caller expects to release the data handle if we fail. * Disconnect it from the cursor before closing. */ - if (session->dhandle != NULL) - __wt_cursor_dhandle_decr_use(session); + __wt_cursor_dhandle_decr_use(session); cbt->btree = NULL; WT_TRET(__curfile_close(cursor)); *cursorp = NULL; |