From c0e1d42b621477a345c5987cb473eae54d743274 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 14 Oct 2026 08:55:58 +0800 Subject: [PATCH] perf(selfop): route collected orders once after resolution --- .../selfoperated/analytics/sync/SelfopDiscoveryService.java | 4 +++- .../analytics/sync/SelfopDiscoveryServiceTest.java | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryService.java index f7013b831..01d40237f 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryService.java @@ -190,8 +190,10 @@ public class SelfopDiscoveryService { SelfopProgressProjection.freezeRun(currentFetchTask,currentFetchRun);currentFetchRun.setStatus("ROUTED");currentFetchRun.setFetchFinishedAtUtc(utcNow());currentFetchRun.setFinishedAtUtc(utcNow());currentFetchRun.setUpdatedAt(utcNow());runs.updateById(currentFetchRun); currentFetchTask.setStatus("SUCCEEDED");currentFetchTask.setUpdatedAt(utcNow());tasks.updateById(currentFetchTask);} }); - route(task,run,manifest,lease,false); } + // Child tasks stay WAITING_SOURCE until all orders are resolved. Rebuilding every + // warehouse manifest after each order made this loop quadratic in directory size. + // A resumed attempt projects its current references before entering the loop. // A directory warehouse is provisional until every account order (including resumed // revision checks) has resolved. An empty warehouse must not publish a false zero early. route(task,run,manifest,lease,true); diff --git a/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryServiceTest.java b/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryServiceTest.java index 7f7c5f187..18df3af68 100644 --- a/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryServiceTest.java +++ b/lastleg-service/src/test/java/com/baiyue/lastleg/selfoperated/analytics/sync/SelfopDiscoveryServiceTest.java @@ -309,6 +309,9 @@ class SelfopDiscoveryServiceTest { service.collect(task,run,lease); verify(client,never()).detail(any(),anyString(),anyString(),anyString()); assertEquals("ROUTED",run.getStatus());assertEquals(2,stored.size()); + // Two orders, one warehouse: initial WAITING_SOURCE and final READY projections only. + verify(orders,times(4)).selectOne(any()); + assertTrue(children.values().stream().allMatch(child->"READY".equals(child.getStatus()))); assertTrue(stored.values().stream().allMatch(s->"VALID".equals(s.getValidationStatus()))); var quantities=stored.values().stream().map(s->read(s.getPayloadJson(),SelfopPayloads.Order.class).items().get(0).actualQuantity()).toList(); assertTrue(quantities.stream().anyMatch(q->q.compareTo(new BigDecimal("2.123456"))==0));