This is an automated email from the ASF dual-hosted git repository.
He-Pin pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/pekko.git
The following commit(s) were added to refs/heads/main by this push:
new 730252b352 test: scale TCK Await timeouts by pekko.test.timefactor
(#3004)
730252b352 is described below
commit 730252b352e32305d2c3d29fb1ce3a5ded07ad8d
Author: He-Pin(kerr) <[email protected]>
AuthorDate: Fri May 29 17:58:22 2026 +0800
test: scale TCK Await timeouts by pekko.test.timefactor (#3004)
Motivation:
GroupByTest and PrefixAndTailTest abort the TCK suite on JDK 25
nightly runs with "Expected completion signal after signalling 10
elements (signalled 0), yet did not receive it within 32000 ms" after
roughly 18 iterations of stochastic_spec103_mustSignalOnMethodsSequentially.
Both `createPublisher` implementations materialize an intermediate
stream and call `Await.result(future, 3.seconds)` to obtain the
Source wrapped by the test Publisher. The 3s value is a hardcoded
constant that does not honour `pekko.test.timefactor`, so the JDK 25
nightly's compounded GC + ForkJoinPool pressure can push a single
materialization beyond 3s during the 100-iteration stochastic test,
which surfaces as a Publisher that signals zero elements.
Modification:
- Add `Timeouts.materializerTimeoutMillis`, scaled by `timeFactor`.
- Route the `Await.result` calls in GroupByTest and PrefixAndTailTest
through the new helper instead of the hardcoded `3.seconds`.
- Apply the same `timeFactor` scaling to the existing
`publisherShutdownTimeoutMillis`, which was the only field in
`Timeouts` that ignored `timeFactor`.
Result:
On local runs (timeFactor=1) the effective budget stays at 3s, so the
test still flags genuine materialization regressions. On JDK 25
nightly (timeFactor=4) the budget grows to 12s, which covers the
observed worst-case materialization delays without masking real bugs.
---
.../test/scala/org/apache/pekko/stream/tck/GroupByTest.scala | 2 +-
.../scala/org/apache/pekko/stream/tck/PrefixAndTailTest.scala | 2 +-
.../src/test/scala/org/apache/pekko/stream/tck/Timeouts.scala | 10 +++++++++-
3 files changed, 11 insertions(+), 3 deletions(-)
diff --git
a/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/GroupByTest.scala
b/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/GroupByTest.scala
index 8935defd21..7a07269a2d 100644
---
a/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/GroupByTest.scala
+++
b/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/GroupByTest.scala
@@ -30,7 +30,7 @@ class GroupByTest extends PekkoPublisherVerification[Int] {
else {
val futureGroupSource =
Source(iterable(elements)).groupBy(1, _ =>
"all").prefixAndTail(0).map(_._2).concatSubstreams.runWith(Sink.head)
- val groupSource = Await.result(futureGroupSource, 3.seconds)
+ val groupSource = Await.result(futureGroupSource,
Timeouts.materializerTimeoutMillis.millis)
groupSource.runWith(Sink.asPublisher(false))
}
diff --git
a/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/PrefixAndTailTest.scala
b/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/PrefixAndTailTest.scala
index 1b70dfd1e3..1d184ded68 100644
---
a/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/PrefixAndTailTest.scala
+++
b/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/PrefixAndTailTest.scala
@@ -26,7 +26,7 @@ class PrefixAndTailTest extends
PekkoPublisherVerification[Int] {
def createPublisher(elements: Long): Publisher[Int] = {
val futureTailSource = Source(iterable(elements)).prefixAndTail(0).map {
case (_, tail) => tail }.runWith(Sink.head)
- val tailSource = Await.result(futureTailSource, 3.seconds)
+ val tailSource = Await.result(futureTailSource,
Timeouts.materializerTimeoutMillis.millis)
tailSource.runWith(Sink.asPublisher(false))
}
diff --git
a/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/Timeouts.scala
b/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/Timeouts.scala
index 1183c073ed..84ae7c7594 100644
--- a/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/Timeouts.scala
+++ b/stream-tests-tck/src/test/scala/org/apache/pekko/stream/tck/Timeouts.scala
@@ -22,7 +22,7 @@ object Timeouts {
private val timeFactor: Double =
sys.props.get("pekko.test.timefactor").map(_.toDouble).getOrElse(1.0)
- def publisherShutdownTimeoutMillis: Int = 3000
+ def publisherShutdownTimeoutMillis: Int = math.ceil(3000 * timeFactor).toInt
def defaultTimeoutMillis: Int = (800 * timeFactor).toInt
@@ -30,4 +30,12 @@ object Timeouts {
def actorSystemShutdownTimeoutMillis: Int = math.ceil(10000 *
timeFactor).toInt
+ // Used by TCK Test classes that need to materialize an intermediate stream
to
+ // obtain the Publisher under test (e.g. groupBy, prefixAndTail). The base 3s
+ // is the historical hardcoded value; scaling by timeFactor keeps it stable
on
+ // JDK 25 nightly runs where compounded GC + ForkJoinPool pressure
occasionally
+ // pushes a single materialization beyond 3s during 100-iteration stochastic
+ // tests, which previously caused the TCK suite to abort with "signalled 0".
+ def materializerTimeoutMillis: Int = math.ceil(3000 * timeFactor).toInt
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]