@optimystic/db-p2p 1.0.0-beta.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/dist/src/cluster/block-transfer-service.d.ts +73 -1
  2. package/dist/src/cluster/block-transfer-service.d.ts.map +1 -1
  3. package/dist/src/cluster/block-transfer-service.js +70 -3
  4. package/dist/src/cluster/block-transfer-service.js.map +1 -1
  5. package/dist/src/cluster/block-transfer.d.ts +16 -1
  6. package/dist/src/cluster/block-transfer.d.ts.map +1 -1
  7. package/dist/src/cluster/block-transfer.js +73 -72
  8. package/dist/src/cluster/block-transfer.js.map +1 -1
  9. package/dist/src/cluster/client.d.ts +4 -6
  10. package/dist/src/cluster/client.d.ts.map +1 -1
  11. package/dist/src/cluster/client.js +8 -13
  12. package/dist/src/cluster/client.js.map +1 -1
  13. package/dist/src/cluster/cluster-policy.d.ts +2 -1
  14. package/dist/src/cluster/cluster-policy.d.ts.map +1 -1
  15. package/dist/src/cluster/cluster-policy.js.map +1 -1
  16. package/dist/src/cluster/cluster-repo.d.ts +126 -6
  17. package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
  18. package/dist/src/cluster/cluster-repo.js +378 -50
  19. package/dist/src/cluster/cluster-repo.js.map +1 -1
  20. package/dist/src/cluster/commit-proof.js +2 -2
  21. package/dist/src/cluster/race-resolution.d.ts +51 -7
  22. package/dist/src/cluster/race-resolution.d.ts.map +1 -1
  23. package/dist/src/cluster/race-resolution.js +71 -7
  24. package/dist/src/cluster/race-resolution.js.map +1 -1
  25. package/dist/src/cluster/rebalance-monitor.d.ts +67 -5
  26. package/dist/src/cluster/rebalance-monitor.d.ts.map +1 -1
  27. package/dist/src/cluster/rebalance-monitor.js +120 -26
  28. package/dist/src/cluster/rebalance-monitor.js.map +1 -1
  29. package/dist/src/cluster/spread-on-churn.d.ts.map +1 -1
  30. package/dist/src/cluster/spread-on-churn.js +34 -47
  31. package/dist/src/cluster/spread-on-churn.js.map +1 -1
  32. package/dist/src/cohort-topic/host.d.ts.map +1 -1
  33. package/dist/src/cohort-topic/host.js +8 -6
  34. package/dist/src/cohort-topic/host.js.map +1 -1
  35. package/dist/src/cohort-topic/membership-source.js +1 -1
  36. package/dist/src/cohort-topic/membership-source.js.map +1 -1
  37. package/dist/src/cohort-topic/peer-codec.d.ts.map +1 -1
  38. package/dist/src/cohort-topic/peer-codec.js +5 -2
  39. package/dist/src/cohort-topic/peer-codec.js.map +1 -1
  40. package/dist/src/cohort-topic/stream-util.d.ts +24 -3
  41. package/dist/src/cohort-topic/stream-util.d.ts.map +1 -1
  42. package/dist/src/cohort-topic/stream-util.js +36 -3
  43. package/dist/src/cohort-topic/stream-util.js.map +1 -1
  44. package/dist/src/cohort-topic/topic-router.d.ts +9 -0
  45. package/dist/src/cohort-topic/topic-router.d.ts.map +1 -1
  46. package/dist/src/cohort-topic/topic-router.js +12 -2
  47. package/dist/src/cohort-topic/topic-router.js.map +1 -1
  48. package/dist/src/dispute/client.d.ts.map +1 -1
  49. package/dist/src/dispute/client.js +15 -3
  50. package/dist/src/dispute/client.js.map +1 -1
  51. package/dist/src/index.d.ts +5 -0
  52. package/dist/src/index.d.ts.map +1 -1
  53. package/dist/src/index.js +5 -0
  54. package/dist/src/index.js.map +1 -1
  55. package/dist/src/libp2p-key-network.d.ts +78 -17
  56. package/dist/src/libp2p-key-network.d.ts.map +1 -1
  57. package/dist/src/libp2p-key-network.js +234 -147
  58. package/dist/src/libp2p-key-network.js.map +1 -1
  59. package/dist/src/libp2p-node-base.d.ts +35 -1
  60. package/dist/src/libp2p-node-base.d.ts.map +1 -1
  61. package/dist/src/libp2p-node-base.js +151 -26
  62. package/dist/src/libp2p-node-base.js.map +1 -1
  63. package/dist/src/libp2p-node-rn.d.ts +2 -2
  64. package/dist/src/libp2p-node-rn.d.ts.map +1 -1
  65. package/dist/src/libp2p-node-rn.js.map +1 -1
  66. package/dist/src/libp2p-node.d.ts +2 -2
  67. package/dist/src/libp2p-node.d.ts.map +1 -1
  68. package/dist/src/libp2p-node.js.map +1 -1
  69. package/dist/src/logger.d.ts.map +1 -1
  70. package/dist/src/logger.js +6 -1
  71. package/dist/src/logger.js.map +1 -1
  72. package/dist/src/matchmaking/query-transport.d.ts +3 -4
  73. package/dist/src/matchmaking/query-transport.d.ts.map +1 -1
  74. package/dist/src/matchmaking/query-transport.js +9 -9
  75. package/dist/src/matchmaking/query-transport.js.map +1 -1
  76. package/dist/src/network/network-manager-service.d.ts +10 -5
  77. package/dist/src/network/network-manager-service.d.ts.map +1 -1
  78. package/dist/src/network/network-manager-service.js +11 -2
  79. package/dist/src/network/network-manager-service.js.map +1 -1
  80. package/dist/src/network/relay-reservation.d.ts +170 -0
  81. package/dist/src/network/relay-reservation.d.ts.map +1 -0
  82. package/dist/src/network/relay-reservation.js +527 -0
  83. package/dist/src/network/relay-reservation.js.map +1 -0
  84. package/dist/src/pend-validation.d.ts +3 -2
  85. package/dist/src/pend-validation.d.ts.map +1 -1
  86. package/dist/src/pend-validation.js +3 -2
  87. package/dist/src/pend-validation.js.map +1 -1
  88. package/dist/src/protocol-client.d.ts +8 -1
  89. package/dist/src/protocol-client.d.ts.map +1 -1
  90. package/dist/src/protocol-client.js +11 -0
  91. package/dist/src/protocol-client.js.map +1 -1
  92. package/dist/src/reactivity/forwarder-host.d.ts +2 -1
  93. package/dist/src/reactivity/forwarder-host.d.ts.map +1 -1
  94. package/dist/src/reactivity/forwarder-host.js +2 -1
  95. package/dist/src/reactivity/forwarder-host.js.map +1 -1
  96. package/dist/src/reactivity/origination-manager.d.ts +3 -3
  97. package/dist/src/reactivity/origination-manager.js +3 -3
  98. package/dist/src/reactivity/recover-transport.d.ts +22 -14
  99. package/dist/src/reactivity/recover-transport.d.ts.map +1 -1
  100. package/dist/src/reactivity/recover-transport.js +32 -19
  101. package/dist/src/reactivity/recover-transport.js.map +1 -1
  102. package/dist/src/reactivity/subscription-manager.d.ts +2 -2
  103. package/dist/src/reactivity/topic-bytes.d.ts +6 -7
  104. package/dist/src/reactivity/topic-bytes.d.ts.map +1 -1
  105. package/dist/src/reactivity/topic-bytes.js +8 -9
  106. package/dist/src/reactivity/topic-bytes.js.map +1 -1
  107. package/dist/src/repo/client.d.ts +5 -2
  108. package/dist/src/repo/client.d.ts.map +1 -1
  109. package/dist/src/repo/client.js +49 -40
  110. package/dist/src/repo/client.js.map +1 -1
  111. package/dist/src/repo/cluster-coordinator.d.ts +77 -5
  112. package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
  113. package/dist/src/repo/cluster-coordinator.js +131 -20
  114. package/dist/src/repo/cluster-coordinator.js.map +1 -1
  115. package/dist/src/repo/coordinator-repo.d.ts +238 -122
  116. package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
  117. package/dist/src/repo/coordinator-repo.js +625 -472
  118. package/dist/src/repo/coordinator-repo.js.map +1 -1
  119. package/dist/src/repo/i-under-replication-ledger.d.ts +87 -0
  120. package/dist/src/repo/i-under-replication-ledger.d.ts.map +1 -0
  121. package/dist/src/repo/i-under-replication-ledger.js +2 -0
  122. package/dist/src/repo/i-under-replication-ledger.js.map +1 -0
  123. package/dist/src/repo/kv-under-replication-ledger.d.ts +91 -0
  124. package/dist/src/repo/kv-under-replication-ledger.d.ts.map +1 -0
  125. package/dist/src/repo/kv-under-replication-ledger.js +287 -0
  126. package/dist/src/repo/kv-under-replication-ledger.js.map +1 -0
  127. package/dist/src/repo/responsibility.d.ts +37 -0
  128. package/dist/src/repo/responsibility.d.ts.map +1 -0
  129. package/dist/src/repo/responsibility.js +37 -0
  130. package/dist/src/repo/responsibility.js.map +1 -0
  131. package/dist/src/repo/service.d.ts +44 -15
  132. package/dist/src/repo/service.d.ts.map +1 -1
  133. package/dist/src/repo/service.js +64 -27
  134. package/dist/src/repo/service.js.map +1 -1
  135. package/dist/src/repo/stuck-reservation.d.ts +127 -0
  136. package/dist/src/repo/stuck-reservation.d.ts.map +1 -0
  137. package/dist/src/repo/stuck-reservation.js +179 -0
  138. package/dist/src/repo/stuck-reservation.js.map +1 -0
  139. package/dist/src/repo/under-replication-drain.d.ts +208 -0
  140. package/dist/src/repo/under-replication-drain.d.ts.map +1 -0
  141. package/dist/src/repo/under-replication-drain.js +461 -0
  142. package/dist/src/repo/under-replication-drain.js.map +1 -0
  143. package/dist/src/rn.d.ts +5 -0
  144. package/dist/src/rn.d.ts.map +1 -1
  145. package/dist/src/rn.js +5 -0
  146. package/dist/src/rn.js.map +1 -1
  147. package/dist/src/storage/block-latch.d.ts +3 -2
  148. package/dist/src/storage/block-latch.d.ts.map +1 -1
  149. package/dist/src/storage/block-latch.js +7 -4
  150. package/dist/src/storage/block-latch.js.map +1 -1
  151. package/dist/src/storage/block-storage.d.ts +45 -3
  152. package/dist/src/storage/block-storage.d.ts.map +1 -1
  153. package/dist/src/storage/block-storage.js +156 -9
  154. package/dist/src/storage/block-storage.js.map +1 -1
  155. package/dist/src/storage/i-block-storage.d.ts +57 -5
  156. package/dist/src/storage/i-block-storage.d.ts.map +1 -1
  157. package/dist/src/storage/i-block-storage.js.map +1 -1
  158. package/dist/src/storage/pending-claim.d.ts +167 -0
  159. package/dist/src/storage/pending-claim.d.ts.map +1 -0
  160. package/dist/src/storage/pending-claim.js +156 -0
  161. package/dist/src/storage/pending-claim.js.map +1 -0
  162. package/dist/src/storage/raw-store-codec.d.ts +13 -0
  163. package/dist/src/storage/raw-store-codec.d.ts.map +1 -1
  164. package/dist/src/storage/raw-store-codec.js +24 -3
  165. package/dist/src/storage/raw-store-codec.js.map +1 -1
  166. package/dist/src/storage/restoration-coordinator.d.ts.map +1 -1
  167. package/dist/src/storage/restoration-coordinator.js +2 -1
  168. package/dist/src/storage/restoration-coordinator.js.map +1 -1
  169. package/dist/src/storage/ring-shift-coordinator.d.ts.map +1 -1
  170. package/dist/src/storage/ring-shift-coordinator.js +3 -3
  171. package/dist/src/storage/ring-shift-coordinator.js.map +1 -1
  172. package/dist/src/storage/storage-repo.d.ts +122 -5
  173. package/dist/src/storage/storage-repo.d.ts.map +1 -1
  174. package/dist/src/storage/storage-repo.js +245 -68
  175. package/dist/src/storage/storage-repo.js.map +1 -1
  176. package/dist/src/storage/struct.d.ts +58 -0
  177. package/dist/src/storage/struct.d.ts.map +1 -1
  178. package/dist/src/testing/mesh-harness.d.ts +77 -11
  179. package/dist/src/testing/mesh-harness.d.ts.map +1 -1
  180. package/dist/src/testing/mesh-harness.js +226 -100
  181. package/dist/src/testing/mesh-harness.js.map +1 -1
  182. package/package.json +2 -2
  183. package/readme.md +27 -3
  184. package/src/cluster/block-transfer-service.ts +132 -4
  185. package/src/cluster/block-transfer.ts +79 -84
  186. package/src/cluster/client.ts +115 -119
  187. package/src/cluster/cluster-policy.ts +2 -1
  188. package/src/cluster/cluster-repo.ts +422 -56
  189. package/src/cluster/commit-proof.ts +2 -2
  190. package/src/cluster/race-resolution.ts +76 -7
  191. package/src/cluster/rebalance-monitor.ts +677 -539
  192. package/src/cluster/spread-on-churn.ts +34 -54
  193. package/src/cohort-topic/host.ts +8 -6
  194. package/src/cohort-topic/membership-source.ts +1 -1
  195. package/src/cohort-topic/peer-codec.ts +34 -31
  196. package/src/cohort-topic/stream-util.ts +39 -4
  197. package/src/cohort-topic/topic-router.ts +12 -2
  198. package/src/dispute/client.ts +17 -7
  199. package/src/index.ts +64 -59
  200. package/src/libp2p-key-network.ts +1377 -1260
  201. package/src/libp2p-node-base.ts +186 -27
  202. package/src/libp2p-node-rn.ts +31 -30
  203. package/src/libp2p-node.ts +37 -36
  204. package/src/logger.ts +6 -1
  205. package/src/matchmaking/query-transport.ts +9 -9
  206. package/src/network/network-manager-service.ts +16 -5
  207. package/src/network/relay-reservation.ts +636 -0
  208. package/src/pend-validation.ts +3 -2
  209. package/src/protocol-client.ts +13 -1
  210. package/src/reactivity/forwarder-host.ts +2 -1
  211. package/src/reactivity/origination-manager.ts +3 -3
  212. package/src/reactivity/recover-transport.ts +39 -22
  213. package/src/reactivity/subscription-manager.ts +2 -2
  214. package/src/reactivity/topic-bytes.ts +35 -37
  215. package/src/repo/client.ts +172 -173
  216. package/src/repo/cluster-coordinator.ts +145 -19
  217. package/src/repo/coordinator-repo.ts +652 -505
  218. package/src/repo/i-under-replication-ledger.ts +89 -0
  219. package/src/repo/kv-under-replication-ledger.ts +302 -0
  220. package/src/repo/responsibility.ts +48 -0
  221. package/src/repo/service.ts +76 -39
  222. package/src/repo/stuck-reservation.ts +224 -0
  223. package/src/repo/under-replication-drain.ts +582 -0
  224. package/src/rn.ts +74 -69
  225. package/src/storage/block-latch.ts +7 -4
  226. package/src/storage/block-storage.ts +161 -10
  227. package/src/storage/i-block-storage.ts +60 -5
  228. package/src/storage/pending-claim.ts +200 -0
  229. package/src/storage/raw-store-codec.ts +26 -3
  230. package/src/storage/restoration-coordinator.ts +212 -211
  231. package/src/storage/ring-shift-coordinator.ts +271 -271
  232. package/src/storage/storage-repo.ts +280 -72
  233. package/src/storage/struct.ts +58 -0
  234. package/src/testing/mesh-harness.ts +293 -112
