]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
ctl: allow empty zone transaction commit doing nothing
authorDaniel Salzman <daniel.salzman@nic.cz>
Thu, 26 Jul 2018 14:28:47 +0000 (16:28 +0200)
committerDaniel Salzman <daniel.salzman@nic.cz>
Thu, 26 Jul 2018 14:29:00 +0000 (16:29 +0200)
src/knot/ctl/commands.c

index 8164c6be32eb913da55ea719c7bfcb21662c0de2..955ff816e6749ef2e8c38219393cbb420429deb1 100644 (file)
@@ -417,6 +417,15 @@ static int zone_txn_begin(zone_t *zone, ctl_args_t *args)
        return KNOT_EOK;
 }
 
+static void zone_txn_update_clear(zone_t *zone)
+{
+       assert(zone->control_update);
+
+       zone_update_clear(zone->control_update);
+       free(zone->control_update);
+       zone->control_update = NULL;
+}
+
 static int zone_txn_commit(zone_t *zone, ctl_args_t *args)
 {
        UNUSED(args);
@@ -425,6 +434,15 @@ static int zone_txn_commit(zone_t *zone, ctl_args_t *args)
                return KNOT_TXN_ENOTEXISTS;
        }
 
+       // NOOP if empty changeset/contents.
+       if (((zone->control_update->flags & UPDATE_INCREMENTAL) &&
+            changeset_empty(&zone->control_update->change)) ||
+           ((zone->control_update->flags & UPDATE_FULL) &&
+            zone_contents_is_empty(zone->control_update->new_cont))) {
+               zone_txn_update_clear(zone);
+               return KNOT_EOK;
+       }
+
        // Sign update.
        conf_val_t val = conf_zone_get(conf(), C_DNSSEC_SIGNING, zone->name);
        bool dnssec_enable = (zone->control_update->flags & UPDATE_SIGN) && conf_bool(&val);
@@ -432,9 +450,7 @@ static int zone_txn_commit(zone_t *zone, ctl_args_t *args)
                zone_sign_reschedule_t resch = { 0 };
                int ret = knot_dnssec_sign_update(zone->control_update, &resch);
                if (ret != KNOT_EOK) {
-                       zone_update_clear(zone->control_update);
-                       free(zone->control_update);
-                       zone->control_update = NULL;
+                       zone_txn_update_clear(zone);
                        return ret;
                }
                log_dnssec_next(zone->name, (time_t)resch.next_sign);
@@ -451,9 +467,7 @@ static int zone_txn_commit(zone_t *zone, ctl_args_t *args)
                return ret;
        }
 
-       zone_update_clear(zone->control_update);
-       free(zone->control_update);
-       zone->control_update = NULL;
+       zone_txn_update_clear(zone);
 
        zone_events_schedule_now(zone, ZONE_EVENT_NOTIFY);
 
@@ -468,9 +482,7 @@ static int zone_txn_abort(zone_t *zone, ctl_args_t *args)
                return KNOT_TXN_ENOTEXISTS;
        }
 
-       zone_update_clear(zone->control_update);
-       free(zone->control_update);
-       zone->control_update = NULL;
+       zone_txn_update_clear(zone);
 
        return KNOT_EOK;
 }