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);