iprop slave: try incremental after complete xfer

The following sequence of events results in slave B having a stale HDB:

 - slave A connects to master, master dumps HDB for the slave
 - kadm5 operations
 - slave B connects to master, master sends previously dumped HDB

slave B won't discover any updates until the next transaction.

The fix is simple: the slave should immediately call ihave() after
receiving a complete HDB.
This commit is contained in:
Nicolas Williams
2015-05-19 00:27:30 -05:00
parent 4158ddbc25
commit 05a919b94b
3 changed files with 33 additions and 19 deletions

View File

@@ -727,8 +727,8 @@ main(int argc, char **argv)
krb5_warnx(context, "ipropd-slave started at version: %ld",
(long)server_context->log_context.version);
ret = ihave (context, auth_context, master_fd,
server_context->log_context.version);
ret = ihave(context, auth_context, master_fd,
server_context->log_context.version);
if (ret)
goto retry;
@@ -777,30 +777,33 @@ main(int argc, char **argv)
}
sp = krb5_storage_from_mem (out.data, out.length);
krb5_ret_int32 (sp, &tmp);
krb5_ret_int32(sp, &tmp);
switch (tmp) {
case FOR_YOU :
receive (context, sp, server_context);
ret = ihave (context, auth_context, master_fd,
server_context->log_context.version);
if (ret) {
connected = FALSE;
} else {
is_up_to_date(context, status_file, server_context);
}
break;
case TELL_YOU_EVERYTHING :
ret = receive_everything (context, master_fd, server_context,
auth_context);
receive(context, sp, server_context);
ret = ihave(context, auth_context, master_fd,
server_context->log_context.version);
if (ret)
connected = FALSE;
else
is_up_to_date(context, status_file, server_context);
break;
case TELL_YOU_EVERYTHING :
ret = receive_everything(context, master_fd, server_context,
auth_context);
if (ret == 0) {
ret = ihave(context, auth_context, master_fd,
server_context->log_context.version);
}
if (ret)
connected = FALSE;
else
is_up_to_date(context, status_file, server_context);
break;
case ARE_YOU_THERE :
is_up_to_date(context, status_file, server_context);
send_im_here (context, master_fd, auth_context);
send_im_here(context, master_fd, auth_context);
break;
case YOU_HAVE_LAST_VERSION:
is_up_to_date(context, status_file, server_context);

View File

@@ -12,6 +12,7 @@ noinst_DATA = \
krb5-weak.conf \
krb5-pkinit.conf \
krb5-pkinit-win.conf \
krb5-slave2.conf \
krb5-slave.conf
check_SCRIPTS = $(SCRIPT_TESTS)
@@ -138,7 +139,7 @@ check-pkinit: check-pkinit.in Makefile krb5-pkinit.conf
$(chmod) +x check-pkinit.tmp && \
mv check-pkinit.tmp check-pkinit
check-iprop: check-iprop.in Makefile krb5.conf krb5-slave.conf
check-iprop: check-iprop.in Makefile krb5.conf krb5-slave.conf krb5-slave2.conf
$(do_subst) < $(srcdir)/check-iprop.in > check-iprop.tmp && \
$(chmod) +x check-iprop.tmp && \
mv check-iprop.tmp check-iprop
@@ -212,6 +213,13 @@ krb5-slave.conf: krb5.conf.in Makefile
-e 's,[@]kdc[@],.slave,g' < $(srcdir)/krb5.conf.in > krb5-slave.conf.tmp && \
mv krb5-slave.conf.tmp krb5-slave.conf
krb5-slave2.conf: krb5.conf.in Makefile
$(do_subst) \
-e 's,[@]WEAK[@],true,g' \
-e 's,[@]dk[@],,g' \
-e 's,[@]kdc[@],.slave2,g' < $(srcdir)/krb5.conf.in > krb5-slave2.conf.tmp && \
mv krb5-slave2.conf.tmp krb5-slave2.conf
krb5-pkinit.conf: krb5-pkinit.conf.in Makefile
$(do_subst) -e 's,[@]w2k[@],no,g' < $(srcdir)/krb5-pkinit.conf.in > krb5-pkinit.conf.tmp && \
mv krb5-pkinit.conf.tmp krb5-pkinit.conf
@@ -247,6 +255,7 @@ CLEANFILES= \
krb5-hdb-mitdb.conf \
krb5-pkinit-win.conf \
krb5-pkinit.conf \
krb5-slave2.conf \
krb5-slave.conf \
krb5-weak.conf \
krb5.conf \

View File

@@ -172,7 +172,7 @@ sleep 2
KRB5_CONFIG="${objdir}/krb5-slave.conf" \
${kadmin} -l get host/bar@${R} > /dev/null 2>/dev/null && exit 1
echo "kill slave"
echo "kill slave and remove log and database"
> iprop-stats
sh ${leaks_kill} ipropd-slave $ipds || exit 1
rm -f iprop-slave-status
@@ -181,6 +181,8 @@ ${EGREP} 'iprop/slave.test.h5l.se@TEST.H5L.SE.*Down' iprop-stats >/dev/null || e
# ----------------- checking: slave is missing changes while down
rm current.slave.log current-db.slave* || exit 1
echo "doing changes while slave is down"
${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1
${kadmin} -l cpw --random-password user@${R} > /dev/null || exit 1