Skip to content

Commit

Permalink
calalarmd: don't process servers or users with replicaonly state
Browse files Browse the repository at this point in the history
  • Loading branch information
brong committed Dec 20, 2023
1 parent aa965b2 commit 463fdd7
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 4 deletions.
2 changes: 1 addition & 1 deletion imap/calalarmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ int main(int argc, char **argv)
struct timeval start, end;
double totaltime;
int tosleep;
time_t interval = 1;
time_t interval = 10;

signals_poll();

Expand Down
17 changes: 14 additions & 3 deletions imap/caldav_alarm.c
Original file line number Diff line number Diff line change
Expand Up @@ -2012,6 +2012,10 @@ EXPORTED int caldav_alarm_process(time_t runtime, time_t *intervalp, int dryrun)
{
int i;

// we don't process alarms on replicas
if (config_getswitch(IMAPOPT_REPLICAONLY))
return 0;

syslog(LOG_DEBUG, "processing alarms");

if (!runtime) {
Expand Down Expand Up @@ -2042,6 +2046,7 @@ EXPORTED int caldav_alarm_process(time_t runtime, time_t *intervalp, int dryrun)
int skipped_some = 0;
int did_some = 0;
int num_user_records = 0;
int skip_user = 0;
char *userid = NULL;
struct mboxlock *nslock = NULL;
for (i = 0; i < rock.list.count; i++) {
Expand All @@ -2058,13 +2063,20 @@ EXPORTED int caldav_alarm_process(time_t runtime, time_t *intervalp, int dryrun)
// userid will be next to each other
if (strcmpsafe(userid, mbname_userid(mbname))) {
num_user_records = 0;
skip_user = 0;
free(userid);
mboxname_release(&nslock);
userid = xstrdup(mbname_userid(mbname));
if (user_isreplicaonly(userid)) {
skip_user = 1;
continue;
}
nslock = user_namespacelock_full(userid, LOCK_NONBLOCKING);
}
mbname_free(&mbname);

if (skip_user) continue;

// if we failed to lock the user, or have done too many for this user, skip
if (!nslock || ++num_user_records > MAX_CONSECUTIVE_ALARMS_PER_USER) {
skipped_some++;
Expand All @@ -2083,7 +2095,8 @@ EXPORTED int caldav_alarm_process(time_t runtime, time_t *intervalp, int dryrun)
mboxname_release(&nslock);

// if we both made some progress AND skipped some, then retry again immediately
if (did_some && skipped_some) rock.next = runtime;
if (did_some && skipped_some) *intervalp = 0;
else *intervalp = rock.next - runtime;
}
else {
// we're testing or reconstructing, run everything!
Expand All @@ -2099,8 +2112,6 @@ EXPORTED int caldav_alarm_process(time_t runtime, time_t *intervalp, int dryrun)

syslog(LOG_DEBUG, "done");

if (intervalp) *intervalp = rock.next - runtime;

return rc;
}

Expand Down

0 comments on commit 463fdd7

Please sign in to comment.