Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Knot projects
Knot DNS
Commits
c04a4b93
Commit
c04a4b93
authored
Jun 24, 2014
by
Jan Kadlec
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
changeset: Removed some redundant RR copies.
parent
f4c00b05
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
29 additions
and
110 deletions
+29
-110
src/knot/dnssec/zone-sign.c
src/knot/dnssec/zone-sign.c
+4
-4
src/knot/nameserver/ixfr.c
src/knot/nameserver/ixfr.c
+3
-3
src/knot/nameserver/update.c
src/knot/nameserver/update.c
+1
-0
src/knot/updates/changesets.c
src/knot/updates/changesets.c
+5
-1
src/knot/updates/ddns.c
src/knot/updates/ddns.c
+5
-21
src/knot/zone/zone-diff.c
src/knot/zone/zone-diff.c
+6
-79
src/knot/zone/zone-load.c
src/knot/zone/zone-load.c
+1
-1
tests/changeset.c
tests/changeset.c
+4
-1
No files found.
src/knot/dnssec/zone-sign.c
View file @
c04a4b93
...
...
@@ -45,12 +45,12 @@
/*!
* \brief Create empty RRSIG RR set for a given RR set to be covered.
*/
static
knot_rrset_t
*
create_empty_rrsigs_for
(
const
knot_rrset_t
*
covered
)
static
knot_rrset_t
create_empty_rrsigs_for
(
const
knot_rrset_t
*
covered
)
{
assert
(
!
knot_rrset_empty
(
covered
));
return
knot_rrset_
new
(
covered
->
owner
,
KNOT_RRTYPE_RRSIG
,
covered
->
rclass
,
NULL
)
;
knot_rrset_t
ret
;
knot_rrset_
init
(
&
ret
,
covered
->
owner
,
KNOT_RRTYPE_RRSIG
,
covered
->
rclass
);
return
ret
;
}
/*- private API - signing of in-zone nodes -----------------------------------*/
...
...
src/knot/nameserver/ixfr.c
View file @
c04a4b93
...
...
@@ -235,14 +235,14 @@ static int ixfr_answer_init(struct query_data *qdata)
/* Put all changesets to processing queue. */
xfer
->
changesets
=
chgsets
;
changeset_t
*
chs
=
NULL
;
WALK_LIST
(
chs
,
chg
sets
)
{
WALK_LIST
(
chs
,
xfer
->
change
sets
)
{
ptrlist_add
(
&
xfer
->
proc
.
nodes
,
chs
,
mm
);
}
/* Keep first and last serial. */
chs
=
HEAD
(
chg
sets
);
chs
=
HEAD
(
xfer
->
change
sets
);
xfer
->
soa_from
=
chs
->
soa_from
;
chs
=
TAIL
(
chg
sets
);
chs
=
TAIL
(
xfer
->
change
sets
);
xfer
->
soa_to
=
chs
->
soa_to
;
/* Set up cleanup callback. */
...
...
src/knot/nameserver/update.c
View file @
c04a4b93
...
...
@@ -125,6 +125,7 @@ static int sign_update(zone_t *zone, const zone_contents_t *old_contents,
// Free the DNSSEC changeset's SOA from (not used anymore)
knot_rrset_free
(
&
sec_ch
.
soa_from
,
NULL
);
changeset_clear
(
&
sec_ch
,
NULL
);
// Plan next zone resign.
const
time_t
resign_time
=
zone_events_get_time
(
zone
,
ZONE_EVENT_DNSSEC
);
...
...
src/knot/updates/changesets.c
View file @
c04a4b93
...
...
@@ -76,9 +76,13 @@ bool changeset_empty(const changeset_t *ch)
return
true
;
}
if
(
ch
->
soa_to
)
{
return
false
;
}
changeset_iter_t
*
itt
=
changeset_iter_all
(
ch
,
false
);
if
(
itt
==
NULL
)
{
return
fals
e
;
return
tru
e
;
}
knot_rrset_t
rr
=
changeset_iter_next
(
itt
);
...
...
src/knot/updates/ddns.c
View file @
c04a4b93
...
...
@@ -290,10 +290,8 @@ static void remove_header_from_list(zone_contents_t *z, const knot_rrset_t *rr)
/*!< \brief Removes RR from list, owner check. */
static
void
remove_owner_from_list
(
zone_contents_t
*
z
,
const
knot_dname_t
*
owner
)
{
zone_node_t
*
n
=
NULL
;
zone_tree_remove
(
z
->
nodes
,
owner
,
&
n
);
zone_node_t
*
n
=
(
zone_node_t
*
)
zone_contents_find_node
(
z
,
owner
);
node_free_rrsets
(
n
);
node_free
(
&
n
);
}
/* --------------------- true/false helper functions ------------------------ */
...
...
@@ -428,7 +426,7 @@ static bool skip_soa(const knot_rrset_t *rr, int64_t sn)
/*!< \brief Checks whether record should be added or replaced. */
static
bool
skip_record_addition
(
changeset_t
*
changeset
,
knot_rrset_t
*
rr
)
const
knot_rrset_t
*
rr
)
{
if
(
!
should_replace
(
rr
))
{
return
false
;
...
...
@@ -456,14 +454,7 @@ static bool skip_record_addition(changeset_t *changeset,
static
int
add_rr_to_chgset
(
const
knot_rrset_t
*
rr
,
changeset_t
*
changeset
,
int
*
apex_ns_rem
)
{
knot_rrset_t
*
rr_copy
=
knot_rrset_copy
(
rr
,
NULL
);
if
(
rr_copy
==
NULL
)
{
return
KNOT_ENOMEM
;
}
rr_copy
->
rclass
=
KNOT_CLASS_IN
;
if
(
skip_record_addition
(
changeset
,
rr_copy
))
{
if
(
skip_record_addition
(
changeset
,
rr
))
{
return
KNOT_EOK
;
}
...
...
@@ -472,26 +463,19 @@ static int add_rr_to_chgset(const knot_rrset_t *rr, changeset_t *changeset,
(
*
apex_ns_rem
)
--
;
}
return
changeset_add_rrset
(
changeset
,
rr
_copy
);
return
changeset_add_rrset
(
changeset
,
rr
);
}
/*!< \brief Adds RR into remove section of changeset if it is deemed worthy. */
static
int
rem_rr_to_chgset
(
const
knot_rrset_t
*
rr
,
changeset_t
*
changeset
,
int
*
apex_ns_rem
)
{
knot_rrset_t
*
rr_copy
=
knot_rrset_copy
(
rr
,
NULL
);
if
(
rr_copy
==
NULL
)
{
return
KNOT_ENOMEM
;
}
rr_copy
->
rclass
=
KNOT_CLASS_IN
;
if
(
apex_ns_rem
)
{
// Decrease post update apex NS count.
(
*
apex_ns_rem
)
++
;
}
return
changeset_rem_rrset
(
changeset
,
rr
_copy
);
return
changeset_rem_rrset
(
changeset
,
rr
);
}
/*!< \brief Adds all RRs from RRSet into remove section of changeset. */
...
...
src/knot/zone/zone-diff.c
View file @
c04a4b93
...
...
@@ -90,85 +90,13 @@ static int knot_zone_diff_load_soas(const zone_contents_t *zone1,
return
KNOT_EOK
;
}
/*!< \todo Only use add or remove function, not both as they are the same. */
/*!< \todo Also, this might be all handled by function in changesets.h!!! */
static
int
knot_zone_diff_changeset_add_rrset
(
changeset_t
*
changeset
,
const
knot_rrset_t
*
rrset
)
{
/* Remove all RRs of the RRSet. */
if
(
changeset
==
NULL
||
rrset
==
NULL
)
{
dbg_zonediff
(
"zone_diff: add_rrset: NULL parameters.
\n
"
);
return
KNOT_EINVAL
;
}
if
(
rrset
->
rrs
.
rr_count
==
0
)
{
dbg_zonediff_detail
(
"zone_diff: Nothing to add.
\n
"
);
return
KNOT_EOK
;
}
knot_rrset_t
*
rrset_copy
=
knot_rrset_copy
(
rrset
,
NULL
);
if
(
rrset_copy
==
NULL
)
{
dbg_zonediff
(
"zone_diff: add_rrset: Cannot copy RRSet.
\n
"
);
return
KNOT_ENOMEM
;
}
int
ret
=
changeset_add_rrset
(
changeset
,
rrset_copy
);
if
(
ret
!=
KNOT_EOK
)
{
/* We have to free the copy now! */
knot_rrset_free
(
&
rrset_copy
,
NULL
);
dbg_zonediff
(
"zone_diff: add_rrset: Could not add RRSet. "
"Reason: %s.
\n
"
,
knot_strerror
(
ret
));
return
ret
;
}
return
KNOT_EOK
;
}
static
int
knot_zone_diff_changeset_remove_rrset
(
changeset_t
*
changeset
,
const
knot_rrset_t
*
rrset
)
{
/* Remove all RRs of the RRSet. */
if
(
changeset
==
NULL
)
{
dbg_zonediff
(
"zone_diff: remove_rrset: NULL parameters.
\n
"
);
return
KNOT_EINVAL
;
}
if
(
rrset
==
NULL
)
{
return
KNOT_EOK
;
}
if
(
rrset
->
rrs
.
rr_count
==
0
)
{
/* RDATA are the same, however*/
dbg_zonediff_detail
(
"zone_diff: Nothing to remove.
\n
"
);
return
KNOT_EOK
;
}
knot_rrset_t
*
rrset_copy
=
knot_rrset_copy
(
rrset
,
NULL
);
if
(
rrset_copy
==
NULL
)
{
dbg_zonediff
(
"zone_diff: remove_rrset: Cannot copy RRSet.
\n
"
);
return
KNOT_ENOMEM
;
}
int
ret
=
changeset_rem_rrset
(
changeset
,
rrset_copy
);
if
(
ret
!=
KNOT_EOK
)
{
/* We have to free the copy now. */
knot_rrset_free
(
&
rrset_copy
,
NULL
);
dbg_zonediff
(
"zone_diff: remove_rrset: Could not remove RRSet. "
"Reason: %s.
\n
"
,
knot_strerror
(
ret
));
return
ret
;
}
return
KNOT_EOK
;
}
static
int
knot_zone_diff_add_node
(
const
zone_node_t
*
node
,
changeset_t
*
changeset
)
{
/* Add all rrsets from node. */
for
(
uint
i
=
0
;
i
<
node
->
rrset_count
;
i
++
)
{
knot_rrset_t
rrset
=
node_rrset_at
(
node
,
i
);
int
ret
=
knot_zone_diff_changeset_add_rrset
(
changeset
,
&
rrset
);
int
ret
=
changeset_add_rrset
(
changeset
,
&
rrset
);
if
(
ret
!=
KNOT_EOK
)
{
dbg_zonediff
(
"zone_diff: add_node: Cannot add RRSet (%s).
\n
"
,
knot_strerror
(
ret
));
...
...
@@ -185,8 +113,7 @@ static int knot_zone_diff_remove_node(changeset_t *changeset,
/* Remove all the RRSets of the node. */
for
(
uint
i
=
0
;
i
<
node
->
rrset_count
;
i
++
)
{
knot_rrset_t
rrset
=
node_rrset_at
(
node
,
i
);
int
ret
=
knot_zone_diff_changeset_remove_rrset
(
changeset
,
&
rrset
);
int
ret
=
changeset_rem_rrset
(
changeset
,
&
rrset
);
if
(
ret
!=
KNOT_EOK
)
{
dbg_zonediff
(
"zone_diff: remove_node: Failed to "
"remove rrset. Error: %s
\n
"
,
...
...
@@ -279,7 +206,7 @@ static int knot_zone_diff_rdata(const knot_rrset_t *rrset1,
}
}
int
ret
=
knot_zone_diff_
changeset_rem
ove
_rrset
(
changeset
,
to_remove
);
int
ret
=
changeset_rem_rrset
(
changeset
,
to_remove
);
if
(
ret
!=
KNOT_EOK
)
{
knot_rrset_free
(
&
to_remove
,
NULL
);
dbg_zonediff
(
"zone_diff: diff_rdata: Could not remove RRs. "
...
...
@@ -302,7 +229,7 @@ static int knot_zone_diff_rdata(const knot_rrset_t *rrset1,
}
}
ret
=
knot_zone_diff_
changeset_add_rrset
(
changeset
,
to_add
);
ret
=
changeset_add_rrset
(
changeset
,
to_add
);
if
(
ret
!=
KNOT_EOK
)
{
knot_rrset_free
(
&
to_add
,
NULL
);
dbg_zonediff
(
"zone_diff: diff_rdata: Could not remove RRs. "
...
...
@@ -396,7 +323,7 @@ static int knot_zone_diff_node(zone_node_t **node_ptr, void *data)
node_rrset
(
node_in_second_tree
,
rrset
.
type
);
if
(
knot_rrset_empty
(
&
rrset_from_second_node
))
{
/* RRSet has been removed. Make a copy and remove. */
int
ret
=
knot_zone_diff_
changeset_rem
ove
_rrset
(
int
ret
=
changeset_rem_rrset
(
param
->
changeset
,
&
rrset
);
if
(
ret
!=
KNOT_EOK
)
{
dbg_zonediff
(
"zone_diff: diff_node: "
...
...
@@ -428,7 +355,7 @@ static int knot_zone_diff_node(zone_node_t **node_ptr, void *data)
knot_rrset_t
rrset_from_first_node
=
node_rrset
(
node
,
rrset
.
type
);
if
(
knot_rrset_empty
(
&
rrset_from_first_node
))
{
/* RRSet has been added. Make a copy and add. */
int
ret
=
knot_zone_diff_
changeset_add_rrset
(
int
ret
=
changeset_add_rrset
(
param
->
changeset
,
&
rrset
);
if
(
ret
!=
KNOT_EOK
)
{
dbg_zonediff
(
"zone_diff: diff_node: "
...
...
src/knot/zone/zone-load.c
View file @
c04a4b93
...
...
@@ -185,8 +185,8 @@ int zone_load_post(zone_contents_t *contents, zone_t *zone, uint32_t *dnssec_ref
init_list
(
&
apply
);
add_head
(
&
apply
,
&
diff_change
.
n
);
ret
=
zone_change_store
(
zone
,
&
apply
);
changeset_clear
(
&
diff_change
,
NULL
);
}
changeset_clear
(
&
diff_change
,
NULL
);
return
ret
;
}
...
...
tests/changeset.c
View file @
c04a4b93
...
...
@@ -22,7 +22,7 @@
int
main
(
int
argc
,
char
*
argv
[])
{
plan
(
2
2
);
plan
(
2
3
);
// Test with NULL changeset
ok
(
changeset_size
(
NULL
)
==
0
,
"changeset: NULL size"
);
...
...
@@ -35,6 +35,9 @@ int main(int argc, char *argv[])
knot_dname_free
(
&
d
,
NULL
);
ok
(
ch
!=
NULL
,
"changeset: new"
);
ok
(
changeset_empty
(
ch
),
"changeset: empty"
);
ch
->
soa_to
=
(
knot_rrset_t
*
)
0xdeadbeef
;
ok
(
!
changeset_empty
(
ch
),
"changseset: empty SOA"
);
ch
->
soa_to
=
NULL
;
ok
(
changeset_size
(
ch
)
==
0
,
"changeset: empty size"
);
// Test additions.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment