diff options
-rw-r--r-- | src/third_party/wiredtiger/import.data | 2 | ||||
-rw-r--r-- | src/third_party/wiredtiger/src/cursor/cur_hs.c | 57 |
2 files changed, 56 insertions, 3 deletions
diff --git a/src/third_party/wiredtiger/import.data b/src/third_party/wiredtiger/import.data index c2bd5ba7947..cffddf09cb3 100644 --- a/src/third_party/wiredtiger/import.data +++ b/src/third_party/wiredtiger/import.data @@ -2,5 +2,5 @@ "vendor": "wiredtiger", "github": "wiredtiger/wiredtiger.git", "branch": "mongodb-5.0", - "commit": "f08adbc5b4ced8ea39decd4da4efd40cdce768ec" + "commit": "03e6f10ef2c6bc8acd7ee747d3aeda9db9efca1a" } diff --git a/src/third_party/wiredtiger/src/cursor/cur_hs.c b/src/third_party/wiredtiger/src/cursor/cur_hs.c index 923b9941d0e..fa89e6bd0f9 100644 --- a/src/third_party/wiredtiger/src/cursor/cur_hs.c +++ b/src/third_party/wiredtiger/src/cursor/cur_hs.c @@ -645,16 +645,69 @@ __curhs_insert(WT_CURSOR *cursor) hs_tombstone = NULL; } +retry: /* Search the page and insert the updates. */ WT_WITH_PAGE_INDEX(session, ret = __wt_hs_row_search(cbt, &file_cursor->key, true)); WT_ERR(ret); - WT_ERR(__wt_hs_modify(cbt, hs_upd)); + ret = __wt_hs_modify(cbt, hs_upd); + if (ret == WT_RESTART) + goto retry; + WT_ERR(ret); if (0) { err: __wt_free(session, hs_tombstone); __wt_free(session, hs_upd); } + + API_END_RET(session, ret); +} + +/* + * __curhs_remove -- + * WT_CURSOR->remove method for the hs cursor type. + */ +static int +__curhs_remove(WT_CURSOR *cursor) +{ + WT_CURSOR *file_cursor; + WT_CURSOR_BTREE *cbt; + WT_CURSOR_HS *hs_cursor; + WT_DECL_RET; + WT_SESSION_IMPL *session; + WT_UPDATE *hs_tombstone; + + hs_cursor = (WT_CURSOR_HS *)cursor; + file_cursor = hs_cursor->file_cursor; + cbt = (WT_CURSOR_BTREE *)file_cursor; + hs_tombstone = NULL; + + CURSOR_API_CALL_PREPARE_ALLOWED(cursor, session, insert, CUR2BT(file_cursor)); + + /* Remove must be called with cursor positioned. */ + WT_ASSERT(session, F_ISSET(file_cursor, WT_CURSTD_KEY_INT)); + + /* + * Since we're using internal functions to modify the row structure, we need to manually set the + * comparison to an exact match. + */ + cbt->compare = 0; + /* Add a tombstone with WT_TXN_NONE transaction id and WT_TS_NONE timestamps. */ + WT_ERR(__wt_upd_alloc_tombstone(session, &hs_tombstone, NULL)); + hs_tombstone->txnid = WT_TXN_NONE; + hs_tombstone->start_ts = hs_tombstone->durable_ts = WT_TS_NONE; + while ((ret = __wt_hs_modify(cbt, hs_tombstone)) == WT_RESTART) { + WT_WITH_PAGE_INDEX(session, ret = __wt_hs_row_search(cbt, &file_cursor->key, false)); + WT_ERR(ret); + } + + WT_ERR(ret); + + if (0) { +err: + __wt_free(session, hs_tombstone); + } + API_END_RET(session, ret); } @@ -679,7 +732,7 @@ __wt_curhs_open(WT_SESSION_IMPL *session, WT_CURSOR *owner, WT_CURSOR **cursorp) __curhs_insert, /* insert */ __wt_cursor_modify_value_format_notsup, /* modify */ __wt_cursor_notsup, /* update */ - __wt_cursor_notsup, /* remove */ + __curhs_remove, /* remove */ __wt_cursor_notsup, /* reserve */ __wt_cursor_reconfigure_notsup, /* reconfigure */ __wt_cursor_notsup, /* cache */ |