Merge branch 'maint-0.3.4' into release-0.3.4

This commit is contained in:
Nick Mathewson 2018-08-07 08:05:56 -04:00
commit 258759547b
3 changed files with 13 additions and 10 deletions

6
changes/bug27003 Normal file
View File

@ -0,0 +1,6 @@
o Major bugfixes (event scheduler):
- When we enable a periodic event, schedule it in the event loop
rather than running it immediately. Previously, we would re-run
periodic events immediately in the middle of (for example)
changing our options, with unpredictable effects. Fixes bug
27003; bugfix on 0.3.4.1-alpha.

View File

@ -140,8 +140,8 @@ periodic_event_destroy(periodic_event_item_t *event)
event->last_action_time = 0; event->last_action_time = 0;
} }
/** Enable the given event which means the event is launched and then the /** Enable the given event by setting its "enabled" flag and scheduling it to
* event's enabled flag is set. This can be called for an event that is * run immediately in the event loop. This can be called for an event that is
* already enabled. */ * already enabled. */
void void
periodic_event_enable(periodic_event_item_t *event) periodic_event_enable(periodic_event_item_t *event)
@ -152,7 +152,9 @@ periodic_event_enable(periodic_event_item_t *event)
return; return;
} }
periodic_event_launch(event); tor_assert(event->ev);
event->enabled = 1;
mainloop_event_activate(event->ev);
} }
/** Disable the given event which means the event is destroyed and then the /** Disable the given event which means the event is destroyed and then the
@ -169,4 +171,3 @@ periodic_event_disable(periodic_event_item_t *event)
mainloop_event_cancel(event->ev); mainloop_event_cancel(event->ev);
event->enabled = 0; event->enabled = 0;
} }

View File

@ -106,11 +106,11 @@ test_pe_launch(void *arg)
periodic_event_item_t *item = &periodic_events[i]; periodic_event_item_t *item = &periodic_events[i];
if (item->roles & PERIODIC_EVENT_ROLE_CLIENT) { if (item->roles & PERIODIC_EVENT_ROLE_CLIENT) {
tt_int_op(periodic_event_is_enabled(item), OP_EQ, 1); tt_int_op(periodic_event_is_enabled(item), OP_EQ, 1);
tt_u64_op(item->last_action_time, OP_NE, 0);
} else { } else {
tt_int_op(periodic_event_is_enabled(item), OP_EQ, 0); tt_int_op(periodic_event_is_enabled(item), OP_EQ, 0);
tt_u64_op(item->last_action_time, OP_EQ, 0);
} }
// enabled or not, the event has not yet been run.
tt_u64_op(item->last_action_time, OP_EQ, 0);
} }
/* Remove Client but become a Relay. */ /* Remove Client but become a Relay. */
@ -127,12 +127,9 @@ test_pe_launch(void *arg)
/* Only Client role should be disabled. */ /* Only Client role should be disabled. */
if (item->roles == PERIODIC_EVENT_ROLE_CLIENT) { if (item->roles == PERIODIC_EVENT_ROLE_CLIENT) {
tt_int_op(periodic_event_is_enabled(item), OP_EQ, 0); tt_int_op(periodic_event_is_enabled(item), OP_EQ, 0);
/* Was previously enabled so they should never be to 0. */
tt_u64_op(item->last_action_time, OP_NE, 0);
} }
if (item->roles & PERIODIC_EVENT_ROLE_RELAY) { if (item->roles & PERIODIC_EVENT_ROLE_RELAY) {
tt_int_op(periodic_event_is_enabled(item), OP_EQ, 1); tt_int_op(periodic_event_is_enabled(item), OP_EQ, 1);
tt_u64_op(item->last_action_time, OP_NE, 0);
} }
/* Non Relay role should be disabled, except for Dirserver. */ /* Non Relay role should be disabled, except for Dirserver. */
if (!(item->roles & roles)) { if (!(item->roles & roles)) {
@ -330,4 +327,3 @@ struct testcase_t periodic_event_tests[] = {
END_OF_TESTCASES END_OF_TESTCASES
}; };