Skip to content

1.2.71

Choose a tag to compare

@github-actions github-actions released this 22 Oct 03:16
· 27 commits to main since this release
Immutable release. Only release title and notes can be modified.
  • A manual start of a deferred @reboot job that arrives while the
    scheduler is launching another deferred @reboot job leaves the daemon
    running. The manual start counts as that job's boot run, and the scheduler
    doesn't run the job again.
  • The FreeBSD package's rc.d script starts the service. In /etc/rc.conf,
    cronstable_runas sets its account (whose primary group owns the state
    directory) and cronstable_args adds cronstable arguments; start warns
    while cronstable_user or cronstable_flags is set. An upgrade restarts a
    running service once its running jobs finish. An upgrade from 1.2.70 or
    earlier stops it, and the package reminds you to start an enabled, stopped
    service.
  • A mail report with starttls: true upgrades the connection with STARTTLS
    and fails when the server doesn't offer it. With tls and starttls both
    false (the default), mail and its login go unencrypted even when the
    server offers STARTTLS, and the config load warns about such a login to
    any host but localhost or a loopback address. A mail block with to and
    from that sets both, directly or through defaults:, is a config error.
  • When the system hostname contains a dot, a mail report's EHLO greeting
    gives that name as is and skips the DNS lookup, so a host that can't
    resolve its own name still sends its reports within the 60-second limit.
    For a hostname without a dot, the greeting carries the name that Python's
    socket.getfqdn() finds.
  • Secret redaction finds JWTs in time proportional to a line's length, so the
    daemon keeps scheduling and serving requests while it archives an output
    line made of many hyphen-joined eyJ runs. With redactArchivedSecrets
    on (the default), an archived line longer than 1,048,576 characters (1 MiB
    of ASCII text) is stored as ***REDACTED***.
  • An included file changes only the defaults that its own defaults: block
    or the files it includes set, and the other defaults of earlier includes
    stay in effect. A jobs-only YAML file or a classic crontab changes none.
  • A daemon running from a release binary reads its modules from that binary
    after a package upgrade replaces or deletes it, so it keeps sending reports
    until it restarts on the new binary, including while it finishes its
    running jobs.

Performance compared with 1.2.70

Regression check: passed. No compared metric exceeded its regression thresholds.

Both versions were benchmarked in alternating rounds on the same machine. Results use the lowest runtime and median memory usage across rounds. Negative changes mean less time or memory; positive changes mean more.

Benchmark comparisons (199 metrics)

Noise (±) estimates run-to-run variation across both versions. A result fails the regression check only if the increase exceeds its percentage limit, its minimum absolute change, and 2 times the noise estimate. When a result uses the lowest runtime and each version has three or more rounds, the median of the rounds must also increase by more than the percentage limit and the minimum absolute change. n/a means too few rounds to estimate noise; the other limits still apply.

The Regression limit column accounts for the minimum absolute change, expressed as a percentage of the baseline. Not enforced marks informational metrics.

Startup times include Python startup overhead. Their percentage changes exclude that overhead when it can be measured separately and leaves a positive runtime in both versions.

