diff options
| author | Greg Hudson <ghudson@mit.edu> | 2014-01-23 11:34:52 -0500 |
|---|---|---|
| committer | Greg Hudson <ghudson@mit.edu> | 2014-02-20 15:55:49 -0500 |
| commit | 71d028f1054deb186807e7c8048218b82b478422 (patch) | |
| tree | 72ab9b66b33ee7696f6662fccc50f2888ceadfbd /src/kadmin | |
| parent | d1f9aa3737b2b3e62b5c5ed488d6112b7ce8a5ad (diff) | |
| download | krb5-71d028f1054deb186807e7c8048218b82b478422.tar.gz krb5-71d028f1054deb186807e7c8048218b82b478422.tar.xz krb5-71d028f1054deb186807e7c8048218b82b478422.zip | |
Lock around more ulog operations
Always lock the ulog when accessing it. We can currently get away
with some laxness on iprop slaves because they are mostly synchronous,
but hierarchical iprop will allow master and slave operations to take
place concurrently, requiring more strict locking.
Add new functions ulog_get_last and ulog_set_last, which access the
ulog header with locking, and use them in kdb5_util and kpropd. Add
locking to ulog_replay and ulog_init_header.
ulog_lock and ulog_sync_header are no longer used outside of kdb_log.c
after these changes, so make them static functions and remove the
ulog_ prefix. Add an unlock_ulog function for clarity.
Diffstat (limited to 'src/kadmin')
| -rw-r--r-- | src/kadmin/dbutil/dump.c | 36 | ||||
| -rw-r--r-- | src/kadmin/dbutil/kdb5_create.c | 7 |
2 files changed, 33 insertions, 10 deletions
diff --git a/src/kadmin/dbutil/dump.c b/src/kadmin/dbutil/dump.c index a94fb3130..def1d6a6b 100644 --- a/src/kadmin/dbutil/dump.c +++ b/src/kadmin/dbutil/dump.c @@ -1231,6 +1231,7 @@ dump_db(int argc, char **argv) unsigned int ipropx_version = IPROPX_VERSION_0; krb5_kvno kt_kvno; krb5_boolean conditional = FALSE; + kdb_last_t last; /* Parse the arguments. */ dump = &r1_11_version; @@ -1404,11 +1405,16 @@ dump_db(int argc, char **argv) } if (dump_sno) { + ret = ulog_get_last(util_context, &last); + if (ret) { + com_err(progname, ret, _("while reading update log header")); + goto error; + } if (ipropx_version) fprintf(f, " %u", IPROPX_VERSION); - fprintf(f, " %u", log_ctx->ulog->kdb_last_sno); - fprintf(f, " %u", log_ctx->ulog->kdb_last_time.seconds); - fprintf(f, " %u", log_ctx->ulog->kdb_last_time.useconds); + fprintf(f, " %u", last.last_sno); + fprintf(f, " %u", last.last_time.seconds); + fprintf(f, " %u", last.last_time.useconds); } if (dump->header[strlen(dump->header)-1] != '\n') @@ -1639,8 +1645,13 @@ load_db(int argc, char **argv) if (!update) { /* Initialize the ulog header before promoting so we can't leave behind * the pre-load ulog state if we are killed just after promoting. */ - if (log_ctx != NULL && log_ctx->iproprole) - ulog_init_header(util_context); + if (log_ctx != NULL && log_ctx->iproprole) { + ret = ulog_init_header(util_context); + if (ret) { + com_err(progname, ret, _("while reinitializing update log")); + goto error; + } + } ret = krb5_db_promote(util_context, db5util_db_args); /* Ignore a not supported error since there is nothing to do about it @@ -1654,11 +1665,18 @@ load_db(int argc, char **argv) if (log_ctx != NULL && log_ctx->iproprole) { /* Reinitialize the ulog header since we replaced the DB, and * record the iprop state if we received it. */ - ulog_init_header(util_context); + ret = ulog_init_header(util_context); + if (ret) { + com_err(progname, ret, _("while reinitializing update log")); + goto error; + } if (iprop_load) { - log_ctx->ulog->kdb_last_sno = last.last_sno; - log_ctx->ulog->kdb_last_time = last.last_time; - ulog_sync_header(log_ctx->ulog); + ret = ulog_set_last(util_context, &last); + if (ret) { + com_err(progname, ret, + _("while writing update log header")); + goto error; + } } } } diff --git a/src/kadmin/dbutil/kdb5_create.c b/src/kadmin/dbutil/kdb5_create.c index 31b3c6efb..f6df9923e 100644 --- a/src/kadmin/dbutil/kdb5_create.c +++ b/src/kadmin/dbutil/kdb5_create.c @@ -300,7 +300,12 @@ void kdb5_create(argc, argv) * We're reinitializing the update log in case one already * existed, but this should never happen. */ - ulog_init_header(util_context); + retval = ulog_init_header(util_context); + if (retval) { + com_err(argv[0], retval, _("while initializing update log")); + exit_status++; + return; + } /* * Since we're creating a new db we shouldn't worry about |
