{"record":{"id":"5b9c88821b309668","repo":"apache/beam","slug":"operation-ongoing-in-bundle-for-ptransform-id-name-state-for","errorCode":null,"errorMessage":"Operation ongoing in bundle {} for PTransform{{id={}, name={}, state={}}} for at least {} without outputting or completing:\n  at {}","messagePattern":"Operation ongoing in bundle (.+?) for PTransform(.+?), name=(.+?), state=(.+?)\\}\\} for at least (.+?) without outputting or completing:\n  at (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ExecutionStateSampler.java","lineNumber":466,"sourceCode":"                  > MAX_LULL_TIME_MS + lastLullReport // At least once every MAX_LULL_TIME_MS.\n          ) {\n            lastLullReport = lullTimeMs;\n            Thread thread = trackedThread.get();\n            if (thread == null) {\n              LOG.warn(\n                  \"Operation ongoing in bundle {} for at least {} without outputting \"\n                      + \"or completing (stack trace unable to be generated).\",\n                  processBundleId.get(),\n                  DURATION_FORMATTER.print(Duration.millis(lullTimeMs).toPeriod()));\n            } else if (currentExecutionState == null) {\n              LOG.warn(\n                  \"Operation ongoing in bundle {} for at least {} without outputting \"\n                      + \"or completing:\\n  at {}\",\n                  processBundleId.get(),\n                  DURATION_FORMATTER.print(Duration.millis(lullTimeMs).toPeriod()),\n                  Joiner.on(\"\\n  at \").join(thread.getStackTrace()));\n            } else {\n              LOG.warn(\n                  \"Operation ongoing in bundle {} for PTransform{{id={}, name={}, state={}}} \"\n                      + \"for at least {} without outputting or completing:\\n  at {}\",\n                  processBundleId.get(),\n                  currentExecutionState.ptransformId,\n                  currentExecutionState.ptransformUniqueName,\n                  currentExecutionState.stateName,\n                  DURATION_FORMATTER.print(Duration.millis(lullTimeMs).toPeriod()),\n                  Joiner.on(\"\\n  at \").join(thread.getStackTrace()));\n            }\n          }\n        }\n      }\n      return Optional.empty();\n    }\n\n    /** Returns status information related to this tracker or null if not tracking a bundle. */\n    public @Nullable ExecutionStateTrackerStatus getStatus() {\n      Thread thread = trackedThread.get();","sourceCodeStart":448,"sourceCodeEnd":484,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/harness/src/main/java/org/apache/beam/fn/harness/control/ExecutionStateSampler.java#L448-L484","documentation":"ExecutionStateSampler warning emitted when a bundle's lull can be attributed to a specific PTransform: it names the transform id, unique name, and execution state, and appends the stuck thread's stack trace. Like the generic lull warning it is diagnostic, helping pinpoint which transform in the pipeline stopped making progress.","triggerScenarios":"takeSample() observes a thread stuck beyond the lull threshold while currentExecutionState is non-null, meaning the sampler knows which registered PTransform (via the state registry) the thread is executing inside.","commonSituations":"A specific DoFn/transform doing blocking calls or heavy computation without progress; identifying the offending transform in Dataflow/Beam portable pipelines; misconfigured lull thresholds flagging slow-but-healthy transforms.","solutions":["Read the transform name/id and stack trace to locate the stuck user code in that PTransform.","Add timeouts or async handling to blocking calls inside that transform.","Increase the lull threshold if that transform legitimately runs long without outputting.","Optimize the transform (batching, caching) so it outputs elements more frequently."],"exampleFix":"// before\nrecords.forEach(r -> slowRpc.call(r)); // no progress indication, huge batch\n// after\nfor (Record r : records) {\n  slowRpc.callWithTimeout(r, Duration.ofSeconds(30));\n}\nc.setFlushAfterEachElement(true); // outputs progress so sampler sees liveness","handlingStrategy":"validation","validationCode":"// Ensure the transform attributed in the warning has bounded, timeout-protected work\nassert rpcTimeoutMs > 0 && batchSize > 0;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Add per-call timeouts in the transform named in the warning","Output elements periodically to signal liveness to the sampler","Profile the named PTransform for long tail latencies","Increase lull threshold only when the work is legitimately long"],"tags":["java","apache-beam","harness","lull-detection"],"backgroundTag":"bundle-lull-detected","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-20T03:17:13.778Z"}