summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/conn/conn_dhandle.c29
-rw-r--r--src/conn/conn_stat.c4
-rw-r--r--src/conn/conn_sweep.c8
-rw-r--r--src/docs/readonly.dox2
-rw-r--r--src/docs/wtperf.dox11
-rw-r--r--src/evict/evict_lru.c22
-rw-r--r--src/support/power8/crc32.S50
7 files changed, 95 insertions, 31 deletions
diff --git a/src/conn/conn_dhandle.c b/src/conn/conn_dhandle.c
index f1b35571533..2fab08e3afa 100644
--- a/src/conn/conn_dhandle.c
+++ b/src/conn/conn_dhandle.c
@@ -134,14 +134,11 @@ __wt_conn_btree_sync_and_close(WT_SESSION_IMPL *session, bool final, bool force)
btree = S2BT(session);
bm = btree->bm;
dhandle = session->dhandle;
- marked_dead = false;
+ evict_reset = marked_dead = false;
if (!F_ISSET(dhandle, WT_DHANDLE_OPEN))
return (0);
- /* Ensure that we aren't racing with the eviction server */
- WT_RET(__wt_evict_file_exclusive_on(session, &evict_reset));
-
/*
* If we don't already have the schema lock, make it an error to try
* to acquire it. The problem is that we are holding an exclusive
@@ -163,6 +160,13 @@ __wt_conn_btree_sync_and_close(WT_SESSION_IMPL *session, bool final, bool force)
__wt_spin_lock(session, &dhandle->close_lock);
/*
+ * Ensure we aren't racing with the eviction server; inside the close
+ * lock so threads won't race setting/clearing the tree's "no eviction"
+ * flag.
+ */
+ WT_ERR(__wt_evict_file_exclusive_on(session, &evict_reset));
+
+ /*
* The close can fail if an update cannot be written, return the EBUSY
* error to our caller for eventual retry.
*
@@ -176,23 +180,19 @@ __wt_conn_btree_sync_and_close(WT_SESSION_IMPL *session, bool final, bool force)
WT_BTREE_SALVAGE | WT_BTREE_UPGRADE | WT_BTREE_VERIFY)) {
if (force && (bm == NULL || !bm->is_mapped(bm, session))) {
F_SET(session->dhandle, WT_DHANDLE_DEAD);
+ marked_dead = true;
- /*
- * Reset the tree's eviction priority, and the tree is
- * evictable by definition.
- */
+ /* Reset the tree's eviction priority (if any). */
__wt_evict_priority_clear(session);
- F_CLR(S2BT(session), WT_BTREE_NO_EVICTION);
-
- marked_dead = true;
}
if (!marked_dead || final)
WT_ERR(__wt_checkpoint_close(session, final));
}
WT_TRET(__wt_btree_close(session));
+
/*
- * If we marked a handle as dead it will be closed by sweep, via
+ * If we marked a handle dead it will be closed by sweep, via
* another call to sync and close.
*/
if (!marked_dead) {
@@ -204,10 +204,9 @@ __wt_conn_btree_sync_and_close(WT_SESSION_IMPL *session, bool final, bool force)
F_ISSET(dhandle, WT_DHANDLE_DEAD) ||
!F_ISSET(dhandle, WT_DHANDLE_OPEN));
-err: __wt_spin_unlock(session, &dhandle->close_lock);
-
- if (evict_reset)
+err: if (evict_reset)
__wt_evict_file_exclusive_off(session);
+ __wt_spin_unlock(session, &dhandle->close_lock);
if (no_schema_lock)
F_CLR(session, WT_SESSION_NO_SCHEMA_LOCK);
diff --git a/src/conn/conn_stat.c b/src/conn/conn_stat.c
index 9ccfa8ad8db..d6e59a50da5 100644
--- a/src/conn/conn_stat.c
+++ b/src/conn/conn_stat.c
@@ -106,10 +106,6 @@ __statlog_config(WT_SESSION_IMPL *session, const char **cfg, bool *runp)
* If any statistics logging is done, this must not be a read-only
* connection.
*/
- if (F_ISSET(conn, WT_CONN_READONLY))
- WT_RET_MSG(session, EINVAL,
- "Read-only configuration incompatible with statistics "
- "logging");
WT_RET(__wt_config_gets(session, cfg, "statistics_log.sources", &cval));
WT_RET(__wt_config_subinit(session, &objectconf, &cval));
for (cnt = 0; (ret = __wt_config_next(&objectconf, &k, &v)) == 0; ++cnt)
diff --git a/src/conn/conn_sweep.c b/src/conn/conn_sweep.c
index 7628076e605..cc0aa5a1322 100644
--- a/src/conn/conn_sweep.c
+++ b/src/conn/conn_sweep.c
@@ -91,9 +91,9 @@ __sweep_expire_one(WT_SESSION_IMPL *session)
goto err;
/*
- * Mark the handle as dead and close the underlying file
- * handle. Closing the handle decrements the open file count,
- * meaning the close loop won't overrun the configured minimum.
+ * Mark the handle dead and close the underlying file handle.
+ * Closing the handle decrements the open file count, meaning the close
+ * loop won't overrun the configured minimum.
*/
ret = __wt_conn_btree_sync_and_close(session, false, true);
@@ -163,7 +163,7 @@ __sweep_discard_trees(WT_SESSION_IMPL *session, u_int *dead_handlesp)
!F_ISSET(dhandle, WT_DHANDLE_DEAD))
continue;
- /* If the handle is marked "dead", flush it from cache. */
+ /* If the handle is marked dead, flush it from cache. */
WT_WITH_DHANDLE(session, dhandle, ret =
__wt_conn_btree_sync_and_close(session, false, false));
diff --git a/src/docs/readonly.dox b/src/docs/readonly.dox
index 9935f5d1b17..ad4a94a73f1 100644
--- a/src/docs/readonly.dox
+++ b/src/docs/readonly.dox
@@ -18,7 +18,7 @@ tree merges are turned off when LSM trees are configured, and log file
archiving is disabled when logging is configured.
Where a user configured setting contradicts read-only operation, WiredTiger
-will return an error. For example, statistics logging or zero-filling
+will return an error. For example, zero-filling
log files is not allowed in read-only mode, and attempting to configure
them will return an error.
diff --git a/src/docs/wtperf.dox b/src/docs/wtperf.dox
index 6f3d2f87ee0..6d8dcab8f65 100644
--- a/src/docs/wtperf.dox
+++ b/src/docs/wtperf.dox
@@ -251,14 +251,19 @@ threads configuration might be
'threads=((count=2,reads=1)(count=8,reads=1,inserts=2,updates=1))'
which would create 2 threads doing nothing but reads and 8 threads
each doing 50% inserts and 25% reads and updates. Allowed
-configuration values are 'count', 'throttle', 'reads', 'inserts',
-'updates', 'truncate', 'truncate_pct' and 'truncate_count'. There are
-also behavior modifiers, supported modifiers are 'ops_per_txn'
+configuration values are 'count', 'throttle', 'update_delta', 'reads',
+'inserts', 'updates', 'truncate', 'truncate_pct' and 'truncate_count'.
+There are also behavior modifiers, supported modifiers are
+'ops_per_txn'
@par transaction_config (string, default=)
transaction configuration string, relevant when populate_opts_per_txn
is nonzero
@par table_name (string, default=test)
table name
+@par value_sz_max (unsigned int, default=1000)
+maximum value size when delta updates are present. Default disabled
+@par value_sz_min (unsigned int, default=1)
+minimum value size when delta updates are present. Default disabled
@par value_sz (unsigned int, default=100)
value size
@par verbose (unsigned int, default=1)
diff --git a/src/evict/evict_lru.c b/src/evict/evict_lru.c
index 35b12e2b685..884c08a02df 100644
--- a/src/evict/evict_lru.c
+++ b/src/evict/evict_lru.c
@@ -791,7 +791,7 @@ __wt_evict_file_exclusive_on(WT_SESSION_IMPL *session, bool *evict_resetp)
btree = S2BT(session);
cache = S2C(session)->cache;
- /* If the file wasn't evictable, there's no work to do. */
+ /* If the file was never evictable, there's no work to do. */
if (F_ISSET(btree, WT_BTREE_NO_EVICTION))
return (0);
@@ -800,9 +800,16 @@ __wt_evict_file_exclusive_on(WT_SESSION_IMPL *session, bool *evict_resetp)
* the file will be queued for eviction after this point.
*/
__wt_spin_lock(session, &cache->evict_walk_lock);
- F_SET(btree, WT_BTREE_NO_EVICTION);
+ if (!F_ISSET(btree, WT_BTREE_NO_EVICTION)) {
+ F_SET(btree, WT_BTREE_NO_EVICTION);
+ *evict_resetp = true;
+ }
__wt_spin_unlock(session, &cache->evict_walk_lock);
+ /* If some other operation has disabled eviction, we're done. */
+ if (!*evict_resetp)
+ return (0);
+
/* Clear any existing LRU eviction walk for the file. */
WT_ERR(__evict_request_walk_clear(session));
@@ -826,10 +833,10 @@ __wt_evict_file_exclusive_on(WT_SESSION_IMPL *session, bool *evict_resetp)
while (btree->evict_busy > 0)
__wt_yield();
- *evict_resetp = true;
return (0);
err: F_CLR(btree, WT_BTREE_NO_EVICTION);
+ *evict_resetp = false;
return (ret);
}
@@ -844,7 +851,14 @@ __wt_evict_file_exclusive_off(WT_SESSION_IMPL *session)
btree = S2BT(session);
- WT_ASSERT(session, btree->evict_ref == NULL);
+ /*
+ * We have seen subtle bugs with multiple threads racing to turn
+ * eviction on/off. Make races more likely in diagnostic builds.
+ */
+ WT_DIAGNOSTIC_YIELD;
+
+ WT_ASSERT(session, btree->evict_ref == NULL &&
+ F_ISSET(btree, WT_BTREE_NO_EVICTION));
F_CLR(btree, WT_BTREE_NO_EVICTION);
}
diff --git a/src/support/power8/crc32.S b/src/support/power8/crc32.S
index 4bc1fad416d..3ef2928aaa1 100644
--- a/src/support/power8/crc32.S
+++ b/src/support/power8/crc32.S
@@ -90,6 +90,31 @@ FUNC_START(__crc32_vpmsum)
std r26,-48(r1)
std r25,-56(r1)
+ li r31, -256
+ stvx v20, r31, r1
+ li r31, -240
+ stvx v21, r31, r1
+ li r31, -224
+ stvx v22, r31, r1
+ li r31, -208
+ stvx v23, r31, r1
+ li r31, -192
+ stvx v24, r31, r1
+ li r31, -176
+ stvx v25, r31, r1
+ li r31, -160
+ stvx v26, r31, r1
+ li r31, -144
+ stvx v27, r31, r1
+ li r31, -128
+ stvx v28, r31, r1
+ li r31, -112
+ stvx v29, r31, r1
+ li r31, -96
+ stvx v30, r31, r1
+ li r31, -80
+ stvx v31, r31, r1
+
li off16,16
li off32,32
li off48,48
@@ -571,6 +596,31 @@ FUNC_START(__crc32_vpmsum)
/* Get it into r3 */
MFVRD(r3, v0)
+ li r31, -256
+ lvx v20, r31, r1
+ li r31, -240
+ lvx v21, r31, r1
+ li r31, -224
+ lvx v22, r31, r1
+ li r31, -208
+ lvx v23, r31, r1
+ li r31, -192
+ lvx v24, r31, r1
+ li r31, -176
+ lvx v25, r31, r1
+ li r31, -160
+ lvx v26, r31, r1
+ li r31, -144
+ lvx v27, r31, r1
+ li r31, -128
+ lvx v28, r31, r1
+ li r31, -112
+ lvx v29, r31, r1
+ li r31, -96
+ lvx v30, r31, r1
+ li r31, -80
+ lvx v31, r31, r1
+
ld r31,-8(r1)
ld r30,-16(r1)
ld r29,-24(r1)