[DEPRECATED] Go implementation of plcbundle

update structure (6)

+29 -38
+29 -38
internal/bundle/manager.go
··· 1358 1359 if lastBundle != nil { 1360 nextBundleNum = lastBundle.BundleNumber + 1 1361 prevBundleHash = lastBundle.Hash 1362 1363 - // ✨ FIX: Use mempool's last operation time if available 1364 - // This prevents re-fetching operations already in mempool 1365 mempoolLastTime := m.mempool.GetLastTime() 1366 if mempoolLastTime != "" { 1367 afterTime = mempoolLastTime 1368 if !quiet { 1369 - m.logger.Printf("Using mempool cursor: %s", afterTime) 1370 } 1371 - } else { 1372 - // No mempool operations yet, use last bundle 1373 - afterTime = lastBundle.EndTime.Format(time.RFC3339Nano) 1374 - } 1375 - 1376 - prevBundle, err := m.LoadBundle(ctx, lastBundle.BundleNumber) 1377 - if err == nil { 1378 - _, prevBoundaryCIDs = m.operations.GetBoundaryCIDs(prevBundle.Operations) 1379 } 1380 } 1381 ··· 1383 m.logger.Printf("Preparing bundle %06d (mempool: %d ops)...", nextBundleNum, m.mempool.Count()) 1384 } 1385 1386 - // Fetch in a loop until we have enough OR hit end-of-data 1387 - maxAttempts := 10 1388 - attemptCount := 0 1389 - 1390 - for m.mempool.Count() < types.BUNDLE_SIZE && attemptCount < maxAttempts { 1391 - attemptCount++ 1392 - 1393 newOps, err := m.syncer.FetchToMempool( 1394 ctx, 1395 afterTime, ··· 1399 m.mempool.Count(), 1400 ) 1401 1402 - if err != nil { 1403 - m.mempool.Save() 1404 - return nil, err 1405 } 1406 1407 - // Add to mempool 1408 - added, err := m.mempool.Add(newOps) 1409 - if err != nil { 1410 m.mempool.Save() 1411 - return nil, fmt.Errorf("chronological validation failed: %w", err) 1412 - } 1413 - 1414 - if !quiet && added > 0 { 1415 - m.logger.Printf("Added %d new operations (mempool now: %d)", added, m.mempool.Count()) 1416 - } 1417 - 1418 - // ✨ Update cursor to last operation in mempool 1419 - afterTime = m.mempool.GetLastTime() 1420 - 1421 - // If we got no new operations, we've caught up 1422 - if len(newOps) == 0 || added == 0 { 1423 - break 1424 } 1425 } 1426 1427 if m.mempool.Count() < types.BUNDLE_SIZE { 1428 m.mempool.Save() 1429 - return nil, fmt.Errorf("insufficient operations: have %d, need %d (reached latest data)", 1430 m.mempool.Count(), types.BUNDLE_SIZE) 1431 } 1432
··· 1358 1359 if lastBundle != nil { 1360 nextBundleNum = lastBundle.BundleNumber + 1 1361 + afterTime = lastBundle.EndTime.Format(time.RFC3339Nano) 1362 prevBundleHash = lastBundle.Hash 1363 1364 + prevBundle, err := m.LoadBundle(ctx, lastBundle.BundleNumber) 1365 + if err == nil { 1366 + _, prevBoundaryCIDs = m.operations.GetBoundaryCIDs(prevBundle.Operations) 1367 + } 1368 + } 1369 + 1370 + // ✨ Use mempool's last time if available 1371 + if m.mempool.Count() > 0 { 1372 mempoolLastTime := m.mempool.GetLastTime() 1373 if mempoolLastTime != "" { 1374 afterTime = mempoolLastTime 1375 if !quiet { 1376 + m.logger.Printf("Continuing from mempool cursor: %s (have %d ops)", 1377 + afterTime, m.mempool.Count()) 1378 } 1379 } 1380 } 1381 ··· 1383 m.logger.Printf("Preparing bundle %06d (mempool: %d ops)...", nextBundleNum, m.mempool.Count()) 1384 } 1385 1386 + // ✨ Fetch operations if needed (FetchToMempool loops internally) 1387 + if m.mempool.Count() < types.BUNDLE_SIZE { 1388 newOps, err := m.syncer.FetchToMempool( 1389 ctx, 1390 afterTime, ··· 1394 m.mempool.Count(), 1395 ) 1396 1397 + // Add operations if we got any 1398 + if len(newOps) > 0 { 1399 + added, addErr := m.mempool.Add(newOps) 1400 + if addErr != nil { 1401 + m.mempool.Save() 1402 + return nil, fmt.Errorf("chronological validation failed: %w", addErr) 1403 + } 1404 + 1405 + if !quiet && added > 0 { 1406 + m.logger.Printf("Added %d new operations (mempool now: %d)", added, m.mempool.Count()) 1407 + } 1408 } 1409 1410 + // If fetch failed AND we don't have enough, return error 1411 + if err != nil && m.mempool.Count() < types.BUNDLE_SIZE { 1412 m.mempool.Save() 1413 + return nil, err 1414 } 1415 } 1416 1417 + // Check if we have enough for a bundle 1418 if m.mempool.Count() < types.BUNDLE_SIZE { 1419 m.mempool.Save() 1420 + return nil, fmt.Errorf("insufficient operations: have %d, need %d (no more available)", 1421 m.mempool.Count(), types.BUNDLE_SIZE) 1422 } 1423