Benchmark 1.2.70 1.2.71 Change Noise (±) Regression limit
config.reload_warm_dir_1k 232.45 ms 75.80 ms -67.4% 2.5% 25%
webui.dirty_frame_rows_500 1.06 ms 1.27 ms +19.6% 26.3% Not enforced
webui.boot_rows_500 430.20 ms 467.10 ms +8.6% 3.9% Not enforced
schedule.duplicates_20k 17.92 ms 19.40 ms +8.3% 23.3% 55.8% (declared 15%)
config.parse_dir_cold_200 263.66 ms 248.05 ms -5.9% 1.2% 25%
config.parse_crontab_1k 12.13 ms 12.82 ms +5.7% 0.9% 82.43% (declared 15%)
webui.tick_500 87.40 ms 92.20 ms +5.5% 10.7% 25%
config.jobconfig_3k 47.16 ms 49.49 ms +4.9% 1.2% 21.2% (declared 15%)
webapi.sse_burst_20k 41.28 ms 43.21 ms +4.7% 2.0% 15%
dag.full_sweep_50x200 123.62 ms 129.00 ms +4.4% 9.2% 25%
config.reload_gc_100k 1.841 s 1.918 s +4.2% 1.1% 25%
prometheus.first_scrape_after_reload_500 182.62 ms 189.13 ms +3.6% 7.1% 15%
startup.import_config 115.21 ms 112.29 ms -3.4% 2.1% 25%
cronexpr.test_match_200k 25.23 ms 24.40 ms -3.3% 3.5% 39.64% (declared 15%)
startup.validate_config_100 190.25 ms 185.48 ms -3.0% 2.2% 25%
webapi.resources_poll_20x240 144.32 ms 140.06 ms -3.0% 1.7% 15%
dag.recover_plan_from_1k 108.92 ms 112.11 ms +2.9% 1.5% 15%
cronexpr.next_complex 14.94 ms 15.35 ms +2.8% 1.5% 66.95% (declared 15%)
loop.sla_pass_5k_x10 147.64 ms 151.55 ms +2.6% 10.5% 15%
schedule.pressure_20k_48h 17.57 ms 17.11 ms -2.6% 7.8% 56.93% (declared 15%)
startup.import_tui 112.07 ms 110.06 ms -2.6% 3.2% 25%
startup.import_daemon 203.22 ms 198.88 ms -2.6% 6.9% 25%
cronexpr.parse_complex 21.02 ms 21.55 ms +2.5% 1.1% 47.57% (declared 15%)
cronexpr.parse_simple 42.02 ms 41.02 ms -2.4% 2.1% 23.8% (declared 15%)
startup.import_cronexpr 28.38 ms 28.53 ms -2.3% 1.4% 25%
schedule.due_pass_100k 17.15 ms 16.75 ms -2.3% 3.5% 58.32% (declared 25%)
redact.adversarial_10k 35.76 ms 36.55 ms +2.2% 0.7% 27.97% (declared 15%)
cluster.parse_summaries_6k 83.29 ms 85.12 ms +2.2% 4.3% 15%
redact.clean_20k 20.51 ms 20.93 ms +2.0% 2.7% 48.76% (declared 15%)
tui.palette_type_5k 186.57 ms 190.33 ms +2.0% 3.0% 15%
startup.python_baseline 18.88 ms 19.25 ms +2.0% 6.0% Not enforced
state.boot_rehydrate_populated 40.63 ms 41.40 ms +1.9% 2.2% 24.61% (declared 15%)
state.append_1k 100.17 ms 98.29 ms -1.9% 1.5% 49.92% (declared 15%)
webui.select_move_500 65.20 ms 64.00 ms -1.8% 11.8% 25%
loop.stall_metrics_2000 28.27 ms 28.79 ms +1.8% 11.2% Not enforced
webapi.activity_build_500 175.61 ms 178.81 ms +1.8% 2.8% 15%
cronexpr.occurrences_1k 13.34 ms 13.58 ms +1.8% 1.3% 74.98% (declared 15%)
mem.gc_pause_100k 179.84 ms 182.98 ms +1.7% 3.0% 25%
job.report_noop_100k 49.87 ms 49.00 ms -1.7% 1.0% 15%
tui.poll_absorb_5k 89.16 ms 90.69 ms +1.7% 10.5% 15%
jobapi.sem_denied_64x10 62.89 ms 63.96 ms +1.7% 0.9% 25%
mcp.handle_200 147.86 ms 150.19 ms +1.6% 0.7% 15%
startup.jobcli_state_get 111.95 ms 110.87 ms -1.6% 3.9% 25%
redact.secrets_5k 20.25 ms 20.56 ms +1.5% 2.3% 49.38% (declared 15%)
webui.filter_keys_500 61.60 ms 62.50 ms +1.5% 1.0% 25%
mcp.query_metrics_500 133.52 ms 135.46 ms +1.5% 6.8% 25%
prometheus.counter_snapshot_2k 126.95 ms 128.68 ms +1.4% 8.5% 15%
dag.finish_fanin_20x1k 71.17 ms 72.10 ms +1.3% 1.2% 25%
dag.adopt_scan_500 79.22 ms 78.19 ms -1.3% 2.2% 25%
cronexpr.next_dst_2k 37.62 ms 38.09 ms +1.3% 3.8% 26.58% (declared 15%)
webui.sort_500 56.30 ms 55.60 ms -1.2% 7.6% 25%
dag.plan_claim_10k 14.56 ms 14.38 ms -1.2% 7.5% 68.69% (declared 15%)
tui.wallboard_paint_5k 183.30 ms 181.10 ms -1.2% 5.9% 15%
dag.list_runs_warm 10.92 ms 11.05 ms +1.2% 1.2% 25%
cluster.derive_cold_50 161.31 ms 159.44 ms -1.2% 0.6% 15%
dag.build_layered_10k 49.29 ms 49.86 ms +1.1% 2.1% 20.29% (declared 15%)
state.artifact_list_churn_x500 47.39 ms 46.87 ms -1.1% 1.8% 25%
webapi.sse_tail_pump_4x20k 106.73 ms 105.56 ms -1.1% 1.0% 15%
startup.version 58.76 ms 58.70 ms -1.1% 0.8% 25%
config.reload_warm_include_50 80.77 ms 79.90 ms -1.1% 2.2% 25%
mcp.list_jobs_page_500 139.63 ms 141.06 ms +1.0% 1.3% 15%
cluster.fleet_view_15x400 90.75 ms 89.83 ms -1.0% 2.5% 25%
webui.swim_400x49 81.30 ms 80.50 ms -1.0% 1.7% 25%
pools.admit_cycle_1k 144.30 ms 145.67 ms +1.0% 3.0% 25%
config.reload_warm_50 37.02 ms 36.67 ms -0.9% 2.1% 27.01% (declared 25%)
startup.job_set_id_100 191.44 ms 190.22 ms -0.9% 2.6% 25%
loop.stall_launch_herd_8k 79.79 ms 79.10 ms -0.9% 1.8% Not enforced
loop.idle_wake_rate 15.51 ms 15.65 ms +0.8% 0.6% 32.23% (declared 25%)
prometheus.render_500 16.77 ms 16.91 ms +0.8% 7.2% 59.63% (declared 15%)
ical.render_500x7d 49.01 ms 48.61 ms -0.8% 0.7% 20.4% (declared 15%)
tui.table_paint_5k 167.71 ms 166.34 ms -0.8% 1.1% 15%
tui.view_sort_5k 117.62 ms 116.66 ms -0.8% 3.7% 15%
webui.radar_walk_500x150 62.00 ms 61.50 ms -0.8% 1.3% 25%
state.derive_max_cold 23.95 ms 23.76 ms -0.8% 1.2% 41.75% (declared 15%)
webui.render_term_5k 106.75 ms 105.90 ms -0.8% 1.5% 25%
mcp.fleet_15x400 175.93 ms 174.58 ms -0.8% 3.0% 15%
schedule.cold_build_100k 471.50 ms 467.93 ms -0.8% 0.9% 15%
state.artifact_put_distinct_2k 45.25 ms 45.59 ms +0.7% 1.6% 25%
tui.dag_graph_paint_2k 227.57 ms 225.91 ms -0.7% 0.9% 15%
startup.daemon_first_pass_2k 1.403 s 1.393 s -0.7% 2.1% 25%
webui.render_rows_500 16.59 ms 16.47 ms -0.7% 1.7% 25%
config.interp_2k 63.38 ms 63.83 ms +0.7% 1.4% 15.78% (declared 15%)
fingerprint.job_set_id_rich_2k 233.80 ms 235.46 ms +0.7% 0.8% 15%
cronexpr.next_simple 36.79 ms 37.05 ms +0.7% 2.2% 27.18% (declared 15%)
dag.advance_quiescent_1k 73.45 ms 73.96 ms +0.7% 0.3% 25%
json.roundtrip_3k 561.29 ms 557.47 ms -0.7% 0.8% 15%
dag.list_dags_warm_x300 51.27 ms 51.61 ms +0.7% 2.0% 25%
json.roundtrip_orjson_3k 209.71 ms 211.11 ms +0.7% 1.2% 15%
webapi.dags_poll_1k 131.73 ms 132.59 ms +0.7% 0.6% 15%
schedule.next_fires_2k 22.99 ms 23.14 ms +0.6% 1.0% 43.5% (declared 15%)
job.launch_fail_retry_2k 161.21 ms 162.24 ms +0.6% 1.5% 15%
cluster.job_owner_2k 54.43 ms 54.08 ms -0.6% 0.9% 18.37% (declared 15%)
tui.log_restyle_5k 28.97 ms 29.15 ms +0.6% 1.8% 34.52% (declared 15%)
config.parse_yaml_rich_20 225.08 ms 223.74 ms -0.6% 0.8% 15%
dag.run_wide_500 110.89 ms 111.54 ms +0.6% 1.4% 25%
webui.palette_keys_500 51.10 ms 51.40 ms +0.6% 1.8% 25%
webui.logo_recovery 103.00 ms 103.60 ms +0.6% 0.6% 25%
webapi.summary_status_500 153.20 ms 154.08 ms +0.6% 1.0% 15%
state.fanout_gather_100 8.67 ms 8.72 ms +0.6% 3.9% 115.3% (declared 25%)
dag.run_chain_100 179.47 ms 180.43 ms +0.5% 1.1% 25%
dag.build_chain_10k 28.21 ms 28.36 ms +0.5% 4.1% 35.45% (declared 15%)
job.stream_passthrough_240k 143.31 ms 142.61 ms -0.5% 0.3% 15%
schedule.lint_2500_zoned 57.91 ms 58.19 ms +0.5% 0.6% 15%
push.fanout_8x100 153.37 ms 152.62 ms -0.5% 0.6% 15%
pools.enqueue_burst_200 140.41 ms 139.75 ms -0.5% 0.8% 25%
loop.stall_mcp_jobs_500 8.67 ms 8.71 ms +0.5% 3.5% Not enforced
webui.ledger_analyze_500x600 68.50 ms 68.20 ms -0.4% 1.1% 25%
resources.usage_from_dict_500 88.03 ms 88.41 ms +0.4% 3.0% 15%
schedule.reseed_100k 196.98 ms 196.14 ms -0.4% 1.9% 15%
tui.log_search_20k 13.36 ms 13.41 ms +0.4% 2.4% 74.86% (declared 15%)
tui.tail_ingest_30k 166.81 ms 166.13 ms -0.4% 1.4% 15%
state.artifact_get_newest 14.50 ms 14.44 ms -0.4% 2.0% 34.48% (declared 25%)
state.inventory_2k_streams 94.85 ms 95.23 ms +0.4% 1.7% Not enforced
state.list_records_2k 26.03 ms 26.13 ms +0.4% 3.5% 38.42% (declared 15%)
tui.drawer_paint_5k 96.38 ms 96.75 ms +0.4% 2.4% 15%
webui.timeline_500 53.70 ms 53.50 ms -0.4% 2.0% 25%
loop.stall_jobs_500 19.82 ms 19.89 ms +0.4% 1.8% Not enforced
webui.tail_term_2k 59.70 ms 59.50 ms -0.3% 6.1% 25%
cluster.peer_serve_400 156.09 ms 156.61 ms +0.3% 1.3% 15%
tui.fleet_paint_15x400 147.83 ms 147.35 ms -0.3% 1.1% 15%
webapi.auth_scope_20k 84.32 ms 84.60 ms +0.3% 0.5% 15%
schedule.reseed_local_20k 91.20 ms 91.50 ms +0.3% 3.2% 15%
fingerprint.job_set_id_10k 288.99 ms 289.92 ms +0.3% 1.3% 15%
state.artifact_get_oldest_2k 81.95 ms 81.69 ms -0.3% 0.4% 25%
state.depends_on_past_gate 2.60 ms 2.61 ms +0.3% 2.0% 76.94% (declared 25%)
webui.render_fleet_15x400 23.34 ms 23.27 ms -0.3% 1.2% 25%
dag.advance_quiescent_chain 72.64 ms 72.42 ms -0.3% 0.6% 25%
pair.qr_encode_14 258.54 ms 257.80 ms -0.3% 0.5% 15%
dag.fanin_barrier_1k 184.20 ms 184.72 ms +0.3% 4.4% 25%
statsd.emit_2k 13.73 ms 13.69 ms -0.3% 0.5% 72.83% (declared 25%)
json.loads_wide_int_2k 215.47 ms 214.87 ms -0.3% 1.2% 15%
resources.monitor_stop_100 305.04 ms 304.22 ms -0.3% 2.3% 25%
dag.gc_excess_60 83.10 ms 83.32 ms +0.3% 0.8% 25%
tui.week_rows_500 136.68 ms 137.03 ms +0.3% 2.4% 15%
webapi.jobs_payload_500 52.14 ms 52.00 ms -0.3% 1.0% 19.18% (declared 15%)
webapi.gzip_body_500 67.20 ms 67.03 ms -0.3% 0.4% 15%
jobapi.read_path_10k 126.03 ms 126.35 ms +0.3% 0.7% 15%
state.append_pruned_1k 65.89 ms 65.73 ms -0.2% 0.3% 25%
schedule.suggest_slot_5k_x20 75.80 ms 75.97 ms +0.2% 1.7% 15%
state.list_documents_600 61.72 ms 61.85 ms +0.2% 2.0% 19.44% (declared 15%)
config.parse_yaml_300 149.98 ms 150.29 ms +0.2% 0.4% 15%
state.list_records_warm 115.00 ms 115.22 ms +0.2% 2.4% 15%
mem.rss_daemon_web_100 53.61 MB 53.51 MB -0.2% 0.3% 25%
dag.mapped_drain_256 20.10 ms 20.14 ms +0.2% 1.1% 49.75% (declared 25%)
webui.dag_tasks_2k 52.50 ms 52.60 ms +0.2% 4.9% 25%
webui.rows_diff_500 55.80 ms 55.70 ms -0.2% 1.3% 25%
state.mutate_document_1k 145.27 ms 145.53 ms +0.2% 0.8% 34.42% (declared 25%)
cluster.poll_round_15x400 160.75 ms 161.02 ms +0.2% 2.1% 15%
startup.mcp_bridge 110.21 ms 110.43 ms -0.2% 3.0% 25%
webui.rows_layout_200 61.30 ms 61.40 ms +0.2% 2.3% 25%
state.gc_sweep_2k_streams 38.78 ms 38.71 ms -0.2% 2.6% 38.68% (declared 25%)
mem.rss_daemon_import 38.76 MB 38.82 MB +0.2% 0.0% 25%
state.derive_max_warm 151.03 ms 151.26 ms +0.2% 0.3% 15%
push.seal_500 92.54 ms 92.67 ms +0.1% 0.8% 15%
dag.advance_waiting_mapped_1k 127.57 ms 127.41 ms -0.1% 4.7% 25%
loop.stall_completions_500 8.55 ms 8.56 ms +0.1% 1.1% 58.48% (declared 25%)
state.kv_roundtrip_200 46.88 ms 46.83 ms -0.1% 1.7% 21.33% (declared 15%)
job.launch_reap_2k 142.88 ms 142.74 ms -0.1% 0.9% 15%
webapi.trends_build_5k 167.24 ms 167.37 ms +0.1% 3.9% 15%
job.stream_capture_120k 36.67 ms 36.69 ms +0.1% 1.2% 27.27% (declared 15%)
webapi.pools_poll_4x130 111.31 ms 111.24 ms -0.1% 4.9% 25%
mem.rss_daemon_10k 143.95 MB 144.03 MB +0.1% 0.0% 25%
mem.launch_reap_steady_20x55 0.38 MB 0.38 MB -0.0% 0.1% 15%
webapi.dag_run_poll_1k 92.49 ms 92.54 ms +0.0% 1.3% 25%
config.parse_yaml_3k 1.496 s 1.495 s -0.0% 0.8% 15%
push.seal_xwing_500 131.65 ms 131.67 ms +0.0% 0.6% 15%
mem.rss_version 14.54 MB 14.54 MB +0.0% 0.0% 25%
state.lease_renew_200 42.07 ms 42.06 ms -0.0% 1.3% 118.9% (declared 25%)
mem.parse_peak_rich_20 4.21 MB 4.21 MB +0.0% 0.0% 15%
mem.jobconfig_2k 1.59 MB 1.59 MB +0.0% 0.1% 31.48% (declared 15%)
mcp.list_jobs_500 141.48 ms 141.49 ms +0.0% 0.9% 15%
mem.gc_manifest_scan_128x2k 14.32 MB 14.32 MB -0.0% 0.0% 15%
tui.mark_idle_300 269.45 ms 269.46 ms +0.0% 1.1% 15%
mem.jobconfig_envfile_2k 16.34 MB 16.34 MB +0.0% 0.0% 15%
dag.run_doc_bytes_1k 228.53 KB 228.53 KB +0.0% 0.0% 5%
dag.mapped_doc_bytes_1k 725.81 KB 725.81 KB +0.0% 0.0% 5%
tui.frame_bytes_5k 60.22 KB 60.22 KB +0.0% 0.0% 15%
webui.log_count_5k 100.0 us 100.0 us +0.0% 0.0% 2000% (declared 25%)
webui.append_line_5k 13.0 us 13.0 us +0.0% 0.0% 25%
webui.week_walk_500x20 59.70 ms 59.70 ms +0.0% 1.2% 25%
webui.wallboard_poll_500 55.90 ms 55.90 ms +0.0% 5.2% 25%
webapi.jobs_bytes_500 181.42 KB 181.42 KB +0.0% 0.0% 15%
webapi.jobs_gzip_500 5.19 KB 5.19 KB +0.0% 0.0% 15%
webapi.activity_bytes_500 2569.83 KB 2569.83 KB +0.0% 0.0% 15%
webapi.activity_capped_bytes_500 411.18 KB 411.18 KB +0.0% 0.0% 15%
webapi.fleet_bytes_15x400 963.62 KB 963.62 KB +0.0% 0.0% 15%
webapi.index_bytes 657.38 KB 657.38 KB +0.0% 0.0% 15%
webapi.index_gzip_bytes 188.24 KB 188.24 KB +0.0% 0.0% 15%
cluster.peer_bytes_512 83.55 KB 83.55 KB +0.0% 0.0% 15%
prometheus.counter_snapshot_bytes_2k 620.59 KB 620.59 KB +0.0% 0.0% 15%
prometheus.exposition_bytes_500 821.17 KB 821.17 KB +0.0% 0.0% 15%
mcp.list_jobs_bytes_500 155.54 KB 155.54 KB +0.0% 0.0% 15%
mcp.fleet_bytes_15x400 2052.76 KB 2052.76 KB +0.0% 0.0% 15%
mcp.tools_list_bytes 20.09 KB 20.09 KB +0.0% 0.0% 15%
mem.crontab_10k 2.80 MB 2.80 MB +0.0% 0.0% 17.85% (declared 15%)
mem.retired_output_1k 0.12 MB 0.12 MB +0.0% 0.0% 15%
mem.run_history_series_5 9.58 MB 9.58 MB +0.0% 0.0% 15%
mem.cluster_view_50x400 11.64 MB 11.64 MB +0.0% 0.0% 15%
mem.tui_state_5k 2.24 MB 2.24 MB +0.0% 0.0% 15%

Full Changelog: 1.2.70...1.2.71