diff options
author | Michael Cahill <michael.cahill@wiredtiger.com> | 2015-02-03 14:49:08 +1100 |
---|---|---|
committer | Michael Cahill <michael.cahill@wiredtiger.com> | 2015-02-03 14:49:08 +1100 |
commit | 367723d0d67ab2a0f56602c4990994e241d1a714 (patch) | |
tree | a5820fa57005cd78e745aa1a552fccd8b8976d64 | |
parent | b4fe7dc9758cc029dd573a89a702dfc8e07ab7d6 (diff) | |
download | mongo-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.c | 89 | ||||
-rw-r--r-- | src/include/api.h | 4 |
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) |