summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-07-22 23:51:18 +0300
committerPaul Buetow <paul@buetow.org>2026-07-22 23:51:18 +0300
commit849951be1d1a7ee9f9302006ccb187bf5b4e36f3 (patch)
tree496c924a03a9ea6212e29bb4699e268066ebad81
parentbf78b3abffee6d49c08ca2980156afc455994969 (diff)
feat: DTail fork — server/client feature development
Squashed development of the snonux/dtail fork's product code (internal/, cmd/) since diverging from mimecast/dtail. Major areas: - Read/output path: the former "turbo" channel-less path is now the single, default server-side read/output path for cat/grep/tail and MapReduce; the old channel-based path and its config/env toggles were removed. - MapReduce: single aggregate implementation (server + serverless) fed directly by a processor pipeline, with input-exhausted finalization via the shutdown coordinator; high-concurrency and data-race fixes. - Journal source reads (journal:unit.service) via journalctl, Linux-gated behind a journal-v1 capability. - Auth-key fast reconnect: in-memory per-user public-key cache with TTL/max-keys, registered over an authenticated session (AUTHKEY), checked before authorized_keys. - Interactive query reload (--interactive-query) with SESSION START/UPDATE generation boundaries and capability negotiation. - Client-side deadlines: --timeout / --shutdownAfter as context deadlines; follow shutdown handling. - Client logging: diagnostics-only daily log by default, opt-in payload tee via --log-payload. - Numerous correctness fixes (buffer-pool double-recycle races, EOF-sentinel leaks, glob-expansion cap, TOCTOU in CSV parsing) with accompanying unit tests. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
-rw-r--r--cmd/dcat/main.go52
-rw-r--r--cmd/dgrep/main.go51
-rw-r--r--cmd/dmap/main.go54
-rw-r--r--cmd/dserver/main.go60
-rw-r--r--cmd/dtail-tools/main.go60
-rw-r--r--cmd/dtail/main.go112
-rw-r--r--cmd/dtail/main_test.go66
-rw-r--r--cmd/dtailhealth/main.go44
-rw-r--r--go.mod10
-rw-r--r--go.sum16
-rw-r--r--internal/cli/authkeyflags.go43
-rw-r--r--internal/cli/authkeyflags_test.go94
-rw-r--r--internal/cli/pprof.go119
-rw-r--r--internal/cli/pprof_test.go41
-rw-r--r--internal/cli/runtime.go104
-rw-r--r--internal/cli/runtime_test.go71
-rw-r--r--internal/clients/baseclient.go213
-rw-r--r--internal/clients/baseclient_retry_test.go280
-rw-r--r--internal/clients/catclient.go24
-rw-r--r--internal/clients/client_benchmark_test.go136
-rw-r--r--internal/clients/connectors/connector.go18
-rw-r--r--internal/clients/connectors/serverconnection.go248
-rw-r--r--internal/clients/connectors/serverconnection_test.go880
-rw-r--r--internal/clients/connectors/serverless.go213
-rw-r--r--internal/clients/connectors/sessiontransport.go213
-rw-r--r--internal/clients/grepclient.go24
-rw-r--r--internal/clients/handlers/basehandler.go319
-rw-r--r--internal/clients/handlers/basehandler_test.go356
-rw-r--r--internal/clients/handlers/clienthandler.go15
-rw-r--r--internal/clients/handlers/handler.go6
-rw-r--r--internal/clients/handlers/healthhandler.go13
-rw-r--r--internal/clients/handlers/maprhandler.go55
-rw-r--r--internal/clients/handlers/maprhandler_test.go278
-rw-r--r--internal/clients/healthclient.go22
-rw-r--r--internal/clients/interactive_control.go425
-rw-r--r--internal/clients/interactive_control_test.go641
-rw-r--r--internal/clients/maker.go8
-rw-r--r--internal/clients/maprclient.go269
-rw-r--r--internal/clients/maprclient_test.go153
-rw-r--r--internal/clients/query_regex.go30
-rw-r--r--internal/clients/runtime_boundary.go219
-rw-r--r--internal/clients/runtime_boundary_test.go89
-rw-r--r--internal/clients/session_spec.go14
-rw-r--r--internal/clients/session_spec_test.go147
-rw-r--r--internal/clients/stats.go28
-rw-r--r--internal/clients/tailclient.go25
-rw-r--r--internal/color/brush/brush.go30
-rw-r--r--internal/color/brush/brush_test.go90
-rw-r--r--internal/color/color.go6
-rw-r--r--internal/config/args.go47
-rw-r--r--internal/config/args_test.go95
-rw-r--r--internal/config/client.go41
-rw-r--r--internal/config/common.go3
-rw-r--r--internal/config/config.go13
-rw-r--r--internal/config/env.go10
-rw-r--r--internal/config/initializer.go87
-rw-r--r--internal/config/initializer_test.go260
-rw-r--r--internal/config/runtime.go18
-rw-r--r--internal/config/server.go89
-rw-r--r--internal/ctxutil/sleep.go29
-rw-r--r--internal/ctxutil/sleep_test.go32
-rw-r--r--internal/discovery/comma.go15
-rw-r--r--internal/discovery/discovery.go34
-rw-r--r--internal/discovery/discovery_test.go176
-rw-r--r--internal/io/dlog/dlog.go226
-rw-r--r--internal/io/dlog/dlog_test.go54
-rw-r--r--internal/io/dlog/loggers/file.go122
-rw-r--r--internal/io/dlog/loggers/file_test.go183
-rw-r--r--internal/io/dlog/loggers/fout.go68
-rw-r--r--internal/io/dlog/loggers/fout_test.go199
-rw-r--r--internal/io/dlog/loggers/stdout.go86
-rw-r--r--internal/io/dlog/loggers/stdout_test.go190
-rw-r--r--internal/io/dlog/rawlog_test.go76
-rw-r--r--internal/io/dlog/rotation.go26
-rw-r--r--internal/io/dlog/rotation_test.go61
-rw-r--r--internal/io/fs/catfile.go14
-rw-r--r--internal/io/fs/filereader.go8
-rw-r--r--internal/io/fs/permissions/permission.go1
-rw-r--r--internal/io/fs/permissions/permission_linuxacl.go1
-rw-r--r--internal/io/fs/permissions/permission_test.go1
-rw-r--r--internal/io/fs/readfile.go238
-rw-r--r--internal/io/fs/readfile_nozstd.go16
-rw-r--r--internal/io/fs/readfile_processor.go359
-rw-r--r--internal/io/fs/readfile_processor_optimized.go430
-rw-r--r--internal/io/fs/readfile_processor_test.go869
-rw-r--r--internal/io/fs/readfile_zstd.go20
-rw-r--r--internal/io/fs/readfilelcontext.go209
-rw-r--r--internal/io/fs/rootedpath.go96
-rw-r--r--internal/io/fs/rootedpath_test.go57
-rw-r--r--internal/io/fs/tailfile.go14
-rw-r--r--internal/io/fs/validatedreadtarget.go148
-rw-r--r--internal/io/fs/validatedreadtarget_test.go218
-rw-r--r--internal/io/journal/filter.go253
-rw-r--r--internal/io/journal/reader.go303
-rw-r--r--internal/io/journal/reader_test.go754
-rw-r--r--internal/io/journal/reader_unsupported.go45
-rw-r--r--internal/io/journal/testhelper/mock.go397
-rw-r--r--internal/io/journal/testhelper/mock_test.go247
-rw-r--r--internal/io/line/line.go18
-rw-r--r--internal/io/line/processor.go22
-rw-r--r--internal/io/pool/bytesbuffer.go4
-rw-r--r--internal/io/pool/scanner_pool.go85
-rw-r--r--internal/io/signal/signal.go45
-rw-r--r--internal/mapr/aggregateset.go22
-rw-r--r--internal/mapr/client/aggregate.go73
-rw-r--r--internal/mapr/client/aggregate_test.go96
-rw-r--r--internal/mapr/client/session_state.go95
-rw-r--r--internal/mapr/client/session_state_test.go81
-rw-r--r--internal/mapr/funcs/function.go64
-rw-r--r--internal/mapr/funcs/function_test.go114
-rw-r--r--internal/mapr/globalgroupset.go11
-rw-r--r--internal/mapr/globalgroupset_test.go95
-rw-r--r--internal/mapr/groupset.go133
-rw-r--r--internal/mapr/groupset_avg_nan_test.go79
-rw-r--r--internal/mapr/groupset_ordering_test.go125
-rw-r--r--internal/mapr/groupset_percentage_test.go143
-rw-r--r--internal/mapr/groupsetresult.go108
-rw-r--r--internal/mapr/groupsetresult_renderer_test.go113
-rw-r--r--internal/mapr/logformat/csv.go97
-rw-r--r--internal/mapr/logformat/csv_test.go170
-rw-r--r--internal/mapr/logformat/custom1.go5
-rw-r--r--internal/mapr/logformat/custom2.go5
-rw-r--r--internal/mapr/logformat/default.go239
-rw-r--r--internal/mapr/logformat/default_benchmark_test.go44
-rw-r--r--internal/mapr/logformat/default_test.go42
-rw-r--r--internal/mapr/logformat/delimited.go12
-rw-r--r--internal/mapr/logformat/generic.go15
-rw-r--r--internal/mapr/logformat/generickv.go36
-rw-r--r--internal/mapr/logformat/mimecast.go5
-rw-r--r--internal/mapr/logformat/parser.go123
-rw-r--r--internal/mapr/logformat/parser_test.go69
-rw-r--r--internal/mapr/logformat/variables.go107
-rw-r--r--internal/mapr/logformat/variables_test.go145
-rw-r--r--internal/mapr/parserfieldplan.go81
-rw-r--r--internal/mapr/parserfieldplan_test.go32
-rw-r--r--internal/mapr/query.go29
-rw-r--r--internal/mapr/query_test.go83
-rw-r--r--internal/mapr/queryvariables.go92
-rw-r--r--internal/mapr/queryvariables_test.go78
-rw-r--r--