From 46e982f866d4cb1d187dd6e2075804152e178acc Mon Sep 17 00:00:00 2001
From: Libor Peltan <libor.peltan@nic.cz>
Date: Wed, 26 Apr 2017 18:06:14 +0200
Subject: [PATCH] zone/bugfix: replanning zonefile flush even when was not
 flushed

---
 src/knot/zone/zone.c | 25 ++++++++++++++++---------
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/src/knot/zone/zone.c b/src/knot/zone/zone.c
index 3897535b5e..bb65eb970f 100644
--- a/src/knot/zone/zone.c
+++ b/src/knot/zone/zone.c
@@ -78,14 +78,18 @@ static int flush_journal(conf_t *conf, zone_t *zone, bool allow_empty_zone)
 
 	assert(zone);
 
+	int ret = KNOT_EOK;
+
 	bool force = zone->flags & ZONE_FORCE_FLUSH;
 	zone->flags &= ~ZONE_FORCE_FLUSH;
 
 	if (zone_contents_is_empty(zone->contents)) {
 		if (allow_empty_zone && zone->journal && journal_exists(zone->journal_db, zone->name)) {
-			return journal_flush(zone->journal);
+			ret = journal_flush(zone->journal);
+		} else {
+			ret = KNOT_EINVAL;
 		}
-		return KNOT_EINVAL;
+		goto flush_journal_replan;
 	}
 
 	/* Check for disabled zonefile synchronization. */
@@ -98,18 +102,19 @@ static int flush_journal(conf_t *conf, zone_t *zone, bool allow_empty_zone)
 	zone_contents_t *contents = zone->contents;
 	uint32_t serial_to = zone_contents_serial(contents);
 	if (!force && zone->zonefile.exists && zone->zonefile.serial == serial_to) {
-		return KNOT_EOK; /* No differences. */
+		ret = KNOT_EOK; /* No differences. */
+		goto flush_journal_replan;
 	}
 
 	char *zonefile = conf_zonefile(conf, zone->name);
 
 	/* Synchronize journal. */
-	int ret = zonefile_write(zonefile, contents);
+	ret = zonefile_write(zonefile, contents);
 	if (ret != KNOT_EOK) {
 		log_zone_warning(zone->name, "failed to update zone file (%s)",
 		                 knot_strerror(ret));
 		free(zonefile);
-		return ret;
+		goto flush_journal_replan;
 	}
 
 	if (zone->zonefile.exists) {
@@ -126,7 +131,8 @@ static int flush_journal(conf_t *conf, zone_t *zone, bool allow_empty_zone)
 		log_zone_warning(zone->name, "failed to update zone file (%s)",
 		                 knot_strerror(knot_map_errno()));
 		free(zonefile);
-		return KNOT_EACCES;
+		ret = KNOT_EACCES;
+		goto flush_journal_replan;
 	}
 
 	free(zonefile);
@@ -140,18 +146,19 @@ static int flush_journal(conf_t *conf, zone_t *zone, bool allow_empty_zone)
 	if (zone->journal && journal_exists(zone->journal_db, zone->name)) {
 		ret = open_journal(zone);
 		if (ret != KNOT_EOK) {
-			return ret;
+			goto flush_journal_replan;
 		}
 
 		ret = journal_flush(zone->journal);
 		if (ret != KNOT_EOK) {
-			return ret;
+			goto flush_journal_replan;
 		}
 	}
 
 	/* Trim extra heap. */
 	mem_trim();
 
+flush_journal_replan:
 	/* Plan next journal flush after proper period. */
 	zone->timers.last_flush = time(NULL);
 	val = conf_zone_get(conf, C_ZONEFILE_SYNC, zone->name);
@@ -162,7 +169,7 @@ static int flush_journal(conf_t *conf, zone_t *zone, bool allow_empty_zone)
 		                              ZONE_EVENT_FLUSH, next_flush);
 	}
 
-	return KNOT_EOK;
+	return ret;
 }
 
 zone_t* zone_new(const knot_dname_t *name)
-- 
GitLab