summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/cache/cache_las.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/cache/cache_las.c')
-rw-r--r--src/third_party/wiredtiger/src/cache/cache_las.c52
1 files changed, 50 insertions, 2 deletions
diff --git a/src/third_party/wiredtiger/src/cache/cache_las.c b/src/third_party/wiredtiger/src/cache/cache_las.c
index a7e8afe7e02..87d55c1ac5e 100644
--- a/src/third_party/wiredtiger/src/cache/cache_las.c
+++ b/src/third_party/wiredtiger/src/cache/cache_las.c
@@ -57,6 +57,46 @@ __las_entry_count(WT_CACHE *cache)
}
/*
+ * __wt_las_config --
+ * Configure the lookaside table.
+ */
+int
+__wt_las_config(WT_SESSION_IMPL *session, const char **cfg)
+{
+ WT_CONFIG_ITEM cval;
+ WT_CURSOR_BTREE *las_cursor;
+ WT_SESSION_IMPL *las_session;
+
+ WT_RET(__wt_config_gets(
+ session, cfg, "cache_overflow.file_max", &cval));
+
+ if (cval.val != 0 && cval.val < WT_LAS_FILE_MIN)
+ WT_RET_MSG(session, EINVAL,
+ "max cache overflow size %" PRId64 " below minimum %d",
+ cval.val, WT_LAS_FILE_MIN);
+
+ /* This is expected for in-memory configurations. */
+ las_session = S2C(session)->cache->las_session[0];
+ WT_ASSERT(session,
+ las_session != NULL || F_ISSET(S2C(session), WT_CONN_IN_MEMORY));
+
+ if (las_session == NULL)
+ return (0);
+
+ /*
+ * We need to set file_max on the btree associated with one of the
+ * lookaside sessions.
+ */
+ las_cursor = (WT_CURSOR_BTREE *)las_session->las_cursor;
+ las_cursor->btree->file_max = (uint64_t)cval.val;
+
+ WT_STAT_CONN_SET(
+ session, cache_lookaside_ondisk_max, las_cursor->btree->file_max);
+
+ return (0);
+}
+
+/*
* __wt_las_empty --
* Return when there are entries in the lookaside table.
*/
@@ -126,7 +166,7 @@ __wt_las_stats_update(WT_SESSION_IMPL *session)
* Initialize the database's lookaside store.
*/
int
-__wt_las_create(WT_SESSION_IMPL *session)
+__wt_las_create(WT_SESSION_IMPL *session, const char **cfg)
{
WT_CACHE *cache;
WT_CONNECTION_IMPL *conn;
@@ -166,6 +206,8 @@ __wt_las_create(WT_SESSION_IMPL *session)
WT_RET(__wt_las_cursor_open(cache->las_session[i]));
}
+ WT_RET(__wt_las_config(session, cfg));
+
/* The statistics server is already running, make sure we don't race. */
WT_WRITE_BARRIER();
F_SET(conn, WT_CONN_LOOKASIDE_OPEN);
@@ -620,7 +662,8 @@ __wt_las_insert_block(WT_CURSOR *cursor,
WT_TXN_ISOLATION saved_isolation;
WT_UPDATE *upd;
wt_off_t las_size;
- uint64_t insert_cnt, las_counter, las_pageid, prepared_insert_cnt;
+ uint64_t insert_cnt, las_counter, las_pageid, max_las_size;
+ uint64_t prepared_insert_cnt;
uint32_t btree_id, i, slot;
uint8_t *p;
bool local_txn;
@@ -761,6 +804,11 @@ __wt_las_insert_block(WT_CURSOR *cursor,
WT_ERR(__wt_block_manager_named_size(session, WT_LAS_FILE, &las_size));
WT_STAT_CONN_SET(session, cache_lookaside_ondisk, las_size);
+ max_las_size = ((WT_CURSOR_BTREE *)cursor)->btree->file_max;
+ if (max_las_size != 0 && (uint64_t)las_size > max_las_size)
+ WT_PANIC_MSG(session, WT_PANIC,
+ "WiredTigerLAS: file size of %" PRIu64 " exceeds maximum "
+ "size %" PRIu64, (uint64_t)las_size, max_las_size);
err: /* Resolve the transaction. */
if (local_txn) {