morningman opened a new pull request, #4057: URL: https://github.com/apache/doris-website/pull/4057
## What Two usability changes on the [Profile Analysis](https://doris.apache.org/profile-analysis) page. ### 1. Full-screen execution graph The React Flow canvas under **Visualize Execution** is fixed at 680px, which is cramped for large plans. A **Full screen** toggle now sits in the canvas's top-right corner, opposite the *Slowest operators* panel. - Full screen fixes the workspace below the navbar (`z-index: 250`, under the sticky navbar's `300`, so the navigation stays visible and clickable while the graph takes every remaining pixel. - The top offset is measured from at runtime rather than hard-coded, because the navbar grows on narrow screens; a listener keeps it in sync. - leaves full screen, the page behind the canvas stops scrolling while it is open, and the graph refits itself whenever the canvas changes size, so it never ends up off-centre. - The operator details sidebar comes along into full screen; the canvas and sidebar now derive their height from the workspace grid row instead of a hard-coded , which leaves the normal and mobile layouts unchanged. ### 2. AI analysis wait estimate An AI run takes a while, and the button only said with no sense of how long. It now reads , matching the separator style already used by the status line. ## Tests ✔ creates an analysis job with the selected file and response language (19.295542ms) ✔ parses queued, running, completed, and failed job snapshots (1.426084ms) ✔ recovers a job id from a client request id without re-uploading the profile (0.2065ms) ✔ preserves Retry-After on a temporary client-request recovery 404 (0.467167ms) ✔ accepts a terminal status when an idempotent create response is replayed (0.339333ms) ✔ preserves a structured backend error on non-2xx responses (0.293833ms) ✔ uses a safe fallback when an error response is not JSON (0.4285ms) ✔ rejects a successful response that is not an agent message (0.478ms) ✔ rejects a completed answer over the frontend UTF-8 byte limit (0.385166ms) ✔ rejects an API response body over the client hard limit (0.515166ms) ✔ normalizes network failures into a stable API error (0.208209ms) ✔ rejects a missing hCaptcha token before sending the Profile (0.138458ms) ✔ accepts case-insensitive txt files and rejects other types or oversized files (0.533459ms) ✔ formats file sizes for display (0.058916ms) ✔ explains the raw file limit and large-profile reduction in English (1.572ms) ✔ states the supported Doris version before a Profile is chosen (0.543417ms) ✔ disables both tab actions without a file and keeps visualization available during AI processing (1.021833ms) ✔ states how long the AI analysis is expected to take while it runs (0.26575ms) ✔ keeps local file selection independent from unchecked AI consent and displays the required notice (0.452292ms) ✔ uses an English accessible label instead of exposing localized native file-input text (0.173875ms) ✔ renders an English response-language selector with English selected by default (0.185625ms) ✔ exposes the waiting state to assistive technology (0.137166ms) ✔ renders the page-refresh recovery state (0.061041ms) ✔ renders the connection recovery state without presenting a terminal failure (0.052125ms) ✔ renders runtime Markdown while discarding raw HTML and unsafe links (7.541958ms) ✔ the page composes the analyzer inside the Doris Layout without adding navigation changes (0.345833ms) ✔ adds English action tabs and configures the execution graph as read-only (0.443042ms) ✔ overlays the slowest operators on the canvas and centers the one that is clicked (0.271583ms) ✔ expands the execution graph to every pixel below the navbar in full screen (0.269541ms) ✔ ranks the slowest operators by exec max and keeps at most five entries (9.335375ms) ✔ lists only operators the Profile timed and orders ties predictably (0.553958ms) ✔ builds one ELK compound parent per Fragment and keeps all cross-Fragment edges (0.168542ms) ✔ maps laid-out operators to fixed read-only child nodes and keeps pipeline as a badge (0.286167ms) ✔ visually distinguishes data edges from dependency edges without animation (0.112ms) ✔ uses simplified orthogonal ELK sections as absolute React Flow paths (0.235583ms) ✔ ELK lays out a complete graph containing a cross-Fragment edge (83.992ms) ✔ formats unknown values distinctly from real zero values using English text (0.30525ms) ✔ counts profile text in UTF-8 bytes instead of JavaScript characters (0.869084ms) ✔ ensures prepared profile names have a txt extension (0.065542ms) ✔ truncates at the first per-instance header after MergedProfile (0.217625ms) ✔ does not claim truncation without a MergedProfile followed by a detail boundary (0.090167ms) ✔ returns an upload-sized profile file without reading or repackaging it (0.114041ms) ✔ rejects a raw profile over 100 MiB without reading it (0.212209ms) ✔ removes per-instance detail from a large profile and returns a plain txt file (1.008917ms) ✔ rejects a merged-only profile that remains over the upload limit (10.293042ms) ✔ posts one file request, accepts only its request id, and terminates after success (1.0515ms) ✔ maps stable parser failures and terminates the worker (0.292958ms) ✔ terminates and rejects an operation on timeout (4.94325ms) ✔ cancels an in-flight operation and ignores late worker responses (0.240125ms) ✔ rejects oversized prepared files before creating a worker (0.187542ms) ✔ rejects invalid UTF-8 before parsing Profile structure (0.256666ms) ✔ parses MergedProfile nodes, data flow, exchange, and dependency edges (6.92575ms) ✔ preserves multicast branches and their branch indexes (0.284583ms) ✔ keeps unknown operator text inert and reports a non-blocking warning (0.149958ms) ✔ parses compound Doris durations and exact abbreviated counts (0.092792ms) ✔ fails with stable errors for missing MergedProfile and oversized lines (0.265542ms) ✔ records unresolved exchange references instead of inventing an edge (0.129084ms) ✔ recovers an accepted job after an ambiguous create without creating a new logical request (1.041625ms) ✔ never replays create with a consumed captcha token and recovers through temporary 404s (0.282792ms) ✔ surfaces a captcha verifier outage without attempting job recovery (0.274291ms) ✔ keeps a fresh client request through temporary 404s until the job appears (0.15675ms) ✔ keeps polling the same job after three transport failures and recovers on the fourth GET (0.225208ms) ✔ treats a recovery 404 as final after the grace window (0.134041ms) ✔ uses capped exponential retry delays with bounded jitter (0.071834ms) ✔ accepts strictly validated recovery metadata without profile contents (0.776291ms) ✔ writes, reads, and clears only the active recovery record (0.352584ms) ✔ degrades safely when session storage is unavailable (0.15375ms) ✔ local DAG reducer has an independent parsing and success lifecycle (0.754708ms) ✔ local DAG failure never carries a stale graph and reset returns to idle (0.092ms) ✔ moves from idle through ready, analyzing, and completed (0.875333ms) ✔ does not start without a file or replace a file while analyzing (0.140625ms) ✔ stores failures and clears the old result and error when a new file is selected (0.083666ms) ✔ stores response language per request, clears stale output, and freezes it while analyzing (0.083667ms) ✔ restores persisted job metadata before polling resumes (0.145666ms) ✔ warns when session storage is unavailable without failing the analysis state (0.102542ms) ✔ keeps an uncertain analysis busy while its original identifiers are recovered (0.058542ms) ✔ settles the AI state as soon as Codex completes without waiting for a DAG status (0.059375ms) ✔ normalizes unknown failures without exposing non-error values (0.07575ms) ✔ maps hCaptcha backend errors to actionable messages (0.103083ms) ℹ tests 79 ℹ suites 0 ℹ pass 79 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 325.346333 — 79 passed, 0 failed. Two new cases cover the full-screen behaviour and the wait estimate; the existing assertion was updated. 🤖 Generated with [Claude Code](https://claude.com/claude-code) EOF ) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
