Tolerate some time-travel by slaves

This commit is contained in:
Nicolas Williams
2015-05-19 00:24:00 -05:00
parent 854aaab182
commit 409501e5e4

View File

@@ -749,56 +749,56 @@ process_msg (krb5_context context, slave *s, int log_fd,
ret = krb5_read_priv_message(context, s->ac, &s->fd, &out); ret = krb5_read_priv_message(context, s->ac, &s->fd, &out);
if(ret) { if(ret) {
krb5_warn (context, ret, "error reading message from %s", s->name); krb5_warn(context, ret, "error reading message from %s", s->name);
return 1; return 1;
} }
sp = krb5_storage_from_mem (out.data, out.length); sp = krb5_storage_from_mem(out.data, out.length);
if (sp == NULL) { if (sp == NULL) {
krb5_warnx (context, "process_msg: no memory"); krb5_warnx(context, "process_msg: no memory");
krb5_data_free (&out); krb5_data_free(&out);
return 1; return 1;
} }
if (krb5_ret_int32 (sp, &tmp) != 0) { if (krb5_ret_int32(sp, &tmp) != 0) {
krb5_warnx (context, "process_msg: client send too short command"); krb5_warnx(context, "process_msg: client send too short command");
krb5_data_free (&out); krb5_data_free(&out);
return 1; return 1;
} }
switch (tmp) { switch (tmp) {
case I_HAVE : case I_HAVE :
ret = krb5_ret_int32 (sp, &tmp); ret = krb5_ret_int32(sp, &tmp);
if (ret != 0) { if (ret != 0) {
krb5_warnx (context, "process_msg: client send too I_HAVE data"); krb5_warnx(context, "process_msg: client send too I_HAVE data");
break; break;
} }
/* new started slave that have old log */ /* new started slave that have old log */
if (s->version == 0 && tmp != 0) { if (s->version == 0 && tmp != 0) {
if (current_version < (uint32_t)tmp) { if (current_version < (uint32_t)tmp) {
krb5_warnx (context, "Slave %s (version %lu) have later version " krb5_warnx(context, "Slave %s (version %lu) have later version "
"the master (version %lu) OUT OF SYNC", "the master (version %lu) OUT OF SYNC",
s->name, (unsigned long)tmp, s->name, (unsigned long)tmp,
(unsigned long)current_version); (unsigned long)current_version);
} }
s->version = tmp; s->version = tmp;
} }
if ((uint32_t)tmp < s->version) { if ((uint32_t)tmp < s->version) {
krb5_warnx (context, "Slave claims to not have " krb5_warnx(context, "Slave claims to not have "
"version we already sent to it"); "version we already sent to it");
} else { s->version = tmp;
ret = send_diffs (context, s, log_fd, database, current_version);
} }
ret = send_diffs(context, s, log_fd, database, current_version);
break; break;
case I_AM_HERE : case I_AM_HERE :
break; break;
case ARE_YOU_THERE: case ARE_YOU_THERE:
case FOR_YOU : case FOR_YOU :
default : default :
krb5_warnx (context, "Ignoring command %d", tmp); krb5_warnx(context, "Ignoring command %d", tmp);
break; break;
} }
krb5_data_free (&out); krb5_data_free(&out);
krb5_storage_free (sp); krb5_storage_free(sp);
slave_seen(s); slave_seen(s);