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]

Reply via email to