summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Cahill <michael.cahill@wiredtiger.com>2015-02-03 15:35:30 +1100
committerMichael Cahill <michael.cahill@wiredtiger.com>2015-02-03 15:35:30 +1100
commit6b2ed52a5cd0ce7a0e176d97bbf2a4633a5dd4ef (patch)
tree85cde86a270d510d5090761d57e825b5feb6edb4
parent367723d0d67ab2a0f56602c4990994e241d1a714 (diff)
downloadmongo-6b2ed52a5cd0ce7a0e176d97bbf2a4633a5dd4ef.tar.gz
Revert the structural change to truncate: just reset ret each time through the loop so we don't get stuck in an infinite loop due to WT_RESTART.
-rw-r--r--src/btree/bt_cursor.c89
-rw-r--r--src/include/api.h4
2 files changed, 49 insertions, 44 deletions
diff --git a/src/btree/bt_cursor.c b/src/btree/bt_cursor.c
index 984ae62d419..15a88bdd7bd 100644
--- a/src/btree/bt_cursor.c
+++ b/src/btree/bt_cursor.c
@@ -935,25 +935,30 @@ __cursor_truncate(WT_SESSION_IMPL *session,
* and we can proceed without concern.
*/
if (start == NULL) {
- while (ret == 0) {
+ do {
WT_RET(__wt_btcur_remove(stop));
- 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);
- }
+ 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);
} else {
- 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);
- }
+ do {
+ WT_RET(__wt_btcur_remove(start));
+ for (ret = 0;;) {
+ 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_NOTFOUND_OK(ret);
@@ -989,30 +994,34 @@ __cursor_truncate_fix(WT_SESSION_IMPL *session,
* refresh the page's modification information.
*/
if (start == NULL) {
- 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);
- }
+ 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);
} else {
- 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);
- }
+ do {
+ WT_RET(__wt_btcur_remove(start));
+ for (ret = 0;;) {
+ 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_NOTFOUND_OK(ret);
diff --git a/src/include/api.h b/src/include/api.h
index 81bc4f800af..e610b3b3e1b 100644
--- a/src/include/api.h
+++ b/src/include/api.h
@@ -127,7 +127,3 @@
#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)