summaryrefslogtreecommitdiff
path: root/ovsdb
diff options
context:
space:
mode:
Diffstat (limited to 'ovsdb')
-rw-r--r--ovsdb/storage.c17
-rw-r--r--ovsdb/storage.h2
2 files changed, 16 insertions, 3 deletions
diff --git a/ovsdb/storage.c b/ovsdb/storage.c
index 9e32efe58..d4984be25 100644
--- a/ovsdb/storage.c
+++ b/ovsdb/storage.c
@@ -507,7 +507,11 @@ schedule_next_snapshot(struct ovsdb_storage *storage, bool quick)
long long int now = time_msec();
storage->next_snapshot_min = now + base + random_range(range);
- storage->next_snapshot_max = now + 60LL * 60 * 24 * 1000; /* 1 day */
+ if (!quick) {
+ long long int one_day = 60LL * 60 * 24 * 1000;
+
+ storage->next_snapshot_max = now + one_day;
+ }
} else {
storage->next_snapshot_min = LLONG_MAX;
storage->next_snapshot_max = LLONG_MAX;
@@ -515,7 +519,7 @@ schedule_next_snapshot(struct ovsdb_storage *storage, bool quick)
}
bool
-ovsdb_storage_should_snapshot(const struct ovsdb_storage *storage)
+ovsdb_storage_should_snapshot(struct ovsdb_storage *storage)
{
if (storage->raft || storage->log) {
/* If we haven't reached the minimum snapshot time, don't snapshot. */
@@ -544,6 +548,15 @@ ovsdb_storage_should_snapshot(const struct ovsdb_storage *storage)
}
if (!snapshot_recommended) {
+ if (storage->raft) {
+ /* Re-scheduling with a quick retry in order to avoid condition
+ * where all the raft servers passed the minimal time already,
+ * but the log didn't grow a lot, so they are all checking on
+ * every iteration. This will randomize the time of the next
+ * attempt, so all the servers will not start snapshotting at
+ * the same time when the log reaches a critical size. */
+ schedule_next_snapshot(storage, true);
+ }
return false;
}
diff --git a/ovsdb/storage.h b/ovsdb/storage.h
index e120094d7..ff026b77f 100644
--- a/ovsdb/storage.h
+++ b/ovsdb/storage.h
@@ -76,7 +76,7 @@ uint64_t ovsdb_write_get_commit_index(const struct ovsdb_write *);
void ovsdb_write_wait(const struct ovsdb_write *);
void ovsdb_write_destroy(struct ovsdb_write *);
-bool ovsdb_storage_should_snapshot(const struct ovsdb_storage *);
+bool ovsdb_storage_should_snapshot(struct ovsdb_storage *);
struct ovsdb_error *ovsdb_storage_store_snapshot(struct ovsdb_storage *storage,
const struct json *schema,
const struct json *snapshot)