summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@wiredtiger.com>2015-02-03 14:49:08 +1100
committerMichael Cahill <michael.cahill@wiredtiger.com>2015-02-03 14:49:08 +1100
commit367723d0d67ab2a0f56602c4990994e241d1a714 (patch)
treea5820fa57005cd78e745aa1a552fccd8b8976d64
parentb4fe7dc9758cc029dd573a89a702dfc8e07ab7d6 (diff)
downloadmongo-367723d0d67ab2a0f56602c4990994e241d1a714.tar.gz
Retry individual operations on WT_RESTART: take care with truncate loops that do next/prev in addition to removing.
-rw-r--r--src/btree/bt_cursor.c89
-rw-r--r--src/include/api.h4
2 files changed, 44 insertions, 49 deletions
diff --git a/src/btree/bt_cursor.c b/src/btree/bt_cursor.c
index 704b258a7dd..984ae62d419 100644
--- a/src/btree/bt_cursor.c
+++ b/src/btree/bt_cursor.c
@@ -935,30 +935,25 @@ __cursor_truncate(WT_SESSION_IMPL *session,
* and we can proceed without concern.
*/
if (start == NULL) {
- do {
+ while (ret == 0) {
WT_RET(__wt_btcur_remove(stop));
- for (;;) {
- if ((ret = __wt_btcur_prev(stop, 1)) != 0)
- break;
- stop->compare = 0; /* Exact match */
- if ((ret = rmfunc(session, stop, 1)) != 0)
- break;
- }
- } while (ret == WT_RESTART);
+ WT_RESTART_RETRY(__wt_btcur_prev(stop, 1), ret);
+ if (ret != 0)
+ break;
+ stop->compare = 0; /* Exact match */
+ WT_RESTART_RETRY(rmfunc(session, stop, 1), ret);
+ }
} else {
- do {
- WT_RET(__wt_btcur_remove(start));
- for (;;) {
- if (stop != NULL &&
- __cursor_equals(start, stop))
- break;
- if ((ret = __wt_btcur_next(start, 1)) != 0)
- break;
- start->compare = 0; /* Exact match */
- if ((ret = rmfunc(session, start, 1)) != 0)
- break;
- }
- } while (ret == WT_RESTART);
+ WT_RET(__wt_btcur_remove(start));
+ while (ret == 0) {
+ if (stop != NULL && __cursor_equals(start, stop))
+ break;
+ WT_RESTART_RETRY(__wt_btcur_next(start, 1), ret);
+ if (ret != 0)
+ break;
+ start->compare = 0; /* Exact match */
+ WT_RESTART_RETRY(rmfunc(session, start, 1), ret);
+ }
}
WT_RET_NOTFOUND_OK(ret);
@@ -994,34 +989,30 @@ __cursor_truncate_fix(WT_SESSION_IMPL *session,
* refresh the page's modification information.
*/
if (start == NULL) {
- do {
- WT_RET(__wt_btcur_remove(stop));
- for (;;) {
- if ((ret = __wt_btcur_prev(stop, 1)) != 0)
- break;
- stop->compare = 0; /* Exact match */
- value = (uint8_t *)stop->iface.value.data;
- if (*value != 0 &&
- (ret = rmfunc(session, stop, 1)) != 0)
- break;
- }
- } while (ret == WT_RESTART);
+ WT_RET(__wt_btcur_remove(stop));
+ while (ret == 0) {
+ WT_RESTART_RETRY(__wt_btcur_prev(stop, 1), ret);
+ if (ret != 0)
+ break;
+ stop->compare = 0; /* Exact match */
+ value = (uint8_t *)stop->iface.value.data;
+ if (*value != 0)
+ WT_RESTART_RETRY(rmfunc(session, stop, 1), ret);
+ }
} else {
- do {
- WT_RET(__wt_btcur_remove(start));
- for (;;) {
- if (stop != NULL &&
- __cursor_equals(start, stop))
- break;
- if ((ret = __wt_btcur_next(start, 1)) != 0)
- break;
- start->compare = 0; /* Exact match */
- value = (uint8_t *)start->iface.value.data;
- if (*value != 0 &&
- (ret = rmfunc(session, start, 1)) != 0)
- break;
- }
- } while (ret == WT_RESTART);
+ WT_RET(__wt_btcur_remove(start));
+ while (ret == 0) {
+ if (stop != NULL && __cursor_equals(start, stop))
+ break;
+ WT_RESTART_RETRY(__wt_btcur_next(start, 1), ret);
+ if (ret != 0)
+ break;
+ start->compare = 0; /* Exact match */
+ value = (uint8_t *)start->iface.value.data;
+ if (*value != 0)
+ WT_RESTART_RETRY(
+ rmfunc(session, start, 1), ret);
+ }
}
WT_RET_NOTFOUND_OK(ret);
diff --git a/src/include/api.h b/src/include/api.h
index e610b3b3e1b..81bc4f800af 100644
--- a/src/include/api.h
+++ b/src/include/api.h
@@ -127,3 +127,7 @@
#define ASYNCOP_API_CALL(conn, s, n) \
s = (conn)->default_session; \
API_CALL_NOCONF(s, asyncop, n, NULL, NULL)
+
+#define WT_RESTART_RETRY(call, ret) do { \
+ ret = (call); \
+} while (ret == WT_RESTART)