[ovs-dev] [PATCH] Windows: Allow online compacting

Alin Serdean aserdean at cloudbasesolutions.com
Fri Aug 12 07:39:32 UTC 2016


This patch allows online compacting to be done under Windows.

To achieve the above we need to close all file handles before trying to
rename the file, switch from rename to MoveFileEx (because rename/MoveFile
fails if the destination exists), reopen the right type of log after the
rename.

Signed-off-by: Alin Gabriel Serdean <aserdean at cloudbasesolutions.com>
---
 ovsdb/file.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/ovsdb/file.c b/ovsdb/file.c
index 7f8554a..71e597b 100644
--- a/ovsdb/file.c
+++ b/ovsdb/file.c
@@ -667,28 +667,63 @@ ovsdb_file_compact(struct ovsdb_file *file)
         goto exit;
     }
 
+#ifdef _WIN32
+    /* On Windows we must close the file handles before trying to rename */
+    ovsdb_log_close(file->log);
+    ovsdb_log_close(new_log);
+#endif
+
     /* Replace original by temporary. */
+#ifdef _WIN32
+    if (!MoveFileEx(tmp_name, file->file_name, MOVEFILE_REPLACE_EXISTING
+                    | MOVEFILE_WRITE_THROUGH)) {
+        VLOG_ERR("fcntl: %s", ovs_lasterror_to_string());
+        error = ovsdb_io_error(EACCES, "failed to rename \"%s\" to \"%s\"",
+                               tmp_name, file->file_name);
+        goto exit;
+    }
+#else
     if (rename(tmp_name, file->file_name)) {
         error = ovsdb_io_error(errno, "failed to rename \"%s\" to \"%s\"",
                                tmp_name, file->file_name);
         goto exit;
     }
+#endif
     fsync_parent_dir(file->file_name);
 
 exit:
     if (!error) {
+#ifdef _WIN32
+        error = ovsdb_log_open(file->file_name, OVSDB_LOG_READ_WRITE, 0,
+                               &new_log);
+        if (error) {
+            goto cleanup;
+        }
+#else
         ovsdb_log_close(file->log);
+#endif
         file->log = new_log;
         file->last_compact = time_msec();
         file->next_compact = file->last_compact + COMPACT_MIN_MSEC;
         file->n_transactions = 1;
     } else {
+#ifdef _WIN32
+        error = ovsdb_log_open(file->file_name, OVSDB_LOG_READ_WRITE, 0,
+                               file->log);
+        if (error) {
+            goto cleanup;
+        }
+#else
         ovsdb_log_close(new_log);
+#endif
         if (tmp_lock) {
             unlink(tmp_name);
         }
     }
 
+#ifdef _WIN32
+cleanup:
+#endif
     lockfile_unlock(tmp_lock);
     free(tmp_name);
     free(comment);
-- 
2.9.2.windows.1



More information about the dev mailing list