summaryrefslogtreecommitdiff
path: root/src/session/session_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/session/session_api.c')
-rw-r--r--src/session/session_api.c221
1 files changed, 208 insertions, 13 deletions
diff --git a/src/session/session_api.c b/src/session/session_api.c
index c03b5fdc044..bb496494234 100644
--- a/src/session/session_api.c
+++ b/src/session/session_api.c
@@ -13,6 +13,20 @@ static int __session_snapshot(WT_SESSION *, const char *);
static int __session_rollback_transaction(WT_SESSION *, const char *);
/*
+ * __wt_session_notsup --
+ * Unsupported session method.
+ */
+int
+__wt_session_notsup(WT_SESSION *wt_session)
+{
+ WT_SESSION_IMPL *session;
+
+ session = (WT_SESSION_IMPL *)wt_session;
+
+ WT_RET_MSG(session, ENOTSUP, "Unsupported session method");
+}
+
+/*
* __wt_session_reset_cursors --
* Reset all open cursors.
*/
@@ -26,7 +40,8 @@ __wt_session_reset_cursors(WT_SESSION_IMPL *session, bool free_buffers)
/* Stop when there are no positioned cursors. */
if (session->ncursors == 0)
break;
- WT_TRET(cursor->reset(cursor));
+ if (!F_ISSET(cursor, WT_CURSTD_JOINED))
+ WT_TRET(cursor->reset(cursor));
/* Optionally, free the cursor buffers */
if (free_buffers) {
__wt_buf_free(session, &cursor->key);
@@ -478,10 +493,13 @@ __session_create(WT_SESSION *wt_session, const char *uri, const char *config)
/*
* We can't disallow type entirely, a configuration string might
* innocently include it, for example, a dump/load pair. If the
- * URI type prefix and the type are the same, let it go.
+ * underlying type is "file", it's OK ("file" is the underlying
+ * type for every type); if the URI type prefix and the type are
+ * the same, let it go.
*/
if ((ret =
__wt_config_getones(session, config, "type", &cval)) == 0 &&
+ !WT_STRING_MATCH("file", cval.str, cval.len) &&
(strncmp(uri, cval.str, cval.len) != 0 ||
uri[cval.len] != ':'))
WT_ERR_MSG(session, EINVAL,
@@ -495,6 +513,20 @@ err: API_END_RET_NOTFOUND_MAP(session, ret);
}
/*
+ * __session_create_readonly --
+ * WT_SESSION->create method; readonly version.
+ */
+static int
+__session_create_readonly(
+ WT_SESSION *wt_session, const char *uri, const char *config)
+{
+ WT_UNUSED(uri);
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_log_flush --
* WT_SESSION->log_flush method.
*/
@@ -532,6 +564,18 @@ err: API_END_RET(session, ret);
}
/*
+ * __session_log_flush_readonly --
+ * WT_SESSION->log_flush method; readonly version.
+ */
+static int
+__session_log_flush_readonly(WT_SESSION *wt_session, const char *config)
+{
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_log_printf --
* WT_SESSION->log_printf method.
*/
@@ -554,6 +598,19 @@ err: API_END_RET(session, ret);
}
/*
+ * __session_log_printf_readonly --
+ * WT_SESSION->log_printf method; readonly version.
+ */
+static int
+__session_log_printf_readonly(WT_SESSION *wt_session, const char *fmt, ...)
+ WT_GCC_FUNC_ATTRIBUTE((format (printf, 2, 3)))
+{
+ WT_UNUSED(fmt);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_rebalance --
* WT_SESSION->rebalance method.
*/
@@ -567,9 +624,6 @@ __session_rebalance(WT_SESSION *wt_session, const char *uri, const char *config)
SESSION_API_CALL(session, rebalance, config, cfg);
- if (F_ISSET(S2C(session), WT_CONN_IN_MEMORY))
- WT_ERR(ENOTSUP);
-
/* Block out checkpoints to avoid spurious EBUSY errors. */
WT_WITH_CHECKPOINT_LOCK(session, ret,
WT_WITH_SCHEMA_LOCK(session, ret,
@@ -580,6 +634,20 @@ err: API_END_RET_NOTFOUND_MAP(session, ret);
}
/*
+ * __session_rebalance_readonly --
+ * WT_SESSION->rebalance method; readonly version.
+ */
+static int
+__session_rebalance_readonly(
+ WT_SESSION *wt_session, const char *uri, const char *config)
+{
+ WT_UNUSED(uri);
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_rename --
* WT_SESSION->rename method.
*/
@@ -597,14 +665,30 @@ __session_rename(WT_SESSION *wt_session,
WT_ERR(__wt_str_name_check(session, uri));
WT_ERR(__wt_str_name_check(session, newuri));
- WT_WITH_SCHEMA_LOCK(session, ret,
- WT_WITH_TABLE_LOCK(session, ret,
- ret = __wt_schema_rename(session, uri, newuri, cfg)));
+ WT_WITH_CHECKPOINT_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_TABLE_LOCK(session, ret,
+ ret = __wt_schema_rename(session, uri, newuri, cfg))));
err: API_END_RET_NOTFOUND_MAP(session, ret);
}
/*
+ * __session_rename_readonly --
+ * WT_SESSION->rename method; readonly version.
+ */
+static int
+__session_rename_readonly(WT_SESSION *wt_session,
+ const char *uri, const char *newuri, const char *config)
+{
+ WT_UNUSED(uri);
+ WT_UNUSED(newuri);
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_reset --
* WT_SESSION->reset method.
*/
@@ -646,9 +730,10 @@ __wt_session_drop(WT_SESSION_IMPL *session, const char *uri, const char *cfg[])
if (!lock_wait)
F_SET(session, WT_SESSION_LOCK_NO_WAIT);
- WT_WITH_SCHEMA_LOCK(session, ret,
- WT_WITH_TABLE_LOCK(session, ret,
- ret = __wt_schema_drop(session, uri, cfg)));
+ WT_WITH_CHECKPOINT_LOCK(session, ret,
+ WT_WITH_SCHEMA_LOCK(session, ret,
+ WT_WITH_TABLE_LOCK(session, ret,
+ ret = __wt_schema_drop(session, uri, cfg))));
if (!lock_wait)
F_CLR(session, WT_SESSION_LOCK_NO_WAIT);
@@ -679,6 +764,20 @@ err: /* Note: drop operations cannot be unrolled (yet?). */
}
/*
+ * __session_drop_readonly --
+ * WT_SESSION->drop method; readonly version.
+ */
+static int
+__session_drop_readonly(
+ WT_SESSION *wt_session, const char *uri, const char *config)
+{
+ WT_UNUSED(uri);
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_join --
* WT_SESSION->join method.
*/
@@ -823,6 +922,20 @@ err: API_END_RET_NOTFOUND_MAP(session, ret);
}
/*
+ * __session_salvage_readonly --
+ * WT_SESSION->salvage method; readonly version.
+ */
+static int
+__session_salvage_readonly(
+ WT_SESSION *wt_session, const char *uri, const char *config)
+{
+ WT_UNUSED(uri);
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __wt_session_range_truncate --
* Session handling of a range truncate.
*/
@@ -1004,6 +1117,22 @@ err: TXN_API_END_RETRY(session, ret, 0);
}
/*
+ * __session_truncate_readonly --
+ * WT_SESSION->truncate method; readonly version.
+ */
+static int
+__session_truncate_readonly(WT_SESSION *wt_session,
+ const char *uri, WT_CURSOR *start, WT_CURSOR *stop, const char *config)
+{
+ WT_UNUSED(uri);
+ WT_UNUSED(start);
+ WT_UNUSED(stop);
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_upgrade --
* WT_SESSION->upgrade method.
*/
@@ -1026,6 +1155,20 @@ err: API_END_RET_NOTFOUND_MAP(session, ret);
}
/*
+ * __session_upgrade_readonly --
+ * WT_SESSION->upgrade method; readonly version.
+ */
+static int
+__session_upgrade_readonly(
+ WT_SESSION *wt_session, const char *uri, const char *config)
+{
+ WT_UNUSED(uri);
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_verify --
* WT_SESSION->verify method.
*/
@@ -1247,6 +1390,18 @@ err: API_END_RET(session, ret);
}
/*
+ * __session_transaction_sync_readonly --
+ * WT_SESSION->transaction_sync method; readonly version.
+ */
+static int
+__session_transaction_sync_readonly(WT_SESSION *wt_session, const char *config)
+{
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_checkpoint --
* WT_SESSION->checkpoint method.
*/
@@ -1295,6 +1450,18 @@ err: API_END_RET_NOTFOUND_MAP(session, ret);
}
/*
+ * __session_checkpoint_readonly --
+ * WT_SESSION->checkpoint method; readonly version.
+ */
+static int
+__session_checkpoint_readonly(WT_SESSION *wt_session, const char *config)
+{
+ WT_UNUSED(config);
+
+ return (__wt_session_notsup(wt_session));
+}
+
+/*
* __session_snapshot --
* WT_SESSION->snapshot method.
*/
@@ -1380,6 +1547,33 @@ __open_session(WT_CONNECTION_IMPL *conn,
__session_snapshot,
__session_transaction_pinned_range,
__session_transaction_sync
+ }, stds_readonly = {
+ NULL,
+ NULL,
+ __session_close,
+ __session_reconfigure,
+ __session_strerror,
+ __session_open_cursor,
+ __session_create_readonly,
+ __wt_session_compact_readonly,
+ __session_drop_readonly,
+ __session_join,
+ __session_log_flush_readonly,
+ __session_log_printf_readonly,
+ __session_rebalance_readonly,
+ __session_rename_readonly,
+ __session_reset,
+ __session_salvage_readonly,
+ __session_truncate_readonly,
+ __session_upgrade_readonly,
+ __session_verify,
+ __session_begin_transaction,
+ __session_commit_transaction,
+ __session_rollback_transaction,
+ __session_checkpoint_readonly,
+ __session_snapshot,
+ __session_transaction_pinned_range,
+ __session_transaction_sync_readonly
};
WT_DECL_RET;
WT_SESSION_IMPL *session, *session_ret;
@@ -1407,7 +1601,7 @@ __open_session(WT_CONNECTION_IMPL *conn,
if (i == conn->session_size)
WT_ERR_MSG(session, ENOMEM,
"only configured to support %" PRIu32 " sessions"
- " (including %d additional internal sessions)",
+ " (including %" PRIu32 " additional internal sessions)",
conn->session_size, WT_EXTRA_INTERNAL_SESSIONS);
/*
@@ -1419,7 +1613,8 @@ __open_session(WT_CONNECTION_IMPL *conn,
conn->session_cnt = i + 1;
session_ret->id = i;
- session_ret->iface = stds;
+ session_ret->iface =
+ F_ISSET(conn, WT_CONN_READONLY) ? stds_readonly : stds;
session_ret->iface.connection = &conn->iface;
WT_ERR(__wt_cond_alloc(session, "session", false, &session_ret->cond));