Skip to content

Commit

Permalink
Allow the kdb_first_* not to be present in the ulog.
Browse files Browse the repository at this point in the history
  • Loading branch information
rbasch committed Oct 2, 2014
1 parent 58f8372 commit ce238c4
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 18 deletions.
34 changes: 23 additions & 11 deletions src/lib/kdb/kdb_log.c
Expand Up @@ -113,6 +113,11 @@ get_sno_status(kdb_log_context *log_ctx, const kdb_last_t *last)
time_equal(&last->last_time, &ulog->kdb_last_time))
return UPDATE_NIL;

/* Check against the first sno, which may not be in the ulog. */
if (last->last_sno == ulog->kdb_first_sno &&
time_equal(&last->last_time, &ulog->kdb_first_time))
return UPDATE_OK;

/* If our ulog is empty or does not contain last_sno, a full resync is
* required. */
if (ulog->kdb_num == 0 || last->last_sno > ulog->kdb_last_sno ||
Expand Down Expand Up @@ -283,11 +288,12 @@ store_update(kdb_log_context *log_ctx, kdb_incr_update_t *upd)
/* Modify the ulog header to reflect the new update. */
ulog->kdb_last_sno = upd->kdb_entry_sno;
ulog->kdb_last_time = upd->kdb_time;
if (ulog->kdb_num == 0) {
ulog->kdb_num = 1;
ulog->kdb_first_sno = upd->kdb_entry_sno;
ulog->kdb_first_time = upd->kdb_time;
} else if (ulog->kdb_num < ulogentries) {
if (ulog->kdb_num < ulogentries) {
if (ulog->kdb_num == 0 &&
(ulog->kdb_first_sno == 0 || ulog->kdb_first_sno != upd->kdb_entry_sno - 1)) {
ulog->kdb_first_sno = upd->kdb_entry_sno;
ulog->kdb_first_time = upd->kdb_time;
}
ulog->kdb_num++;
} else {
/* We are circling; set kdb_first_sno and time to the next update. */
Expand Down Expand Up @@ -504,12 +510,18 @@ ulog_map(krb5_context context, const char *logname, uint32_t ulogentries)

/* Reinit ulog if ulogentries changed such that we have too many entries or
* our first or last entry was written to the wrong location. */
if (ulog->kdb_num != 0 &&
(ulog->kdb_num > ulogentries ||
!check_sno(log_ctx, ulog->kdb_first_sno, &ulog->kdb_first_time) ||
!check_sno(log_ctx, ulog->kdb_last_sno, &ulog->kdb_last_time))) {
reset_header(ulog);
sync_header(ulog);
if (ulog->kdb_num != 0) {
if (ulog->kdb_num > ulogentries ||
ulog->kdb_first_sno > ulog->kdb_last_sno ||
!check_sno(log_ctx, ulog->kdb_last_sno, &ulog->kdb_last_time) ||
ulog->kdb_first_sno < ulog->kdb_last_sno - ulog->kdb_num ||
ulog->kdb_first_sno > ulog->kdb_last_sno - ulog->kdb_num + 1 ||
(ulog->kdb_last_sno - ulog->kdb_num + 1 == ulog->kdb_first_sno &&
!check_sno(log_ctx, ulog->kdb_first_sno, &ulog->kdb_first_time)))
{
reset_header(ulog);
sync_header(ulog);
}
}

if (ulog->kdb_num != ulogentries) {
Expand Down
14 changes: 7 additions & 7 deletions src/slave/kproplog.c
Expand Up @@ -330,19 +330,19 @@ print_attr(kdbe_val_t *val, int vverbose)
* Print the update entry information
*/
static void
print_update(kdb_hlog_t *ulog, uint32_t entry, uint32_t ulogentries,
unsigned int verbose)
print_update(krb5_context kcontext, uint32_t entry, unsigned int verbose)
{
XDR xdrs;
uint32_t start_sno, i, j, indx;
char *dbprinc;
kdb_ent_header_t *indx_log;
kdb_incr_update_t upd;
kdb_hlog_t *ulog = kcontext->kdblog_context->ulog;
uint32_t ulogentries = kcontext->kdblog_context->ulogentries;

if (entry && (entry < ulog->kdb_num))
start_sno = ulog->kdb_last_sno - entry;
else
start_sno = ulog->kdb_first_sno - 1;
if (entry <= 0 || entry > ulog->kdb_num)
entry = ulog->kdb_num;
start_sno = ulog->kdb_last_sno - entry;

for (i = start_sno; i < ulog->kdb_last_sno; i++) {
indx = i % ulogentries;
Expand Down Expand Up @@ -551,7 +551,7 @@ main(int argc, char **argv)
}

if (!headeronly && ulog->kdb_num)
print_update(ulog, entry, params.iprop_ulogsize, verbose);
print_update(context, entry, verbose);

printf("\n");

Expand Down

0 comments on commit ce238c4

Please sign in to comment.