summaryrefslogtreecommitdiff
path: root/src/third_party/wiredtiger/src/conn/conn_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/third_party/wiredtiger/src/conn/conn_log.c')
-rw-r--r--src/third_party/wiredtiger/src/conn/conn_log.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/src/third_party/wiredtiger/src/conn/conn_log.c b/src/third_party/wiredtiger/src/conn/conn_log.c
index 9097e10ef5a..6e27d0f98d6 100644
--- a/src/third_party/wiredtiger/src/conn/conn_log.c
+++ b/src/third_party/wiredtiger/src/conn/conn_log.c
@@ -870,7 +870,7 @@ __log_server(void *arg)
WT_DECL_RET;
WT_LOG *log;
WT_SESSION_IMPL *session;
- uint64_t time_start, time_stop, timediff;
+ uint64_t retry, time_start, time_stop, timediff;
bool did_work, signalled;
session = arg;
@@ -896,6 +896,7 @@ __log_server(void *arg)
* takes to sync out an earlier file.
*/
did_work = true;
+ retry = 0;
while (F_ISSET(conn, WT_CONN_SERVER_LOG)) {
/*
* Slots depend on future activity. Force out buffered
@@ -940,7 +941,24 @@ __log_server(void *arg)
ret = __log_archive_once(session, 0);
__wt_writeunlock(
session, &log->log_archive_lock);
- WT_ERR(ret);
+ /*
+ * It is possible that an external
+ * process on some systems may prevent
+ * removal. If we get a permission
+ * error, retry a few times.
+ */
+ if (ret == EACCES &&
+ retry < WT_RETRY_MAX) {
+ retry++;
+ ret = 0;
+ } else {
+ /*
+ * Return the error if there is
+ * one or reset on success.
+ */
+ WT_ERR(ret);
+ retry = 0;
+ }
} else
__wt_verbose(session, WT_VERB_LOG, "%s",
"log_archive: Blocked due to open "