mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
Multiple subscribers or publishers per subsystem
Allow a subsystem to register to publish or subscribe a given message from multiple places. Part of ticket 29976.
This commit is contained in:
@@ -172,34 +172,20 @@ pubsub_cfg_dump(const pubsub_cfg_t *cfg, int severity, const char *prefix)
|
||||
|
||||
/**
|
||||
* Helper: fill a bitarray <b>out</b> with entries corresponding to the
|
||||
* subsystems listed in <b>items</b>. If any subsystem is listed more than
|
||||
* once, log a warning. Return 0 on success, -1 on failure.
|
||||
* subsystems listed in <b>items</b>.
|
||||
**/
|
||||
static int
|
||||
static void
|
||||
get_message_bitarray(const pubsub_adjmap_t *map,
|
||||
message_id_t msg,
|
||||
const smartlist_t *items,
|
||||
const char *operation,
|
||||
bitarray_t **out)
|
||||
{
|
||||
bool ok = true;
|
||||
*out = bitarray_init_zero((unsigned)map->n_subsystems);
|
||||
if (! items)
|
||||
return 0;
|
||||
return;
|
||||
|
||||
SMARTLIST_FOREACH_BEGIN(items, const pubsub_cfg_t *, cfg) {
|
||||
if (bitarray_is_set(*out, cfg->subsys)) {
|
||||
log_warn(LD_MESG|LD_BUG,
|
||||
"Message \"%s\" is configured to be %s by subsystem "
|
||||
"\"%s\" more than once.",
|
||||
get_message_id_name(msg), operation,
|
||||
get_subsys_id_name(cfg->subsys));
|
||||
ok = false;
|
||||
}
|
||||
bitarray_set(*out, cfg->subsys);
|
||||
} SMARTLIST_FOREACH_END(cfg);
|
||||
|
||||
return ok ? 0 : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -222,10 +208,8 @@ lint_message_graph(const pubsub_adjmap_t *map,
|
||||
bitarray_t *subscribed_by = NULL;
|
||||
bool ok = true;
|
||||
|
||||
if (get_message_bitarray(map, msg, pub, "published", &published_by) < 0)
|
||||
ok = false;
|
||||
if (get_message_bitarray(map, msg, sub, "subscribed", &subscribed_by) < 0)
|
||||
ok = false;
|
||||
get_message_bitarray(map, pub, &published_by);
|
||||
get_message_bitarray(map, sub, &subscribed_by);
|
||||
|
||||
/* Check whether any subsystem is publishing and subscribing the same
|
||||
* message. [??]
|
||||
|
||||
@@ -493,48 +493,6 @@ test_pubsub_build_sub_many(void *arg)
|
||||
tor_free(sysname);
|
||||
}
|
||||
|
||||
/* The same subsystem can only declare one publish or subscribe. */
|
||||
static void
|
||||
test_pubsub_build_pubsub_redundant(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
pubsub_builder_t *b = NULL;
|
||||
dispatch_t *dispatcher = NULL;
|
||||
pubsub_connector_t *c = NULL;
|
||||
|
||||
b = pubsub_builder_new();
|
||||
seed_pubsub_builder_basic(b);
|
||||
pub_binding_t btmp;
|
||||
|
||||
{
|
||||
c = pubsub_connector_for_subsystem(b, get_subsys_id("sys2"));
|
||||
DISPATCH_ADD_SUB(c, main, bunch_of_coconuts);
|
||||
pubsub_add_pub_(c, &btmp, get_channel_id("main"),
|
||||
get_message_id("yes_we_have_no"),
|
||||
get_msg_type_id("string"),
|
||||
0 /* flags */,
|
||||
"somewhere.c", 22);
|
||||
pubsub_connector_free(c);
|
||||
};
|
||||
|
||||
setup_full_capture_of_logs(LOG_WARN);
|
||||
dispatcher = pubsub_builder_finalize(b, NULL);
|
||||
b = NULL;
|
||||
tt_assert(dispatcher == NULL);
|
||||
|
||||
expect_log_msg_containing(
|
||||
"Message \"yes_we_have_no\" is configured to be published by "
|
||||
"subsystem \"sys2\" more than once.");
|
||||
expect_log_msg_containing(
|
||||
"Message \"bunch_of_coconuts\" is configured to be subscribed by "
|
||||
"subsystem \"sys2\" more than once.");
|
||||
|
||||
done:
|
||||
pubsub_builder_free(b);
|
||||
dispatch_free(dispatcher);
|
||||
teardown_capture_of_logs();
|
||||
}
|
||||
|
||||
/* It's fine to declare the excl flag. */
|
||||
static void
|
||||
test_pubsub_build_excl_ok(void *arg)
|
||||
@@ -614,7 +572,6 @@ struct testcase_t pubsub_build_tests[] = {
|
||||
T(pubsub_same, TT_FORK),
|
||||
T(pubsub_multi, TT_FORK),
|
||||
T(sub_many, TT_FORK),
|
||||
T(pubsub_redundant, TT_FORK),
|
||||
T(excl_ok, TT_FORK),
|
||||
T(excl_bad, TT_FORK),
|
||||
END_OF_TESTCASES
|
||||
|
||||
Reference in New Issue
Block a user