From fbb0aa121a4b0c26b523d8e66413423f530bc483 Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Wed, 6 May 2026 21:27:07 +0300 Subject: [PATCH] =?UTF-8?q?fix(test):=20WebhookE2ETest=20=E2=80=94=20pool?= =?UTF-8?q?=3D4=20+=20tighter=20timeouts=20+=20truncate=20outbox?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Предыдущий cleanup-fix не помог CI: ConditionTimeout 60s × 2 теста. Trace показал WebhookDispatcher initialized + ZERO sendTick/matchTick лог lines после этого. Spring @Scheduled default pool size = 1; если sendTick блокируется на HTTP timeout (5s) к dead leftover URL — matchTick тоже не запускается до конца HTTP send. CI Postgres testcontainer withReuse(true) тащит leftover deliveries из предыдущих runs. Их слишком много чтобы fail'ить за 60s с pool=1. Фикс комбо: - spring.task.scheduling.pool.size=4 — matchTick/sendTick параллельно, один blocked на dead URL не стопает другие - ordinis.webhook.send-timeout-ms=1000 — leftover dead URLs fail'ят за 1с вместо 5с (5x faster cleanup) - truncate outbox_events дополнительно — matchTick не порождает delivery rows на старые события Локально 2/2 passed за 9.9s. Race-warnings про FK violation (matchTick видит cached subscription но row deleted в @BeforeEach) — noise, тест проходит. --- .../ordinis/app/e2e/WebhookE2ETest.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java b/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java index 83c9ad5..a13563e 100644 --- a/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java +++ b/ordinis-app/src/test/java/cloud/nstart/terravault/ordinis/app/e2e/WebhookE2ETest.java @@ -60,6 +60,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. "ordinis.webhook.match-interval-ms=200", "ordinis.webhook.send-interval-ms=200", "ordinis.webhook.allowed-hosts=localhost,127.0.0.1", + // CI: postgres testcontainer withReuse(true) тащит leftover + // deliveries с dead URLs из предыдущих runs. Default send-timeout + // 5000ms × N leftovers + scheduling pool=1 → блокирует matchTick + // на минуты, наш event не доходит до receiver. Жмём timeout до + // 1s + thread pool 4 чтобы matchTick/sendTick не сериализовались. + "ordinis.webhook.send-timeout-ms=1000", + "spring.task.scheduling.pool.size=4", // Spring auto-config Kafka не нужно — нет KafkaTemplate потребителей // без OutboxPoller. Иначе при старте Boot попытается подключиться // к localhost:9092 и завесит контекст. @@ -93,10 +100,14 @@ class WebhookE2ETest { // Cleanup leftover state из предыдущего CI run. // Postgres testcontainer withReuse(true) сохраняет данные между // запусками — старые subscriptions с dead URLs дают `findDue()` - // нагрузку (5s timeout × N = слишком долго до нашего нового event'а). - // Очищаем deliveries сначала (FK на subscriptions), потом subscriptions. + // нагрузку (timeout × N = слишком долго до нашего нового event'а). + // Также очищаем outbox_events чтобы matchTick не порождал deliveries + // на старые события (которые соответствуют scope=PUBLIC subscription'у + // нашего теста). + // Order: deliveries (FK), subscriptions, outbox events. deliveryRepo.deleteAllInBatch(); subRepo.deleteAllInBatch(); + outboxRepo.deleteAllInBatch(); receiver = HttpServer.create(new InetSocketAddress("127.0.0.1", 0), 0); receiver.createContext("/hook", exchange -> {