delay TUID assignment less
we can't delay TUID assignment until after starting propagation if we
want to provide both safety and performance.
amends a0961d65
.
This commit is contained in:
parent
04e225c7ce
commit
2b797fac61
32
src/sync.c
32
src/sync.c
|
@ -272,6 +272,17 @@ assign_uid( sync_vars_t *svars, sync_rec_t *srec, int t, uint uid )
|
||||||
assign_uid( svars, srec, t, nuid ); \
|
assign_uid( svars, srec, t, nuid ); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
static void
|
||||||
|
assign_tuid( sync_vars_t *svars, sync_rec_t *srec )
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < TUIDL; i++) {
|
||||||
|
uchar c = arc4_getbyte() & 0x3f;
|
||||||
|
srec->tuid[i] = (char)(c < 26 ? c + 'A' : c < 52 ? c + 'a' - 26 :
|
||||||
|
c < 62 ? c + '0' - 52 : c == 62 ? '+' : '/');
|
||||||
|
}
|
||||||
|
JLOG( "# %u %u %." stringify(TUIDL) "s", (srec->uid[F], srec->uid[N], srec->tuid), "new TUID" );
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
match_tuids( sync_vars_t *svars, int t, message_t *msgs )
|
match_tuids( sync_vars_t *svars, int t, message_t *msgs )
|
||||||
{
|
{
|
||||||
|
@ -2022,16 +2033,28 @@ box_loaded( int sts, message_t *msgs, int total_msgs, int recent_msgs, void *aux
|
||||||
}
|
}
|
||||||
|
|
||||||
debug( "propagating new messages\n" );
|
debug( "propagating new messages\n" );
|
||||||
if (UseFSync && svars->jfp)
|
|
||||||
fdatasync( fileno( svars->jfp ) );
|
|
||||||
for (t = 0; t < 2; t++) {
|
for (t = 0; t < 2; t++) {
|
||||||
if (any_new[t]) {
|
if (any_new[t]) {
|
||||||
|
// fsync'ing the UIDNEXT bump is not strictly necessary, but advantageous.
|
||||||
svars->finduid[t] = svars->drv[t]->get_uidnext( svars->ctx[t] );
|
svars->finduid[t] = svars->drv[t]->get_uidnext( svars->ctx[t] );
|
||||||
JLOG( "F %d %u", (t, svars->finduid[t]), "save UIDNEXT of %s", str_fn[t] );
|
JLOG( "F %d %u", (t, svars->finduid[t]), "save UIDNEXT of %s", str_fn[t] );
|
||||||
svars->new_msgs[t] = svars->msgs[1-t];
|
svars->new_msgs[t] = svars->msgs[1-t];
|
||||||
} else {
|
} else {
|
||||||
svars->state[t] |= ST_SENT_NEW;
|
svars->state[t] |= ST_SENT_NEW;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (any_new[F] | any_new[N]) {
|
||||||
|
// TUID assignment needs to be fsync'd, as otherwise a system crash may
|
||||||
|
// lead to the newly propagated messages becoming duplicated.
|
||||||
|
// Of course, we could assign each TUID only after fetching the message
|
||||||
|
// and fsync it separately, but that would be horribly inefficient.
|
||||||
|
for (srec = svars->srecs; srec; srec = srec->next)
|
||||||
|
if (srec->status & S_PENDING)
|
||||||
|
assign_tuid( svars, srec );
|
||||||
|
if (UseFSync && svars->jfp)
|
||||||
|
fdatasync( fileno( svars->jfp ) );
|
||||||
|
}
|
||||||
|
for (t = 0; t < 2; t++) {
|
||||||
msgs_copied( svars, t );
|
msgs_copied( svars, t );
|
||||||
if (check_cancel( svars ))
|
if (check_cancel( svars ))
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -2097,11 +2120,6 @@ msgs_copied( sync_vars_t *svars, int t )
|
||||||
svars->new_msgs[t] = tmsg;
|
svars->new_msgs[t] = tmsg;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
for (uint i = 0; i < TUIDL; i++) {
|
|
||||||
uchar c = arc4_getbyte() & 0x3f;
|
|
||||||
srec->tuid[i] = (char)(c < 26 ? c + 'A' : c < 52 ? c + 'a' - 26 : c < 62 ? c + '0' - 52 : c == 62 ? '+' : '/');
|
|
||||||
}
|
|
||||||
JLOG( "# %u %u %." stringify(TUIDL) "s", (srec->uid[F], srec->uid[N], srec->tuid), "%sing message", str_hl[t] );
|
|
||||||
new_total[t]++;
|
new_total[t]++;
|
||||||
stats();
|
stats();
|
||||||
svars->new_pending[t]++;
|
svars->new_pending[t]++;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user