Lines Matching refs:update

37 static int init_incremental(zone_update_t *update, zone_t *zone, zone_contents_t *old_contents)  in init_incremental()  argument
43 int ret = changeset_init(&update->change, zone->name); in init_incremental()
48 if (update->flags & UPDATE_HYBRID) { in init_incremental()
49 update->new_cont = old_contents; in init_incremental()
51 ret = zone_contents_cow(old_contents, &update->new_cont); in init_incremental()
53 changeset_clear(&update->change); in init_incremental()
58 uint32_t apply_flags = (update->flags & UPDATE_STRICT) ? APPLY_STRICT : 0; in init_incremental()
59 apply_flags |= (update->flags & UPDATE_HYBRID) ? APPLY_UNIFY_FULL : 0; in init_incremental()
60 ret = apply_init_ctx(update->a_ctx, update->new_cont, apply_flags); in init_incremental()
62 changeset_clear(&update->change); in init_incremental()
67 update->change.soa_from = in init_incremental()
69 if (update->change.soa_from == NULL) { in init_incremental()
70 zone_contents_free(update->new_cont); in init_incremental()
71 changeset_clear(&update->change); in init_incremental()
78 static int init_full(zone_update_t *update, zone_t *zone) in init_full() argument
80 update->new_cont = zone_contents_new(zone->name, true); in init_full()
81 if (update->new_cont == NULL) { in init_full()
85 int ret = apply_init_ctx(update->a_ctx, update->new_cont, APPLY_UNIFY_FULL); in init_full()
87 zone_contents_free(update->new_cont); in init_full()
116 static int init_base(zone_update_t *update, zone_t *zone, zone_contents_t *old_contents, in init_base() argument
119 if (update == NULL || zone == NULL) { in init_base()
123 memset(update, 0, sizeof(*update)); in init_base()
124 update->zone = zone; in init_base()
125 update->flags = flags; in init_base()
127 update->a_ctx = calloc(1, sizeof(*update->a_ctx)); in init_base()
128 if (update->a_ctx == NULL) { in init_base()
132 if (zone->control_update != NULL && zone->control_update != update) { in init_base()
137 update->a_ctx->cow_mutex = &zone->cow_lock; in init_base()
145 ret = init_incremental(update, zone, old_contents); in init_base()
147 ret = init_full(update, zone); in init_base()
151 free(update->a_ctx); in init_base()
159 int zone_update_init(zone_update_t *update, zone_t *zone, zone_update_flags_t flags) in zone_update_init() argument
161 return init_base(update, zone, NULL, flags); in zone_update_init()
164 int zone_update_from_differences(zone_update_t *update, zone_t *zone, zone_contents_t *old_cont, in zone_update_from_differences() argument
167 if (update == NULL || zone == NULL || new_cont == NULL || in zone_update_from_differences()
178 ret = init_base(update, zone, old_cont, flags); in zone_update_from_differences()
195 additionals_tree_free(update->new_cont->adds_tree); in zone_update_from_differences()
196 update->new_cont->adds_tree = NULL; in zone_update_from_differences()
197 update->new_cont = NULL; // Prevent deep_free as old_cont will be used later. in zone_update_from_differences()
198 update->a_ctx->flags &= ~APPLY_UNIFY_FULL; // Prevent Unify of old_cont that will be used later. in zone_update_from_differences()
202 zone_update_clear(update); in zone_update_from_differences()
206 ret = zone_update_apply_changeset(update, &diff); in zone_update_from_differences()
209 zone_update_clear(update); in zone_update_from_differences()
213 update->init_cont = new_cont; in zone_update_from_differences()
217 int zone_update_from_contents(zone_update_t *update, zone_t *zone_without_contents, in zone_update_from_contents() argument
220 if (update == NULL || zone_without_contents == NULL || new_cont == NULL) { in zone_update_from_contents()
224 memset(update, 0, sizeof(*update)); in zone_update_from_contents()
225 update->zone = zone_without_contents; in zone_update_from_contents()
226 update->flags = flags; in zone_update_from_contents()
227 update->new_cont = new_cont; in zone_update_from_contents()
229 update->a_ctx = calloc(1, sizeof(*update->a_ctx)); in zone_update_from_contents()
230 if (update->a_ctx == NULL) { in zone_update_from_contents()
239 knot_sem_wait(&update->zone->cow_lock); in zone_update_from_contents()
240 update->a_ctx->cow_mutex = &update->zone->cow_lock; in zone_update_from_contents()
243 int ret = changeset_init(&update->change, zone_without_contents->name); in zone_update_from_contents()
245 free(update->a_ctx); in zone_update_from_contents()
246 update->a_ctx = NULL; in zone_update_from_contents()
247 knot_sem_post(&update->zone->cow_lock); in zone_update_from_contents()
251 update->change.soa_from = node_create_rrset(new_cont->apex, KNOT_RRTYPE_SOA); in zone_update_from_contents()
252 if (update->change.soa_from == NULL) { in zone_update_from_contents()
253 changeset_clear(&update->change); in zone_update_from_contents()
254 free(update->a_ctx); in zone_update_from_contents()
255 update->a_ctx = NULL; in zone_update_from_contents()
256 knot_sem_post(&update->zone->cow_lock); in zone_update_from_contents()
261 uint32_t apply_flags = (update->flags & UPDATE_STRICT) ? APPLY_STRICT : 0; in zone_update_from_contents()
262 int ret = apply_init_ctx(update->a_ctx, update->new_cont, apply_flags | APPLY_UNIFY_FULL); in zone_update_from_contents()
264 changeset_clear(&update->change); in zone_update_from_contents()
265 free(update->a_ctx); in zone_update_from_contents()
266 update->a_ctx = NULL; in zone_update_from_contents()
267 knot_sem_post(&update->zone->cow_lock); in zone_update_from_contents()
274 int zone_update_start_extra(zone_update_t *update, conf_t *conf) in zone_update_start_extra() argument
276 assert((update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID))); in zone_update_start_extra()
278 int ret = changeset_init(&update->extra_ch, update->new_cont->apex->owner); in zone_update_start_extra()
283 if (update->init_cont != NULL) { in zone_update_start_extra()
284 ret = zone_update_increment_soa(update, conf); in zone_update_start_extra()
289 ret = zone_contents_diff(update->init_cont, update->new_cont, &update->extra_ch, false); in zone_update_start_extra()
294 update->extra_ch.soa_from = node_create_rrset(update->new_cont->apex, KNOT_RRTYPE_SOA); in zone_update_start_extra()
295 if (update->extra_ch.soa_from == NULL) { in zone_update_start_extra()
299 ret = zone_update_increment_soa(update, conf); in zone_update_start_extra()
304 update->extra_ch.soa_to = node_create_rrset(update->new_cont->apex, KNOT_RRTYPE_SOA); in zone_update_start_extra()
305 if (update->extra_ch.soa_to == NULL) { in zone_update_start_extra()
310 update->flags |= UPDATE_EXTRA_CHSET; in zone_update_start_extra()
314 const zone_node_t *zone_update_get_node(zone_update_t *update, const knot_dname_t *dname) in zone_update_get_node() argument
316 if (update == NULL || dname == NULL) { in zone_update_get_node()
320 return zone_contents_node_or_nsec3(update->new_cont, dname); in zone_update_get_node()
323 uint32_t zone_update_current_serial(zone_update_t *update) in zone_update_current_serial() argument
325 const zone_node_t *apex = update->new_cont->apex; in zone_update_current_serial()
333 bool zone_update_changed_nsec3param(const zone_update_t *update) in zone_update_changed_nsec3param() argument
335 if (update->zone->contents == NULL) { in zone_update_changed_nsec3param()
339 dnssec_nsec3_params_t *orig = &update->zone->contents->nsec3_params; in zone_update_changed_nsec3param()
340 dnssec_nsec3_params_t *upd = &update->new_cont->nsec3_params; in zone_update_changed_nsec3param()
344 const knot_rdataset_t *zone_update_from(zone_update_t *update) in zone_update_from() argument
346 if (update == NULL) { in zone_update_from()
350 if (update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) { in zone_update_from()
351 const zone_node_t *apex = update->zone->contents->apex; in zone_update_from()
358 const knot_rdataset_t *zone_update_to(zone_update_t *update) in zone_update_to() argument
360 if (update == NULL) { in zone_update_to()
364 if (update->flags & UPDATE_FULL) { in zone_update_to()
365 const zone_node_t *apex = update->new_cont->apex; in zone_update_to()
368 if (update->change.soa_to == NULL) { in zone_update_to()
371 return &update->change.soa_to->rrs; in zone_update_to()
377 void zone_update_clear(zone_update_t *update) in zone_update_clear() argument
379 if (update == NULL || update->zone == NULL) { in zone_update_clear()
383 if (update->new_cont != NULL) { in zone_update_clear()
384 additionals_tree_free(update->new_cont->adds_tree); in zone_update_clear()
385 update->new_cont->adds_tree = NULL; in zone_update_clear()
388 if (update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) { in zone_update_clear()
389 changeset_clear(&update->change); in zone_update_clear()
390 changeset_clear(&update->extra_ch); in zone_update_clear()
393 zone_contents_deep_free(update->init_cont); in zone_update_clear()
395 if (update->flags & (UPDATE_FULL | UPDATE_HYBRID)) { in zone_update_clear()
396 apply_cleanup(update->a_ctx); in zone_update_clear()
397 zone_contents_deep_free(update->new_cont); in zone_update_clear()
399 apply_rollback(update->a_ctx); in zone_update_clear()
402 free(update->a_ctx); in zone_update_clear()
403 memset(update, 0, sizeof(*update)); in zone_update_clear()
406 inline static void update_affected_rrtype(zone_update_t *update, uint16_t rrtype) in update_affected_rrtype() argument
411 update->flags |= UPDATE_CHANGED_NSEC; in update_affected_rrtype()
416 static int solve_add_different_ttl(zone_update_t *update, const knot_rrset_t *add) in solve_add_different_ttl() argument
422 const zone_node_t *exist_node = zone_contents_find_node(update->new_cont, add->owner); in solve_add_different_ttl()
435 log_zone_notice(update->zone->name, "TTL mismatch, owner %s, type %s, " in solve_add_different_ttl()
442 int ret = zone_update_remove(update, exist_copy); in solve_add_different_ttl()
445 ret = zone_update_add(update, exist_copy); in solve_add_different_ttl()
451 int zone_update_add(zone_update_t *update, const knot_rrset_t *rrset) in zone_update_add() argument
453 if (update == NULL || rrset == NULL) { in zone_update_add()
460 if (update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) { in zone_update_add()
461 int ret = solve_add_different_ttl(update, rrset); in zone_update_add()
463 ret = changeset_add_addition(&update->change, rrset, CHANGESET_CHECK); in zone_update_add()
465 if (ret == KNOT_EOK && (update->flags & UPDATE_EXTRA_CHSET)) { in zone_update_add()
466 ret = changeset_add_addition(&update->extra_ch, rrset, CHANGESET_CHECK); in zone_update_add()
473 if (update->flags & UPDATE_INCREMENTAL) { in zone_update_add()
476 int ret = apply_replace_soa(update->a_ctx, rrset); in zone_update_add()
478 changeset_remove_addition(&update->change, rrset); in zone_update_add()
483 int ret = apply_add_rr(update->a_ctx, rrset); in zone_update_add()
485 changeset_remove_addition(&update->change, rrset); in zone_update_add()
489 update_affected_rrtype(update, rrset->type); in zone_update_add()
491 } else if (update->flags & (UPDATE_FULL | UPDATE_HYBRID)) { in zone_update_add()
494 return replace_soa(update->new_cont, rrset); in zone_update_add()
498 int ret = zone_contents_add_rr(update->new_cont, rrset, &n); in zone_update_add()
507 log_zone_notice(update->new_cont->apex->owner, in zone_update_add()
519 int zone_update_remove(zone_update_t *update, const knot_rrset_t *rrset) in zone_update_remove() argument
521 if (update == NULL || rrset == NULL) { in zone_update_remove()
528 if ((update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) && rrset->type != KNOT_RRTYPE_SOA) { in zone_update_remove()
529 int ret = changeset_add_removal(&update->change, rrset, CHANGESET_CHECK); in zone_update_remove()
530 if (ret == KNOT_EOK && (update->flags & UPDATE_EXTRA_CHSET)) { in zone_update_remove()
531 ret = changeset_add_removal(&update->extra_ch, rrset, CHANGESET_CHECK); in zone_update_remove()
538 if (update->flags & UPDATE_INCREMENTAL) { in zone_update_remove()
544 int ret = apply_remove_rr(update->a_ctx, rrset); in zone_update_remove()
546 changeset_remove_removal(&update->change, rrset); in zone_update_remove()
550 update_affected_rrtype(update, rrset->type); in zone_update_remove()
552 } else if (update->flags & (UPDATE_FULL | UPDATE_HYBRID)) { in zone_update_remove()
554 return zone_contents_remove_rr(update->new_cont, rrset, &n); in zone_update_remove()
560 int zone_update_remove_rrset(zone_update_t *update, knot_dname_t *owner, uint16_t type) in zone_update_remove_rrset() argument
562 if (update == NULL || owner == NULL) { in zone_update_remove_rrset()
566 const zone_node_t *node = zone_contents_node_or_nsec3(update->new_cont, owner); in zone_update_remove_rrset()
576 return zone_update_remove(update, &rrset); in zone_update_remove_rrset()
579 int zone_update_remove_node(zone_update_t *update, const knot_dname_t *owner) in zone_update_remove_node() argument
581 if (update == NULL || owner == NULL) { in zone_update_remove_node()
585 const zone_node_t *node = zone_contents_node_or_nsec3(update->new_cont, owner); in zone_update_remove_node()
593 int ret = zone_update_remove(update, &rrset); in zone_update_remove_node()
604 zone_update_t *update = ctx; in update_chset_step() local
606 return zone_update_add(update, rrset); in update_chset_step()
608 return zone_update_remove(update, rrset); in update_chset_step()
612 int zone_update_apply_changeset(zone_update_t *update, const changeset_t *changes) in zone_update_apply_changeset() argument
614 return changeset_walk(changes, update_chset_step, update); in zone_update_apply_changeset()
617 int zone_update_apply_changeset_reverse(zone_update_t *update, const changeset_t *changes) in zone_update_apply_changeset_reverse() argument
624 return zone_update_apply_changeset(update, &reverse); in zone_update_apply_changeset_reverse()
627 static int set_new_soa(zone_update_t *update, unsigned serial_policy) in set_new_soa() argument
629 assert(update); in set_new_soa()
631 knot_rrset_t *soa_cpy = node_create_rrset(update->new_cont->apex, in set_new_soa()
637 int ret = zone_update_remove(update, soa_cpy); in set_new_soa()
646 log_zone_warning(update->zone->name, "updated SOA serial is lower " in set_new_soa()
653 ret = zone_update_add(update, soa_cpy); in set_new_soa()
660 int zone_update_increment_soa(zone_update_t *update, conf_t *conf) in zone_update_increment_soa() argument
662 if (update == NULL || conf == NULL) { in zone_update_increment_soa()
666 conf_val_t val = conf_zone_get(conf, C_SERIAL_POLICY, update->zone->name); in zone_update_increment_soa()
667 return set_new_soa(update, conf_opt(&val)); in zone_update_increment_soa()
670 static int commit_journal(conf_t *conf, zone_update_t *update) in commit_journal() argument
672 conf_val_t val = conf_zone_get(conf, C_JOURNAL_CONTENT, update->zone->name); in commit_journal()
675 if ((update->flags & UPDATE_INCREMENTAL) || in commit_journal()
676 (update->flags & UPDATE_HYBRID)) { in commit_journal()
677 changeset_t *extra = (update->flags & UPDATE_EXTRA_CHSET) ? &update->extra_ch : NULL; in commit_journal()
678 if (content != JOURNAL_CONTENT_NONE && !changeset_empty(&update->change)) { in commit_journal()
679 ret = zone_change_store(conf, update->zone, &update->change, extra); in commit_journal()
683 return zone_in_journal_store(conf, update->zone, update->new_cont); in commit_journal()
685 return zone_changes_clear(conf, update->zone); in commit_journal()
691 static int commit_incremental(conf_t *conf, zone_update_t *update) in commit_incremental() argument
693 assert(update); in commit_incremental()
695 if (zone_update_to(update) == NULL && !changeset_empty(&update->change)) { in commit_incremental()
697 int ret = zone_update_increment_soa(update, conf); in commit_incremental()
706 static int commit_full(conf_t *conf, zone_update_t *update) in commit_full() argument
708 assert(update); in commit_full()
713 if (!node_rrtype_exists(update->new_cont->apex, KNOT_RRTYPE_SOA)) { in commit_full()
720 static int update_catalog(conf_t *conf, zone_update_t *update) in update_catalog() argument
722 conf_val_t val = conf_zone_get(conf, C_CATALOG_TPL, update->zone->name); in update_catalog()
727 zone_set_flag(update->zone, ZONE_IS_CATALOG); in update_catalog()
729 int ret = catalog_zone_verify(update->new_cont); in update_catalog()
735 if ((update->flags & UPDATE_INCREMENTAL)) { in update_catalog()
736 ret = catalog_update_from_zone(update->zone->catalog_upd, in update_catalog()
737 update->change.remove, update->new_cont, in update_catalog()
738 true, update->zone->catalog, &upd_count); in update_catalog()
740 ret = catalog_update_from_zone(update->zone->catalog_upd, in update_catalog()
741 update->change.add, update->new_cont, in update_catalog()
745 ret = catalog_update_del_all(update->zone->catalog_upd, in update_catalog()
746 update->zone->catalog, in update_catalog()
747 update->zone->name, &upd_count); in update_catalog()
749 ret = catalog_update_from_zone(update->zone->catalog_upd, in update_catalog()
750 update->new_cont, update->new_cont, in update_catalog()
756 log_zone_info(update->zone->name, "catalog reloaded, %zd updates", upd_count); in update_catalog()
762 (void)catalog_update_del_all(update->zone->catalog_upd, in update_catalog()
763 update->zone->catalog, in update_catalog()
764 update->zone->name, &upd_count); in update_catalog()
820 static void discard_adds_tree(zone_update_t *update) in discard_adds_tree() argument
822 additionals_tree_free(update->new_cont->adds_tree); in discard_adds_tree()
823 update->new_cont->adds_tree = NULL; in discard_adds_tree()
826 int zone_update_semcheck(zone_update_t *update) in zone_update_semcheck() argument
828 if (update == NULL) { in zone_update_semcheck()
832 zone_tree_t *node_ptrs = (update->flags & UPDATE_INCREMENTAL) ? in zone_update_semcheck()
833 update->a_ctx->node_ptrs : NULL; in zone_update_semcheck()
836 int ret = zone_adjust_contents(update->new_cont, adjust_cb_flags, NULL, in zone_update_semcheck()
846 ret = sem_checks_process(update->new_cont, SEMCHECK_MANDATORY_ONLY, in zone_update_semcheck()
856 int zone_update_verify_digest(conf_t *conf, zone_update_t *update) in zone_update_verify_digest() argument
858 conf_val_t val = conf_zone_get(conf, C_ZONEMD_VERIFY, update->zone->name); in zone_update_verify_digest()
863 int ret = zone_contents_digest_verify(update->new_cont); in zone_update_verify_digest()
865 log_zone_error(update->zone->name, "ZONEMD, verification failed (%s)", in zone_update_verify_digest()
868 log_zone_info(update->zone->name, "ZONEMD, verification successful"); in zone_update_verify_digest()
874 int zone_update_commit(conf_t *conf, zone_update_t *update) in zone_update_commit() argument
876 if (conf == NULL || update == NULL) { in zone_update_commit()
882 if ((update->flags & UPDATE_INCREMENTAL) && changeset_empty(&update->change)) { in zone_update_commit()
883 zone_update_clear(update); in zone_update_commit()
887 if (update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) { in zone_update_commit()
888 ret = commit_incremental(conf, update); in zone_update_commit()
890 ret = commit_full(conf, update); in zone_update_commit()
896 conf_val_t val = conf_zone_get(conf, C_DNSSEC_SIGNING, update->zone->name); in zone_update_commit()
899 conf_val_t thr = conf_zone_get(conf, C_ADJUST_THR, update->zone->name); in zone_update_commit()
900 if ((update->flags & (UPDATE_HYBRID | UPDATE_FULL))) { in zone_update_commit()
901 ret = zone_adjust_full(update->new_cont, conf_int(&thr)); in zone_update_commit()
903 ret = zone_adjust_incremental_update(update, conf_int(&thr)); in zone_update_commit()
906 discard_adds_tree(update); in zone_update_commit()
911 val = conf_zone_get(conf, C_ZONE_MAX_SIZE, update->zone->name); in zone_update_commit()
914 if (update->new_cont->size > size_limit) { in zone_update_commit()
915 discard_adds_tree(update); in zone_update_commit()
919 val = conf_zone_get(conf, C_DNSSEC_VALIDATION, update->zone->name); in zone_update_commit()
921 bool incr_valid = update->flags & UPDATE_INCREMENTAL; in zone_update_commit()
924 ret = knot_dnssec_validate_zone(update, conf, incr_valid); in zone_update_commit()
926 log_zone_error(update->zone->name, "DNSSEC, %svalidation failed (%s)", in zone_update_commit()
929 if (knot_dname_to_str(name_str, update->validation_hint.node, sizeof(name_str)) != NULL && in zone_update_commit()
930 knot_rrtype_to_string(update->validation_hint.rrtype, type_str, sizeof(type_str)) >= 0) { in zone_update_commit()
931 log_zone_error(update->zone->name, "DNSSEC, validation hint: %s %s", in zone_update_commit()
934 discard_adds_tree(update); in zone_update_commit()
937 log_zone_info(update->zone->name, "DNSSEC, %svalidation successful", msg_valid); in zone_update_commit()
941 ret = update_catalog(conf, update); in zone_update_commit()
943 log_zone_error(update->zone->name, "failed to process catalog zone (%s)", knot_strerror(ret)); in zone_update_commit()
944 discard_adds_tree(update); in zone_update_commit()
948 ret = commit_journal(conf, update); in zone_update_commit()
950 discard_adds_tree(update); in zone_update_commit()
954 if (dnssec && zone_is_slave(conf, update->zone)) { in zone_update_commit()
955 ret = zone_set_lastsigned_serial(update->zone, in zone_update_commit()
956 zone_contents_serial(update->new_cont)); in zone_update_commit()
958 log_zone_warning(update->zone->name, in zone_update_commit()
966 old_contents = zone_switch_contents(update->zone, update->new_cont); in zone_update_commit()
968 if (update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) { in zone_update_commit()
969 changeset_clear(&update->change); in zone_update_commit()
970 changeset_clear(&update->extra_ch); in zone_update_commit()
972 zone_contents_deep_free(update->init_cont); in zone_update_commit()
978 (update->flags & (UPDATE_FULL | UPDATE_HYBRID)) ? in zone_update_commit()
981 clear_ctx->cleanup_apply = update->a_ctx; in zone_update_commit()
982 clear_ctx->new_cont_size = update->new_cont->size; in zone_update_commit()
986 log_zone_error(update->zone->name, "failed to deallocate unused memory"); in zone_update_commit()
990 val = conf_zone_get(conf, C_ZONEFILE_SYNC, update->zone->name); in zone_update_commit()
992 zone_events_schedule_now(update->zone, ZONE_EVENT_FLUSH); in zone_update_commit()
995 memset(update, 0, sizeof(*update)); in zone_update_commit()
1000 bool zone_update_no_change(zone_update_t *update) in zone_update_no_change() argument
1002 if (update == NULL) { in zone_update_no_change()
1006 if (update->flags & (UPDATE_INCREMENTAL | UPDATE_HYBRID)) { in zone_update_no_change()
1007 return changeset_empty(&update->change); in zone_update_no_change()