analyze: extend the dump command to accept patterns
The new function DumpPatterns() can be used to limit (drastically) the size of the data returned by PID1. Hence the optimization of serializing data into a file descriptor should be less relevant than having the possibility to limit the data when communicating with the service manager remotely. NB: when passing patterns, the dump command omits the version of the manager as well as the features and the timestamps.
This commit is contained in:
+16
-16
@@ -103,86 +103,86 @@ int main(int argc, char *argv[]) {
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "a.service", NULL, &a) >= 0);
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "b.service", NULL, &b) >= 0);
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "c.service", NULL, &c) >= 0);
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
manager_dump_units(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test1: (Trivial)\n");
|
||||
r = manager_add_job(m, JOB_START, c, JOB_REPLACE, NULL, &err, &j);
|
||||
if (sd_bus_error_is_set(&err))
|
||||
log_error("error: %s: %s", err.name, err.message);
|
||||
assert_se(r == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Load2:\n");
|
||||
manager_clear_jobs(m);
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "d.service", NULL, &d) >= 0);
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "e.service", NULL, &e) >= 0);
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
manager_dump_units(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test2: (Cyclic Order, Unfixable)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, d, JOB_REPLACE, NULL, NULL, &j) == -EDEADLK);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test3: (Cyclic Order, Fixable, Garbage Collector)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, e, JOB_REPLACE, NULL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test4: (Identical transaction)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, e, JOB_FAIL, NULL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Load3:\n");
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "g.service", NULL, &g) >= 0);
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
manager_dump_units(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test5: (Colliding transaction, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_FAIL, NULL, NULL, &j) == -EDEADLK);
|
||||
|
||||
printf("Test6: (Colliding transaction, replace)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, g, JOB_REPLACE, NULL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test7: (Unmergeable job type, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_FAIL, NULL, NULL, &j) == -EDEADLK);
|
||||
|
||||
printf("Test8: (Mergeable job type, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_RESTART, g, JOB_FAIL, NULL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test9: (Unmergeable job type, replace)\n");
|
||||
assert_se(manager_add_job(m, JOB_STOP, g, JOB_REPLACE, NULL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Load4:\n");
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "h.service", NULL, &h) >= 0);
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
manager_dump_units(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test10: (Unmergeable job type of auxiliary job, fail)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, h, JOB_FAIL, NULL, NULL, &j) == 0);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Load5:\n");
|
||||
manager_clear_jobs(m);
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "i.service", NULL, &i) >= 0);
|
||||
SERVICE(a)->state = SERVICE_RUNNING;
|
||||
SERVICE(d)->state = SERVICE_RUNNING;
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
manager_dump_units(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test11: (Start/stop job ordering, execution cycle)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, i, JOB_FAIL, NULL, NULL, &j) == 0);
|
||||
assert_se(unit_has_job_type(a, JOB_STOP));
|
||||
assert_se(unit_has_job_type(d, JOB_STOP));
|
||||
assert_se(unit_has_job_type(b, JOB_START));
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Load6:\n");
|
||||
manager_clear_jobs(m);
|
||||
assert_se(manager_load_startable_unit_or_warn(m, "a-conj.service", NULL, &a_conj) >= 0);
|
||||
SERVICE(a)->state = SERVICE_DEAD;
|
||||
manager_dump_units(m, stdout, "\t");
|
||||
manager_dump_units(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
printf("Test12: (Trivial cycle, Unfixable)\n");
|
||||
assert_se(manager_add_job(m, JOB_START, a_conj, JOB_REPLACE, NULL, NULL, &j) == -EDEADLK);
|
||||
manager_dump_jobs(m, stdout, "\t");
|
||||
manager_dump_jobs(m, stdout, /* patterns= */ NULL, "\t");
|
||||
|
||||
assert_se(!hashmap_get(unit_get_dependencies(a, UNIT_PROPAGATES_RELOAD_TO), b));
|
||||
assert_se(!hashmap_get(unit_get_dependencies(b, UNIT_RELOAD_PROPAGATED_FROM), a));
|
||||
|
||||
Reference in New Issue
Block a user