summaryrefslogtreecommitdiff
path: root/src/async
diff options
context:
space:
mode:
authorAlex Gorrod <alexander.gorrod@mongodb.com>2017-06-27 12:01:10 +1000
committerAlex Gorrod <alexander.gorrod@mongodb.com>2017-06-27 12:01:10 +1000
commit95d911ab246e444192f34dc395652dba2653dd3c (patch)
tree8e7c4692125a841a486607ccfe26e8499bc4c398 /src/async
parent19cd4d9be2c0fd980c00bb04bc949970002f5cb2 (diff)
parentd139a5d5be1d7ba94130502b379a61a809e66272 (diff)
downloadmongo-2.9.3.tar.gz
Merge branch 'mongodb-3.6'2.9.3
Diffstat (limited to 'src/async')
-rw-r--r--src/async/async_api.c23
-rw-r--r--src/async/async_op.c2
-rw-r--r--src/async/async_worker.c16
3 files changed, 15 insertions, 26 deletions
diff --git a/src/async/async_api.c b/src/async/async_api.c
index b9cc995f5a5..0f3e376fbfd 100644
--- a/src/async/async_api.c
+++ b/src/async/async_api.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2014-2016 MongoDB, Inc.
+ * Copyright (c) 2014-2017 MongoDB, Inc.
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
@@ -395,13 +395,12 @@ __wt_async_reconfig(WT_SESSION_IMPL *session, const char *cfg[])
* Join any worker we're stopping.
* After the thread is stopped, close its session.
*/
- WT_ASSERT(session, async->worker_tids[i] != 0);
+ WT_ASSERT(session, async->worker_tids[i].created);
WT_ASSERT(session, async->worker_sessions[i] != NULL);
F_CLR(async->worker_sessions[i],
WT_SESSION_SERVER_ASYNC);
WT_TRET(__wt_thread_join(
session, async->worker_tids[i]));
- async->worker_tids[i] = 0;
wt_session = &async->worker_sessions[i]->iface;
WT_TRET(wt_session->close(wt_session, NULL));
async->worker_sessions[i] = NULL;
@@ -420,7 +419,7 @@ int
__wt_async_destroy(WT_SESSION_IMPL *session)
{
WT_ASYNC *async;
- WT_ASYNC_FORMAT *af, *afnext;
+ WT_ASYNC_FORMAT *af;
WT_ASYNC_OP *op;
WT_CONNECTION_IMPL *conn;
WT_DECL_RET;
@@ -435,12 +434,8 @@ __wt_async_destroy(WT_SESSION_IMPL *session)
F_CLR(conn, WT_CONN_SERVER_ASYNC);
for (i = 0; i < conn->async_workers; i++)
- if (async->worker_tids[i] != 0) {
- WT_TRET(__wt_thread_join(
- session, async->worker_tids[i]));
- async->worker_tids[i] = 0;
- }
- WT_TRET(__wt_cond_destroy(session, &async->flush_cond));
+ WT_TRET(__wt_thread_join(session, async->worker_tids[i]));
+ __wt_cond_destroy(session, &async->flush_cond);
/* Close the server threads' sessions. */
for (i = 0; i < conn->async_workers; i++)
@@ -459,15 +454,13 @@ __wt_async_destroy(WT_SESSION_IMPL *session)
}
/* Free format resources */
- af = TAILQ_FIRST(&async->formatqh);
- while (af != NULL) {
- afnext = TAILQ_NEXT(af, q);
+ while ((af = TAILQ_FIRST(&async->formatqh)) != NULL) {
+ TAILQ_REMOVE(&async->formatqh, af, q);
__wt_free(session, af->uri);
__wt_free(session, af->config);
__wt_free(session, af->key_format);
__wt_free(session, af->value_format);
__wt_free(session, af);
- af = afnext;
}
__wt_free(session, async->async_queue);
__wt_free(session, async->async_ops);
@@ -499,7 +492,7 @@ __wt_async_flush(WT_SESSION_IMPL *session)
*/
workers = 0;
for (i = 0; i < conn->async_workers; ++i)
- if (async->worker_tids[i] != 0)
+ if (async->worker_tids[i].created)
++workers;
if (workers == 0)
return (0);
diff --git a/src/async/async_op.c b/src/async/async_op.c
index 6908802dbff..d4ca754b95f 100644
--- a/src/async/async_op.c
+++ b/src/async/async_op.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2014-2016 MongoDB, Inc.
+ * Copyright (c) 2014-2017 MongoDB, Inc.
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
diff --git a/src/async/async_worker.c b/src/async/async_worker.c
index 11f59ed14f1..57ebe5d8bb1 100644
--- a/src/async/async_worker.c
+++ b/src/async/async_worker.c
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2014-2016 MongoDB, Inc.
+ * Copyright (c) 2014-2017 MongoDB, Inc.
* Copyright (c) 2008-2014 WiredTiger, Inc.
* All rights reserved.
*
@@ -57,7 +57,6 @@ retry:
return (0);
if (!F_ISSET(conn, WT_CONN_SERVER_ASYNC))
return (0);
- WT_RET(WT_SESSION_CHECK_PANIC(session));
WT_ORDERED_READ(last_consume, async->alloc_tail);
}
if (async->flush_state == WT_ASYNC_FLUSHING)
@@ -282,7 +281,7 @@ WT_THREAD_RET
__wt_async_worker(void *arg)
{
WT_ASYNC *async;
- WT_ASYNC_CURSOR *ac, *acnext;
+ WT_ASYNC_CURSOR *ac;
WT_ASYNC_OP_IMPL *op;
WT_ASYNC_WORKER_STATE worker;
WT_CONNECTION_IMPL *conn;
@@ -301,11 +300,10 @@ __wt_async_worker(void *arg)
WT_ERR(__async_op_dequeue(conn, session, &op));
if (op != NULL && op != &async->flush_op) {
/*
- * If an operation fails, we want the worker thread to
- * keep running, unless there is a panic.
+ * Operation failure doesn't cause the worker thread to
+ * exit.
*/
(void)__async_worker_op(session, op, &worker);
- WT_ERR(WT_SESSION_CHECK_PANIC(session));
} else if (async->flush_state == WT_ASYNC_FLUSHING) {
/*
* Worker flushing going on. Last worker to the party
@@ -342,12 +340,10 @@ err: WT_PANIC_MSG(session, ret, "async worker error");
* Worker thread cleanup, close our cached cursors and free all the
* WT_ASYNC_CURSOR structures.
*/
- ac = TAILQ_FIRST(&worker.cursorqh);
- while (ac != NULL) {
- acnext = TAILQ_NEXT(ac, q);
+ while ((ac = TAILQ_FIRST(&worker.cursorqh)) != NULL) {
+ TAILQ_REMOVE(&worker.cursorqh, ac, q);
WT_TRET(ac->c->close(ac->c));
__wt_free(session, ac);
- ac = acnext;
}
return (WT_THREAD_RET_VALUE);
}