diff options
Diffstat (limited to 'ovsdb')
-rw-r--r-- | ovsdb/storage.c | 17 | ||||
-rw-r--r-- | ovsdb/storage.h | 2 |
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) |