From 22a2ccc0e4f0bb4c27c984a72192b3f72b8f465a Mon Sep 17 00:00:00 2001 From: mkuchenbecker Date: Fri, 22 May 2026 17:15:10 -0700 Subject: [PATCH] docs(optimizer-analyzer): add architecture + sequence diagrams MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Component and sequence diagrams for the Optimizer Analyzer (apps/optimizer-analyzer/). Source is PlantUML; PNGs are committed so GitHub renders the markdown without extra tooling. The doc describes the analyzer as introduced in PR #533 (mkuchenb/ optimizer-3). It lands on main as forward-looking documentation; the referenced symbols (TableOperationsHistoryDto::after, CadencePolicy:: intervalFor, @Transactional analyzeDatabase) come online when PR #533 merges. Files: - apps/optimizer-analyzer/docs/architecture.md — narrative + diagrams - apps/optimizer-analyzer/docs/diagrams/component.puml + .png - apps/optimizer-analyzer/docs/diagrams/sequence.puml + .png Sequence diagram iterated for correctness against the actual source on mkuchenb/optimizer-3: 3 pre-load reads in (ops, history, stats) order, three-branch CadencePolicy alt (active op / no history / has history), per-row try/catch+continue with aggregate INFO log per database. Co-Authored-By: Claude Opus 4.7 --- apps/optimizer-analyzer/docs/architecture.md | 70 ++++++++++++++++ .../docs/diagrams/component.png | Bin 0 -> 35740 bytes .../docs/diagrams/component.puml | 45 ++++++++++ .../docs/diagrams/sequence.png | Bin 0 -> 92516 bytes .../docs/diagrams/sequence.puml | 79 ++++++++++++++++++ 5 files changed, 194 insertions(+) create mode 100644 apps/optimizer-analyzer/docs/architecture.md create mode 100644 apps/optimizer-analyzer/docs/diagrams/component.png create mode 100644 apps/optimizer-analyzer/docs/diagrams/component.puml create mode 100644 apps/optimizer-analyzer/docs/diagrams/sequence.png create mode 100644 apps/optimizer-analyzer/docs/diagrams/sequence.puml diff --git a/apps/optimizer-analyzer/docs/architecture.md b/apps/optimizer-analyzer/docs/architecture.md new file mode 100644 index 000000000..ccd71b6e2 --- /dev/null +++ b/apps/optimizer-analyzer/docs/architecture.md @@ -0,0 +1,70 @@ +# Optimizer Analyzer — Architecture + +The Optimizer Analyzer is a batch process that decides which tables need a maintenance operation scheduled. It is **not** a continuously running service — it is a Spring Boot `CommandLineRunner` invoked per process invocation (typically on a cron). One pass evaluates every table opted in to a given operation type and writes a `PENDING` row to the optimizer DB for each table that needs work. The Scheduler picks those rows up on its own cadence. + +This document describes the components, dependencies, and the per-pass call flow. + +## Component view + +![Optimizer Analyzer component view](diagrams/component.png) + +| Component | Role | +|---|---| +| `AnalyzerApplication` | Spring Boot entry point. `@SpringBootApplication` + `CommandLineRunner` that invokes `AnalyzerRunner.analyze(operationType)` once per registered `OperationAnalyzer` per process. | +| `AnalyzerRunner` | The per-pass orchestrator. Resolves the matching analyzer for an operation type, fans out across databases, and per database pre-loads three intermediate maps before evaluating each table. | +| `OperationAnalyzer` (interface) | Strategy interface. Each implementation declares (a) which `OperationType` it handles, (b) `isEnabled(table)` — the per-table opt-in check, and (c) `shouldSchedule(table, currentOp?, latestHistory?)` — the per-table decision. | +| `CadenceBasedOrphanFilesDeletionAnalyzer` | First implementation. Opts in via the `maintenance.optimizer.ofd.enabled` table property. Delegates the cadence decision to `CadencePolicy`. | +| `CadencePolicy` | Time-based scheduling policy. Stays out of any table that already has a non-`CANCELED` active operation; for others, decides re-scheduling eligibility from the most recent completed-history entry using configurable success/failure retry intervals. | +| `TableOperationsRepository`, `TableOperationsHistoryRepository`, `TableStatsRepository` | Defined in `services/optimizer` and shared with the analyzer / scheduler apps via the `apps/optimizer` shared module. The analyzer reads from all three and writes only to `TableOperationsRepository`. | + +The analyzer never talks to the Scheduler directly. The contract between them is the `table_operations` table in MySQL — the analyzer inserts `PENDING` rows; the scheduler claims them. + +## Sequence view + +The sequence below covers **one operation type, one analyzer pass**, fanned out across all databases. The `CommandLineRunner` repeats this loop once per registered `OperationAnalyzer` per process startup. + +![Optimizer Analyzer sequence view](diagrams/sequence.png) + +### Phases + +**Per-process startup.** `AnalyzerRunner.analyze(operationType)` resolves the matching analyzer (throws `IllegalStateException` if none is registered for the given type) and calls `statsRepo.findDistinctDatabaseNames()` for the fan-out list. If `analyze(...)` is called with an explicit `databaseName` filter, the fan-out is a singleton list and `findDistinctDatabaseNames` is not called. + +**Per-database fan-out.** Each database is processed in its own `@Transactional` `analyzeDatabase(...)` call. The transaction boundary spans the three pre-load reads and the per-table save loop, giving a consistent snapshot of (current operations, latest history, tables) across the iteration. The working set is bounded by tables-per-db rather than tables-total. + +**Pre-load: three reads.** Inside the transaction, three queries load the intermediate maps once per database: + +1. `operationsRepo.find(opType, *, *, db, *, *, *, page)` → `Map` — current active operations for this op type in this database. The collector uses `TableOperationDto::mostRecent` as the merge function so duplicate rows (which the scheduler dedups separately) resolve to the most recent. +2. `historyRepo.findLatest(opType, page)` → `Map` — latest completed-history entry per table. Collector merge uses `TableOperationsHistoryDto::after` (which trusts the service-set `completedAt` invariant). +3. `statsRepo.find(db, *, *, page)` → `List` — the candidate tables in this database. + +**Per-table evaluation.** For each table: + +1. `analyzer.isEnabled(table)` — skip if the table is not opted in to this operation type. +2. `analyzer.shouldSchedule(table, currentOp?, latestHistory?)` — for the cadence-based analyzer this delegates to `CadencePolicy.shouldSchedule`, which has three branches: + - **Active non-`CANCELED` `currentOp`:** return `false` — the scheduler owns this row. + - **No active (or `CANCELED`) `currentOp` + no history:** return `true` — first-time / post-cancel; schedule. + - **No active (or `CANCELED`) `currentOp` + history present:** return `true` if `now − completedAt > intervalFor(status)` (where `intervalFor` is `successRetryInterval` on `SUCCESS`, `failureRetryInterval` on `FAILED`; a switch with throwing default surfaces any new `HistoryStatusDto` value as a runtime error rather than silently bucketing it). +3. On `true`, save a new `PENDING` row via `operationsRepo.save(...)`. The save is wrapped in `try { ... } catch (RuntimeException) { log.error; continue; }` — a single bad row never aborts the rest of the database's iteration. Per-row outcomes increment `created` or `failed`, logged as a single aggregate `INFO` line per database at the end. + +**Per-table logs are at `DEBUG` level.** The per-database aggregate is at `INFO`. This keeps INFO-level output bounded by `databases × operation_types`, not `tables × operation_types`. + +## Concurrent-instance contract + +Two analyzer instances running concurrently against the same MySQL **may** both insert a `PENDING` row for the same `(tableUuid, operationType)` — there is no uniqueness constraint on `table_operations`, and multiple PENDING/SCHEDULING/SCHEDULED rows for the same table are intentionally allowed. The dedup mechanism is `SchedulerRunner.cancelDuplicates`, which runs per scheduling cycle. The analyzer's own logic does not coordinate with itself or with the scheduler beyond the read snapshot. + +## Configuration + +| Property | Default | Effect | +|---|---|---| +| `ofd.success-retry-hours` | `16` | Hours to wait after a `SUCCESS` history entry before re-evaluating. Configured below 24h so at least one re-evaluation is guaranteed in any rolling 24-hour window regardless of when the prior run landed. | +| `ofd.failure-retry-hours` | `1` | Hours to wait after a `FAILED` history entry before retrying. Shorter than success so transient failures recover quickly. | +| `optimizer.repo.default-limit` | `10000` | Per-query LIMIT on the three pre-load reads. `Pageable` cascades to `LIMIT n` in SQL. | +| `maintenance.optimizer.ofd.enabled` (table property, not app config) | (absent) | Per-table opt-in for OFD. Must equal the string `"true"` for `isEnabled` to return `true`. | + +## Source of truth + +- Renderable PlantUML sources: [`diagrams/component.puml`](diagrams/component.puml), [`diagrams/sequence.puml`](diagrams/sequence.puml). +- The diagrams describe the analyzer as implemented in `apps/optimizer-analyzer` (introduced in PR #533). +- Open scale-test work: [BDP-102738](https://linkedin.atlassian.net/browse/BDP-102738). +- Open OTel-metrics work for both analyzer + scheduler: [BDP-102737](https://linkedin.atlassian.net/browse/BDP-102737). +- Open MySQL TX-validation work: [BDP-102739](https://linkedin.atlassian.net/browse/BDP-102739). diff --git a/apps/optimizer-analyzer/docs/diagrams/component.png b/apps/optimizer-analyzer/docs/diagrams/component.png new file mode 100644 index 0000000000000000000000000000000000000000..422098b37192497a554cc3fee3537a9e1da2d34c GIT binary patch literal 35740 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 Runner : invokes once per\nregistered analyzer +Runner --> IfaceAnalyzer : isEnabled / shouldSchedule +OFD ..|> IfaceAnalyzer +OFD --> Policy : delegate cadence decision + +Runner --> StatsRepo : findDistinctDatabaseNames,\nfind(filters) +Runner --> OpsRepo : read currentOps,\nsave PENDING +Runner --> HistRepo : read latestHistory + +OpsRepo --> DB +HistRepo --> DB +StatsRepo --> DB + +note right of DB + Scheduler reads PENDING rows + from here on its own cadence; + the analyzer never talks to the + scheduler directly. +end note + +@enduml diff --git a/apps/optimizer-analyzer/docs/diagrams/sequence.png b/apps/optimizer-analyzer/docs/diagrams/sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..645a172768e596824af0e87457cbc8283858a6c3 GIT binary patch literal 92516 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 literal 0 HcmV?d00001 diff --git a/apps/optimizer-analyzer/docs/diagrams/sequence.puml b/apps/optimizer-analyzer/docs/diagrams/sequence.puml new file mode 100644 index 000000000..2f2c22a6d --- /dev/null +++ b/apps/optimizer-analyzer/docs/diagrams/sequence.puml @@ -0,0 +1,79 @@ +@startuml sequence +title Optimizer Analyzer — Sequence (one OperationType, one analyzer pass) + +skinparam shadowing false +skinparam defaultFontName Helvetica +skinparam sequenceMessageAlign center + +actor "Spring Boot\nCommandLineRunner" as CLR +participant AnalyzerRunner as Runner +participant "OperationAnalyzer\n(CadenceBased OFD)" as Analyzer +participant CadencePolicy as Policy +participant TableOperationsRepository as OpsRepo +participant TableOperationsHistoryRepository as HistRepo +participant TableStatsRepository as StatsRepo +database MySQL + +== Per-process startup == +CLR -> Runner : analyze(operationType) +activate Runner +Runner -> Runner : lookup analyzer by operationType\n(IllegalStateException if none) +Runner -> StatsRepo : findDistinctDatabaseNames() +StatsRepo -> MySQL : SELECT DISTINCT database_name\nFROM table_stats +StatsRepo --> Runner : List dbs + +== Per-database fan-out == +loop for each database + Runner -> Runner : analyzeDatabase(...)\n[@Transactional] + activate Runner #LightBlue + + group Pre-load: 3 reads bounded by tables-per-db + Runner -> OpsRepo : find(opType, *, *, db, *, *, *, page) + OpsRepo -> MySQL : SELECT * FROM table_operations\nWHERE operation_type=? AND database_name=? + OpsRepo --> Runner : currentOps : Map + + Runner -> HistRepo : findLatest(opType, page) + HistRepo -> MySQL : SELECT latest-per-table\nFROM table_operations_history + HistRepo --> Runner : latestHistory : Map + + Runner -> StatsRepo : find(db, *, *, page) + StatsRepo -> MySQL : SELECT * FROM table_stats\nWHERE database_name=? + StatsRepo --> Runner : tables : List + end + + group Per-table evaluation (continue on per-row failure) + loop for each table in this db + Runner -> Analyzer : isEnabled(table) + Analyzer --> Runner : enabled? + alt not enabled + note over Runner : continue + else enabled + Runner -> Analyzer : shouldSchedule(table, currentOp?, latestHistory?) + Analyzer -> Policy : shouldSchedule(currentOp?, latestHistory?) + alt active non-CANCELED currentOp + Policy --> Analyzer : false\n(scheduler owns this row) + else no currentOp (or CANCELED), no history + Policy --> Analyzer : true\n(first-time / post-cancel) + else no currentOp (or CANCELED), has history + Policy -> Policy : readyAfterHistoryEntry:\nnow - completedAt > intervalFor(status) + Policy --> Analyzer : true if elapsed,\nfalse otherwise + end + Analyzer --> Runner : decision + alt shouldSchedule == true + Runner -> OpsRepo : save(TableOperationDto.pending(...).toRow()) + OpsRepo -> MySQL : INSERT INTO table_operations\n(status=PENDING, ...) + OpsRepo --> Runner : saved row + note right of Runner : try/catch RuntimeException —\nlog.error + continue;\nincrement {created} or {failed} + end + end + end + end + + Runner -> Runner : log.info aggregate count\n(db, created, failed) + deactivate Runner +end + +Runner --> CLR : analyze() returns +deactivate Runner + +@enduml