@@ -1,9 +1,14 @@
1
1
  import type { Startable, Libp2p } from '@libp2p/interface';
2
2
  import type { FretService } from 'p2p-fret';
3
+ import type { IKeyNetwork } from '@optimystic/db-core';
3
4
  import type { PartitionDetector } from './partition-detector.js';
4
5
  import type { ArachnodeFretAdapter, ArachnodeInfo } from '../storage/arachnode-fret-adapter.js';
5
6
  export interface RebalanceEvent {
6
- /** Block IDs this node has gained responsibility for */
7
+ /**
8
+ * Block IDs this node has gained responsibility for (the reaction pulls each). A block first seen
9
+ * through a commit this node holds ({@link RebalanceMonitor.recordCommittedHolders}) is not
10
+ * reported: there is nothing to pull.
11
+ */
7
12
  gained: string[];
8
13
  /** Block IDs this node has lost responsibility for */
9
14
  lost: string[];
@@ -44,6 +49,21 @@ export interface GrowthOutcome {
44
49
  /** True when nothing about this block is still owed a push. */
45
50
  complete: boolean;
46
51
  }
52
+ /**
53
+ * What an acknowledged commit proved about who holds its blocks, reported by the node that holds them.
54
+ * Only ever reported for a commit THIS node's own storage durably holds, so a block named here needs
55
+ * no pull. See {@link RebalanceMonitor.recordCommittedHolders}.
56
+ */
57
+ export interface CommittedHolders {
58
+ blockIds: readonly string[];
59
+ /** Peers evidenced to hold the committed revision. Self may appear; it is ignored. */
60
+ holders: readonly string[];
61
+ /**
62
+ * Cohort members the commit's coordinator knows did NOT confirm holding the revision. Withdraws
63
+ * any earlier record of them as holders, so the growth arm pushes them the block.
64
+ */
65
+ unconfirmed?: readonly string[];
66
+ }
47
67
  export interface RebalanceMonitorConfig {
48
68
  /** Debounce window for topology changes (ms). Default: 5000 */
49
69
  debounceMs?: number;
@@ -93,6 +113,20 @@ export interface RebalanceMonitorDeps {
93
113
  * was-responsible memory, not owned-block tracking).
94
114
  */
95
115
  trackedBlocks?: Set<string>;
116
+ /**
117
+ * The node's key network. When provided, a block's cohort is `findCluster` on its routing key —
118
+ * the rule the writer routes by, the coordinator refuses writes by, and `RepoService` redirects
119
+ * by — so the monitor never calls a peer responsible (and pushes it a replica) that the rest of
120
+ * the node does not, nor releases a block the node is still responsible for. Omit for standalone
121
+ * construction (unit tests): the cohort is then FRET's nearest {@link RebalanceMonitor.getCohortSize}.
122
+ */
123
+ keyNetwork?: Pick<IKeyNetwork, 'findCluster'>;
124
+ /**
125
+ * The node's resolved `clusterSize`. Caps {@link RebalanceMonitor.getCohortSize}: a floor wider
126
+ * than the cohort can never be confirmed (a lost block would never be released), and on the
127
+ * standalone path it would assemble peers outside the configured cohort.
128
+ */
129
+ clusterSize?: number;
96
130
  }
97
131
  type RebalanceHandler = (event: RebalanceEvent) => void;
98
132
  export declare class RebalanceMonitor implements Startable {
@@ -100,6 +134,7 @@ export declare class RebalanceMonitor implements Startable {
100
134
  private running;
101
135
  private readonly trackedBlocks;
102
136
  private readonly responsibilitySnapshot;
137
+ private readonly commitEvidence;
103
138
  private readonly handlers;
104
139
  private debounceTimer;
105
140
  private recheckTimer;
@@ -132,6 +167,22 @@ export declare class RebalanceMonitor implements Startable {
132
167
  * leaves the block's state untouched so the next check retries.
133
168
  */
134
169
  recordGrowthOutcome(blockId: string, outcome: GrowthOutcome): void;
170
+ /**
171
+ * Evidence from an acknowledged commit that this node's storage holds: `holders` are recorded as
172
+ * confirmed co-holders of each block at the next check, and the block is not reported `gained`
173
+ * then (this node already holds it, so there is nothing to pull). Without this, every freshly
174
+ * committed block has no growth memory, so the next check reports the whole cohort grown and
175
+ * pushes the block back to the members that stored it as part of the commit — and reports it
176
+ * gained, pulling it back from them.
177
+ *
178
+ * Later evidence for the same block overrides earlier evidence about the same peer, so the
179
+ * coordinator's durability-checked answer corrects the member-side signer list recorded moments
180
+ * before it on the coordinating node. Ignored while stopped: nothing would consume it.
181
+ *
182
+ * Does not affect the founder case: a commit no other peer confirmed names no holders, so the
183
+ * cohort is still reported grown once peers appear.
184
+ */
185
+ recordCommittedHolders(committed: CommittedHolders): void;
135
186
  /**
136
187
  * Growth-arm observability: how many tracked blocks still await confirmation on reported peers,
137
188
  * how many (block, peer) pairs have been given up on, and whether the re-check timer is armed.
@@ -154,10 +205,21 @@ export declare class RebalanceMonitor implements Startable {
154
205
  private maybeRebalance;
155
206
  private performRebalanceCheck;
156
207
  /**
157
- * The replication floor `N` the cohort size FRET assembles for a block. Public so the ring-shift
158
- * handoff and the rebalance reaction can gate release on confirming replication to this many
159
- * holders (`docs/arachnode-ring-handoff.md` § Replication floor). Derives from FRET's network-size
160
- * estimate: `clamp(ceil(sqrt(n_est)), 1, 3)`, defaulting to 3 when no confident estimate exists.
208
+ * The peers responsible for a block, nearest first. With a key network wired this is its
209
+ * `findCluster` cohort (see {@link RebalanceMonitorDeps.keyNetwork}); otherwise FRET's nearest
210
+ * {@link getCohortSize} ring members.
211
+ *
212
+ * NOTE: one `findCluster` (peer-store reads for each cohort member) per tracked block per pass, where
213
+ * FRET's cohort was one synchronous call; fine under the pass throttle; if passes on nodes holding many
214
+ * blocks ever show up as slow, share the lookup with the coordinator's responsibility cache.
215
+ */
216
+ private cohortFor;
217
+ /**
218
+ * The replication floor `N`. Public so the ring-shift handoff and the rebalance reaction can gate
219
+ * release on confirming replication to this many holders (`docs/arachnode-ring-handoff.md`
220
+ * § Replication floor). Derives from FRET's network-size estimate: `clamp(ceil(sqrt(n_est)), 1, 3)`,
221
+ * defaulting to 3 when no confident estimate exists — and never above the configured `clusterSize`,
222
+ * since no block has more responsible holders than that to confirm on.
161
223
  */
162
224
  getCohortSize(): number;
163
225
  private emitEvent;
@@ -1 +1 @@
1
- {"version":3,"file":"rebalance-monitor.d.ts","sourceRoot":"","sources":["../../../src/cluster/rebalance-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rebalance-monitor.d.ts","sourceRoot":"","sources":["../../../src/cluster/rebalance-monitor.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { hashKey } from 'p2p-fret';
2
+ import { routingKeyForBlock } from '@optimystic/db-core';
2
3
  import { createLogger } from '../logger.js';
3
4
  const log = createLogger('rebalance-monitor');
4
- const textEncoder = new TextEncoder();
5
5
  const emptyGrowthState = (responsible) => ({
6
6
  responsible,
7
7
  cohortPeers: new Set(),
@@ -14,15 +14,21 @@ const intersect = (remembered, current) => new Set([...(remembered ?? [])].filte
14
14
  * Carry a still-responsible block's growth state into the next check, intersecting both remembered
15
15
  * peer sets against the CURRENT cohort: a peer that left drops out of `cohortPeers` (so its return
16
16
  * is re-detected — the departure self-heal) and out of `abandonedPeers` (so a rejoin is retried from
17
- * scratch). `pendingPeers` is always rebuilt from this check's own report, never carried.
17
+ * scratch). Commit evidence gathered since the last check is folded into `cohortPeers` first.
18
+ * `pendingPeers` is always rebuilt from this check's own report, never carried.
18
19
  */
19
- const carryGrowthState = (prior, currentPeers) => ({
20
- responsible: true,
21
- cohortPeers: intersect(prior?.cohortPeers, currentPeers),
22
- pendingPeers: new Set(),
23
- growthAttempts: prior?.growthAttempts ?? 0,
24
- abandonedPeers: intersect(prior?.abandonedPeers, currentPeers)
25
- });
20
+ const carryGrowthState = (prior, currentPeers, evidence) => {
21
+ const confirmed = new Set([...(prior?.cohortPeers ?? []), ...(evidence?.holders ?? [])]);
22
+ for (const peerId of evidence?.unconfirmed ?? [])
23
+ confirmed.delete(peerId);
24
+ return {
25
+ responsible: true,
26
+ cohortPeers: intersect(confirmed, currentPeers),
27
+ pendingPeers: new Set(),
28
+ growthAttempts: prior?.growthAttempts ?? 0,
29
+ abandonedPeers: intersect(prior?.abandonedPeers, currentPeers)
30
+ };
31
+ };
26
32
  export class RebalanceMonitor {
27
33
  deps;
28
34
  running = false;
@@ -38,9 +44,14 @@ export class RebalanceMonitor {
38
44
  // reports the whole non-self cohort as grown — that is what heals the founder case (A alone
39
45
  // commits; B joins → first check pushes to B) and the restarted-holder case (snapshot memory is
40
46
  // process-local, so a restarted holder re-pushes to everyone once). Peers enter the set only
41
- // through recordGrowthOutcome a reported-but-unconfirmed peer stays out, so a failed push is
42
- // re-detected on the next check instead of being recorded as done.
47
+ // through recordGrowthOutcome or a commit's confirmed holders (recordCommittedHolders) a
48
+ // reported-but-unconfirmed peer stays out, so a failed push is re-detected on the next check
49
+ // instead of being recorded as done.
43
50
  responsibilitySnapshot = new Map();
51
+ // Commit evidence (recordCommittedHolders) waiting for the next check, which consumes each block's
52
+ // entry once its cohort lookup succeeds and drops entries for blocks no longer tracked. Held apart
53
+ // from the snapshot because a commit does not say whether this node is responsible — only a check does.
54
+ commitEvidence = new Map();
44
55
  handlers = [];
45
56
  debounceTimer = null;
46
57
  recheckTimer = null;
@@ -94,6 +105,7 @@ export class RebalanceMonitor {
94
105
  this.recheckTimer = null;
95
106
  }
96
107
  this.pendingTopologyChange = false;
108
+ this.commitEvidence.clear();
97
109
  log('stopped');
98
110
  }
99
111
  onRebalance(handler) {
@@ -105,6 +117,7 @@ export class RebalanceMonitor {
105
117
  untrackBlock(blockId) {
106
118
  this.trackedBlocks.delete(blockId);
107
119
  this.responsibilitySnapshot.delete(blockId);
120
+ this.commitEvidence.delete(blockId);
108
121
  }
109
122
  getTrackedBlockCount() {
110
123
  return this.trackedBlocks.size;
@@ -156,6 +169,40 @@ export class RebalanceMonitor {
156
169
  }
157
170
  this.updateRecheckTimer();
158
171
  }
172
+ /**
173
+ * Evidence from an acknowledged commit that this node's storage holds: `holders` are recorded as
174
+ * confirmed co-holders of each block at the next check, and the block is not reported `gained`
175
+ * then (this node already holds it, so there is nothing to pull). Without this, every freshly
176
+ * committed block has no growth memory, so the next check reports the whole cohort grown and
177
+ * pushes the block back to the members that stored it as part of the commit — and reports it
178
+ * gained, pulling it back from them.
179
+ *
180
+ * Later evidence for the same block overrides earlier evidence about the same peer, so the
181
+ * coordinator's durability-checked answer corrects the member-side signer list recorded moments
182
+ * before it on the coordinating node. Ignored while stopped: nothing would consume it.
183
+ *
184
+ * Does not affect the founder case: a commit no other peer confirmed names no holders, so the
185
+ * cohort is still reported grown once peers appear.
186
+ */
187
+ recordCommittedHolders(committed) {
188
+ if (!this.running)
189
+ return;
190
+ for (const blockId of committed.blockIds) {
191
+ let evidence = this.commitEvidence.get(blockId);
192
+ if (!evidence) {
193
+ evidence = { holders: new Set(), unconfirmed: new Set() };
194
+ this.commitEvidence.set(blockId, evidence);
195
+ }
196
+ for (const peerId of committed.holders) {
197
+ evidence.holders.add(peerId);
198
+ evidence.unconfirmed.delete(peerId);
199
+ }
200
+ for (const peerId of committed.unconfirmed ?? []) {
201
+ evidence.unconfirmed.add(peerId);
202
+ evidence.holders.delete(peerId);
203
+ }
204
+ }
205
+ }
159
206
  /**
160
207
  * Growth-arm observability: how many tracked blocks still await confirmation on reported peers,
161
208
  * how many (block, peer) pairs have been given up on, and whether the re-check timer is armed.
@@ -219,6 +266,13 @@ export class RebalanceMonitor {
219
266
  if (this.debounceTimer) {
220
267
  clearTimeout(this.debounceTimer);
221
268
  }
269
+ // NOTE: the check samples FRET's cohort once, debounceMs after the last connection event. A joiner
270
+ // FRET has not admitted by then is not reported grown, and nothing re-checks until the next
271
+ // connection event outside minRebalanceIntervalMs — so a machine that wrote alone would not push its
272
+ // blocks to its new backup. Over loopback FRET admits well inside the default (the backup phase of
273
+ // `small-deployment-lifecycle.integration.spec.ts` lands in ~10s); if a slower link, such as a phone
274
+ // pair over a relay, ever shows a joiner that never receives the founder's blocks, re-check when FRET
275
+ // reports the peer instead of on this timer alone.
222
276
  this.debounceTimer = setTimeout(() => {
223
277
  this.debounceTimer = null;
224
278
  this.pendingTopologyChange = false;
@@ -249,6 +303,7 @@ export class RebalanceMonitor {
249
303
  // Nothing left to grow, so any prior deferral is moot — drop it and let the re-check timer
250
304
  // disarm, rather than re-arming forever against blocks that were untracked out from under it.
251
305
  this.lastGrowthDeferred = 0;
306
+ this.commitEvidence.clear();
252
307
  this.updateRecheckTimer();
253
308
  return null;
254
309
  }
@@ -258,16 +313,31 @@ export class RebalanceMonitor {
258
313
  const newOwners = new Map();
259
314
  const grown = new Map();
260
315
  let growthDeferred = 0;
316
+ let lookupFailed = 0;
261
317
  const growthCandidates = [];
262
318
  for (const blockId of this.trackedBlocks) {
263
- const key = textEncoder.encode(blockId);
264
- const coord = await hashKey(key);
265
- // Get the current cohort assembleCohort returns peer IDs sorted by distance
266
- const cohort = this.deps.fret.assembleCohort(coord, this.getCohortSize());
319
+ let cohort;
320
+ try {
321
+ cohort = await this.cohortFor(blockId);
322
+ }
323
+ catch (err) {
324
+ // Responsibility is undetermined: leave this block's state untouched (never guess lost or
325
+ // gained off a failed lookup) and count it as outstanding so the re-check timer retries it.
326
+ log('cohort lookup failed: block=%s %o', blockId, err);
327
+ lookupFailed++;
328
+ continue;
329
+ }
267
330
  const isResponsible = cohort.includes(selfId);
268
331
  const prior = this.responsibilitySnapshot.get(blockId);
269
332
  const wasResponsible = prior?.responsible ?? false;
270
- if (isResponsible && !wasResponsible) {
333
+ // Consumed only once the lookup succeeded, so a failed lookup leaves it for the next check.
334
+ // NOTE: a block enters trackedBlocks at storage apply, but its evidence arrives only after the
335
+ // durable verdict (member) or cohort acknowledgement (coordinator); a check landing in that
336
+ // window still reports it gained + grown, the pre-evidence behaviour. If relay traces show
337
+ // post-commit transfers surviving, skip a block's first check while a commit touching it is in flight.
338
+ const evidence = this.commitEvidence.get(blockId);
339
+ this.commitEvidence.delete(blockId);
340
+ if (isResponsible && !wasResponsible && !evidence) {
271
341
  gained.push(blockId);
272
342
  }
273
343
  else if (!isResponsible && wasResponsible) {
@@ -287,7 +357,7 @@ export class RebalanceMonitor {
287
357
  let state;
288
358
  if (isResponsible) {
289
359
  const currentSet = new Set(cohort.filter(id => id !== selfId));
290
- state = carryGrowthState(prior, currentSet);
360
+ state = carryGrowthState(prior, currentSet, evidence);
291
361
  const newPeers = [...currentSet].filter(id => !state.cohortPeers.has(id) && !state.abandonedPeers.has(id));
292
362
  if (newPeers.length > 0) {
293
363
  growthCandidates.push({ blockId, newPeers, state });
@@ -308,6 +378,12 @@ export class RebalanceMonitor {
308
378
  }
309
379
  this.responsibilitySnapshot.set(blockId, state);
310
380
  }
381
+ // Evidence for a block that is not tracked has no consumer: a commit this node does not hold
382
+ // as an owned block, or one untracked since.
383
+ for (const blockId of [...this.commitEvidence.keys()]) {
384
+ if (!this.trackedBlocks.has(blockId))
385
+ this.commitEvidence.delete(blockId);
386
+ }
311
387
  // Fill the growth budget in two passes: fresh growth (no failed attempts yet) first, retrying
312
388
  // blocks with what remains — otherwise a stuck retry set at the front of the tracked-block
313
389
  // insertion order would starve peers that just joined.
@@ -325,7 +401,7 @@ export class RebalanceMonitor {
325
401
  growthDeferred++;
326
402
  }
327
403
  }
328
- this.lastGrowthDeferred = growthDeferred;
404
+ this.lastGrowthDeferred = growthDeferred + lookupFailed;
329
405
  this.lastRebalanceAt = Date.now();
330
406
  if (growthDeferred > 0) {
331
407
  // Deferred blocks drain one budget-full per check. Checks fire on libp2p connection events
@@ -341,18 +417,36 @@ export class RebalanceMonitor {
341
417
  return { gained, lost, newOwners, grown, floor: this.getCohortSize(), triggeredAt };
342
418
  }
343
419
  /**
344
- * The replication floor `N` the cohort size FRET assembles for a block. Public so the ring-shift
345
- * handoff and the rebalance reaction can gate release on confirming replication to this many
346
- * holders (`docs/arachnode-ring-handoff.md` § Replication floor). Derives from FRET's network-size
347
- * estimate: `clamp(ceil(sqrt(n_est)), 1, 3)`, defaulting to 3 when no confident estimate exists.
420
+ * The peers responsible for a block, nearest first. With a key network wired this is its
421
+ * `findCluster` cohort (see {@link RebalanceMonitorDeps.keyNetwork}); otherwise FRET's nearest
422
+ * {@link getCohortSize} ring members.
423
+ *
424
+ * NOTE: one `findCluster` (peer-store reads for each cohort member) per tracked block per pass, where
425
+ * FRET's cohort was one synchronous call; fine under the pass throttle; if passes on nodes holding many
426
+ * blocks ever show up as slow, share the lookup with the coordinator's responsibility cache.
427
+ */
428
+ async cohortFor(blockId) {
429
+ const key = routingKeyForBlock(blockId);
430
+ if (this.deps.keyNetwork) {
431
+ return Object.keys(await this.deps.keyNetwork.findCluster(key));
432
+ }
433
+ return this.deps.fret.assembleCohort(await hashKey(key), this.getCohortSize());
434
+ }
435
+ /**
436
+ * The replication floor `N`. Public so the ring-shift handoff and the rebalance reaction can gate
437
+ * release on confirming replication to this many holders (`docs/arachnode-ring-handoff.md`
438
+ * § Replication floor). Derives from FRET's network-size estimate: `clamp(ceil(sqrt(n_est)), 1, 3)`,
439
+ * defaulting to 3 when no confident estimate exists — and never above the configured `clusterSize`,
440
+ * since no block has more responsible holders than that to confirm on.
348
441
  */
349
442
  getCohortSize() {
350
443
  const diag = this.deps.fret.getDiagnostics?.();
351
444
  const estimate = diag?.estimate ?? diag?.n;
352
- if (typeof estimate === 'number' && Number.isFinite(estimate) && estimate > 0) {
353
- return Math.max(1, Math.min(3, Math.ceil(Math.sqrt(estimate))));
354
- }
355
- return 3;
445
+ const size = typeof estimate === 'number' && Number.isFinite(estimate) && estimate > 0
446
+ ? Math.max(1, Math.min(3, Math.ceil(Math.sqrt(estimate))))
447
+ : 3;
448
+ const cap = this.deps.clusterSize;
449
+ return cap != null && cap >= 1 ? Math.min(size, cap) : size;
356
450
  }
357
451
  emitEvent(event) {
358
452
  for (const handler of this.handlers) {
@@ -1 +1 @@
1
- {"version":3,"file":"rebalance-monitor.js","sourceRoot":"","sources":["../../../src/cluster/rebalance-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rebalance-monitor.js","sourceRoot":"","sources":["../../../src/cluster/rebalance-monitor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"spread-on-churn.d.ts","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AASrE,MAAM,WAAW,mBAAmB;IACnC,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,qBAAqB,EAAE,OAAO,CAAA;IAC9B,kFAAkF;IAClF,eAAe,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,WAAW,CAAA;IACjB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC;;;;OAIG;IACH,IAAI,EAAE,kBAAkB,CAAA;IACxB,WAAW,EAAE,YAAY,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,8BAA8B;IAC9B,MAAM,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,SAAS,EAAE,MAAM,EAAE,CAAA;QACnB,MAAM,EAAE,MAAM,EAAE,CAAA;KAChB,CAAC,CAAA;IACF,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAiBjD,qBAAa,oBAAqB,YAAW,SAAS;IAYpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXtB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,mBAAmB,CAAe;IAC1C,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAY;gBAG5B,IAAI,EAAE,iBAAiB,EACxC,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAWpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAItC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,oBAAoB,IAAI,MAAM;IAI9B,4DAA4D;IACtD,QAAQ,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAM7C,OAAO,CAAC,eAAe;YA2BT,aAAa;IAkH3B,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,SAAS;CASjB"}
1
+ {"version":3,"file":"spread-on-churn.d.ts","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAGvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAQrE,MAAM,WAAW,mBAAmB;IACnC,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAA;IAChB,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAA;IACtB,sEAAsE;IACtE,qBAAqB,EAAE,OAAO,CAAA;IAC9B,kFAAkF;IAClF,eAAe,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,mBAAmB,EAAE,MAAM,CAAA;IAC3B,oEAAoE;IACpE,aAAa,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,CAAA;IACzB;;;;;OAKG;IACH,qBAAqB,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,WAAW,CAAA;IACjB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC;;;;OAIG;IACH,IAAI,EAAE,kBAAkB,CAAA;IACxB,WAAW,EAAE,YAAY,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,8BAA8B;IAC9B,MAAM,EAAE,KAAK,CAAC;QACb,OAAO,EAAE,MAAM,CAAA;QACf,OAAO,EAAE,MAAM,EAAE,CAAA;QACjB,SAAS,EAAE,MAAM,EAAE,CAAA;QACnB,MAAM,EAAE,MAAM,EAAE,CAAA;KAChB,CAAC,CAAA;IACF,0BAA0B;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAA;CACnB;AAED,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;AAiBjD,qBAAa,oBAAqB,YAAW,SAAS;IAYpD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXtB,OAAO,CAAC,OAAO,CAAQ;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAa;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,aAAa,CAA6C;IAClE,OAAO,CAAC,mBAAmB,CAAe;IAC1C,OAAO,CAAC,kBAAkB,CAAI;IAE9B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAY;gBAG5B,IAAI,EAAE,iBAAiB,EACxC,MAAM,GAAE,OAAO,CAAC,mBAAmB,CAAM;IAWpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAStB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB3B,QAAQ,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAItC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIjC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAInC,oBAAoB,IAAI,MAAM;IAI9B,4DAA4D;IACtD,QAAQ,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAM7C,OAAO,CAAC,eAAe;YA2BT,aAAa;IA+F3B,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,SAAS;CASjB"}
@@ -1,9 +1,8 @@
1
+ import { routingKeyForBlock } from '@optimystic/db-core';
1
2
  import { hashKey } from 'p2p-fret';
2
- import { peerIdFromString } from '@libp2p/peer-id';
3
- import { BlockTransferClient, sourceBlockCertification } from './block-transfer-service.js';
3
+ import { pushBlockToPeers } from './block-transfer-service.js';
4
4
  import { createLogger } from '../logger.js';
5
5
  const log = createLogger('spread-on-churn');
6
- const textEncoder = new TextEncoder();
7
6
  // ── Defaults ─────────────────────────────────────────────────────────
8
7
  const DEFAULT_CONFIG = {
9
8
  enabled: true,
@@ -108,7 +107,7 @@ export class SpreadOnChurnMonitor {
108
107
  const effectiveD = this.computeEffectiveD();
109
108
  const spreadResults = [];
110
109
  for (const blockId of this.trackedBlocks) {
111
- const key = textEncoder.encode(blockId);
110
+ const key = routingKeyForBlock(blockId);
112
111
  const coord = await hashKey(key);
113
112
  // Check eligibility: only middle peers spread
114
113
  const rank = this.deps.fret.neighborDistance(selfId, coord, this.deps.clusterSize);
@@ -121,18 +120,33 @@ export class SpreadOnChurnMonitor {
121
120
  const targets = expanded.filter(id => !cohortSet.has(id) && id !== selfId);
122
121
  if (targets.length === 0)
123
122
  continue;
124
- // Read block data from local storage
125
- const result = await this.deps.repo.get({ blockIds: [blockId] });
126
- const blockResult = result[blockId];
127
- if (blockResult?.unavailable !== undefined) {
123
+ // The shared read-certify-push loop, to every target. Both per-target deadlines are set:
124
+ // a target that connects but never replies would otherwise hang this sequential loop
125
+ // forever during churn (exactly when slow/dying peers are common). A receiver running
126
+ // the default `requirePushCertificate` rejects an uncertified push, so a block this node
127
+ // holds no proof for simply fails to spread (logged by the receiver as
128
+ // `push:reject-uncertified`) rather than being planted.
129
+ //
130
+ // NOTE: no memory of earlier spreads — every debounced departure re-pushes every eligible block
131
+ // to every expansion target, including targets a previous pass already confirmed. Targets are
132
+ // only peers OUTSIDE the cohort, so a deployment no larger than its cohort (a two-member pair)
133
+ // spreads nothing. If churn on a larger network shows the same (block, target) pushed pass
134
+ // after pass, remember confirmed targets per block the way RebalanceMonitor's `cohortPeers` does.
135
+ const outcome = await pushBlockToPeers(this.deps.repo, this.deps.peerNetwork, blockId, targets, {
136
+ reason: 'replication',
137
+ protocolPrefix: this.deps.protocolPrefix,
138
+ dialTimeoutMs: this.config.pushDialTimeoutMs,
139
+ responseTimeoutMs: this.config.pushResponseTimeoutMs,
140
+ });
141
+ if (outcome.status === 'unavailable') {
128
142
  // The repo could not work out whether it still holds this block (unmaterializable
129
143
  // history / failed restore). Untracking on that answer would silently drop the block
130
144
  // from the spread set on a guess, and only a later re-commit would put it back — so
131
145
  // keep it tracked and let the next sweep (or a heal) settle it.
132
- log('unavailable block=%s reason=%s (keeping tracked)', blockId, blockResult.unavailable);
146
+ log('unavailable block=%s reason=%s (keeping tracked)', blockId, outcome.reason);
133
147
  continue;
134
148
  }
135
- if (!blockResult?.block) {
149
+ if (outcome.status === 'no-local-data') {
136
150
  // The block has left local storage. No deletion event exists today to evict it
137
151
  // from the tracked set, so prune here. Deleting the current element of a Set mid
138
152
  // for...of is safe - it does not disturb the rest of the iteration. A later
@@ -141,44 +155,17 @@ export class SpreadOnChurnMonitor {
141
155
  this.trackedBlocks.delete(blockId);
142
156
  continue;
143
157
  }
144
- const blockData = textEncoder.encode(JSON.stringify(blockResult.block));
145
- // Carry the source's revision metadata so the replica's `latest` matches the
146
- // source instead of being fabricated as rev 1 on the receiver, plus the cohort commit
147
- // proof for that same revision — a receiver running the default `requirePushCertificate`
148
- // rejects an uncertified push, so a block this node holds no proof for simply fails to
149
- // spread (logged by the receiver as `push:reject-uncertified`) rather than being planted.
150
- const certification = await sourceBlockCertification(this.deps.repo, blockId, blockResult);
151
- // Push to each target
152
- const succeeded = [];
153
- const failed = [];
154
- for (const targetId of targets) {
155
- try {
156
- const peerId = peerIdFromString(targetId);
157
- const client = new BlockTransferClient(peerId, this.deps.peerNetwork, this.deps.protocolPrefix);
158
- // Bound both the dial and the response read. A target that connects but
159
- // never replies would otherwise hang this sequential loop forever during
160
- // churn (exactly when slow/dying peers are common); the deadline makes the
161
- // push throw, which the catch below records as `failed` so the pass advances.
162
- const response = await client.pushBlocks([blockId], [blockData], 'replication', certification, {
163
- dialTimeoutMs: this.config.pushDialTimeoutMs,
164
- responseTimeoutMs: this.config.pushResponseTimeoutMs,
165
- });
166
- // A round-trip that does not throw still does not mean the replica
167
- // landed: handlePush reports a block in `missing` when it could not
168
- // parse or persist it. Treat that as a failed push so the resilience
169
- // mechanism does not falsely count the new owner as holding the block.
170
- if (response.missing.includes(blockId)) {
171
- failed.push(targetId);
172
- log('push:rejected block=%s target=%s (receiver did not persist)', blockId, targetId);
173
- }
174
- else {
175
- succeeded.push(targetId);
176
- log('push:ok block=%s target=%s', blockId, targetId);
177
- }
158
+ const succeeded = outcome.confirmed;
159
+ const failed = outcome.refusals.map(refusal => refusal.peerId);
160
+ for (const targetId of succeeded) {
161
+ log('push:ok block=%s target=%s', blockId, targetId);
162
+ }
163
+ for (const refusal of outcome.refusals) {
164
+ if (refusal.reason === 'rejected') {
165
+ log('push:rejected block=%s target=%s (receiver did not persist)', blockId, refusal.peerId);
178
166
  }
179
- catch (err) {
180
- failed.push(targetId);
181
- log('push:fail block=%s target=%s err=%s', blockId, targetId, err.message);
167
+ else {
168
+ log('push:fail block=%s target=%s err=%s', blockId, refusal.peerId, refusal.error);
182
169
  }
183
170
  }
184
171
  spreadResults.push({ blockId, targets, succeeded, failed });
@@ -1 +1 @@
1
- {"version":3,"file":"spread-on-churn.js","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"spread-on-churn.js","sourceRoot":"","sources":["../../../src/cluster/spread-on-churn.ts"],"names":[],"mappings":"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"}