summaryrefslogtreecommitdiffstats
path: root/src/kadmin
diff options
context:
space:
mode:
authorGreg Hudson <ghudson@mit.edu>2014-01-20 18:46:52 -0500
committerGreg Hudson <ghudson@mit.edu>2014-02-20 15:55:48 -0500
commitd1f9aa3737b2b3e62b5c5ed488d6112b7ce8a5ad (patch)
treef5f86bc7a30d0c05db26e9dacc20e875cf9bac9e /src/kadmin
parent444ef5fe9ec8d64a5db27b3a8aaf6813dd7ef0e0 (diff)
downloadkrb5-d1f9aa3737b2b3e62b5c5ed488d6112b7ce8a5ad.tar.gz
krb5-d1f9aa3737b2b3e62b5c5ed488d6112b7ce8a5ad.tar.xz
krb5-d1f9aa3737b2b3e62b5c5ed488d6112b7ce8a5ad.zip
Factor out ulog serial number status check
Add a new function ulog_get_sno_status, which checks a serial number and timestamp against the ulog for currency. Use it in kdb5_util dump and in ulog_get_entries. Adjust parse_iprop_header's contract in dump.c to better match the ulog_get_sno_status contract. This change causes some minor behavior differences. kadmind will check for an empty ulog unless the last serial number matches exactly, and will never set lastentry when returning UPDATE_FULL_RESYNC_NEEDED (which was pointless). kdb5_util dump will recognize a dump file as current if it exactly matches the last serial number, even if the ulog is empty; it will be more robust in the presence of non-monotonic clocks; and it will properly lock around the ulog access.
Diffstat (limited to 'src/kadmin')
-rw-r--r--src/kadmin/dbutil/dump.c47
1 files changed, 18 insertions, 29 deletions
diff --git a/src/kadmin/dbutil/dump.c b/src/kadmin/dbutil/dump.c
index ab96ca724f..a94fb31303 100644
--- a/src/kadmin/dbutil/dump.c
+++ b/src/kadmin/dbutil/dump.c
@@ -1146,8 +1146,7 @@ dump_version ipropx_1_version = {
/* Read the dump header. Return 1 on success, 0 if the file is not a
* recognized iprop dump format. */
static int
-parse_iprop_header(char *buf, dump_version **dv, uint32_t *last_sno,
- uint32_t *last_seconds, uint32_t *last_useconds)
+parse_iprop_header(char *buf, dump_version **dv, kdb_last_t *last)
{
char head[128];
int nread;
@@ -1180,25 +1179,23 @@ parse_iprop_header(char *buf, dump_version **dv, uint32_t *last_sno,
return 0;
}
- *last_sno = *up++;
- *last_seconds = *up++;
- *last_useconds = *up++;
+ last->last_sno = *up++;
+ last->last_time.seconds = *up++;
+ last->last_time.useconds = *up++;
return 1;
}
-/* Return 1 if the {sno, timestamp} in an existing dump file is in the
- * ulog, else return 0. */
-static int
-current_dump_sno_in_ulog(char *ifile, kdb_hlog_t *ulog)
+/* Return true if the serial number and timestamp in an existing dump file is
+ * in the ulog. */
+static krb5_boolean
+current_dump_sno_in_ulog(krb5_context context, const char *ifile)
{
+ update_status_t status;
dump_version *junk;
- uint32_t last_sno, last_seconds, last_useconds;
+ kdb_last_t last;
char buf[BUFSIZ];
FILE *f;
- if (ulog->kdb_last_sno == 0)
- return 0; /* nothing in ulog */
-
f = fopen(ifile, "r");
if (f == NULL)
return 0; /* aliasing other errors to ENOENT here is OK */
@@ -1207,17 +1204,11 @@ current_dump_sno_in_ulog(char *ifile, kdb_hlog_t *ulog)
return errno ? -1 : 0;
fclose(f);
- if (!parse_iprop_header(buf, &junk, &last_sno, &last_seconds,
- &last_useconds))
+ if (!parse_iprop_header(buf, &junk, &last))
return 0;
- if (ulog->kdb_first_sno > last_sno ||
- ulog->kdb_first_time.seconds > last_seconds ||
- (ulog->kdb_first_time.seconds == last_seconds &&
- ulog->kdb_first_time.useconds > last_useconds))
- return 0;
-
- return 1;
+ status = ulog_get_sno_status(context, &last);
+ return status == UPDATE_OK || status == UPDATE_NIL;
}
/*
@@ -1316,7 +1307,7 @@ dump_db(int argc, char **argv)
"use only for iprop dumps"));
goto error;
}
- if (current_dump_sno_in_ulog(ofile, log_ctx->ulog))
+ if (current_dump_sno_in_ulog(util_context, ofile))
return;
}
@@ -1483,9 +1474,9 @@ load_db(int argc, char **argv)
dump_version *load = NULL;
int aindex;
kdb_log_context *log_ctx;
+ kdb_last_t last;
krb5_boolean db_locked = FALSE, temp_db_created = FALSE;
krb5_boolean verbose = FALSE, update = FALSE, iprop_load = FALSE;
- uint32_t last_sno, last_seconds, last_useconds;
/* Parse the arguments. */
dbname = global_params.dbname;
@@ -1629,8 +1620,7 @@ load_db(int argc, char **argv)
log_ctx->iproprole = IPROP_SLAVE;
if (iprop_load) {
/* Parse the iprop header information. */
- if (!parse_iprop_header(buf, &load, &last_sno, &last_seconds,
- &last_useconds))
+ if (!parse_iprop_header(buf, &load, &last))
goto error;
}
}
@@ -1666,9 +1656,8 @@ load_db(int argc, char **argv)
* record the iprop state if we received it. */
ulog_init_header(util_context);
if (iprop_load) {
- log_ctx->ulog->kdb_last_sno = last_sno;
- log_ctx->ulog->kdb_last_time.seconds = last_seconds;
- log_ctx->ulog->kdb_last_time.useconds = last_useconds;
+ log_ctx->ulog->kdb_last_sno = last.last_sno;
+ log_ctx->ulog->kdb_last_time = last.last_time;
ulog_sync_header(log_ctx->ulog);
}
}