1041 testcase(
"online_delete with advisory_delete");
1042 using namespace jtx;
1043 using namespace std::chrono_literals;
1050 auto lastRotated = ledgerSeq - 1;
1051 BEAST_EXPECT(store.getLastRotated() == lastRotated);
1052 BEAST_EXPECT(lastRotated != 2);
1054 auto canDelete = env.
rpc(
"can_delete");
1056 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
1058 canDelete = env.
rpc(
"can_delete",
"never");
1060 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
1063 for (; ledgerSeq < firstBatch; ++ledgerSeq)
1067 auto ledger = env.
rpc(
"ledger",
"validated");
1074 BEAST_EXPECT(lastRotated == store.getLastRotated());
1079 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == ledgerSeq + (
kDeleteInterval / 2));
1084 BEAST_EXPECT(store.getLastRotated() == lastRotated);
1090 auto ledger = env.
rpc(
"ledger",
"validated");
1096 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
1098 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
1099 lastRotated = ledgerSeq - 1;
1106 auto ledger = env.
rpc(
"ledger",
"validated");
1112 BEAST_EXPECT(store.getLastRotated() == lastRotated);
1118 auto ledger = env.
rpc(
"ledger",
"validated");
1124 ledgerCheck(env, ledgerSeq - firstBatch, firstBatch);
1126 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
1127 lastRotated = ledgerSeq - 1;
1130 canDelete = env.
rpc(
"can_delete",
"always");
1140 auto ledger = env.
rpc(
"ledger",
"validated");
1146 BEAST_EXPECT(store.getLastRotated() == lastRotated);
1152 auto ledger = env.
rpc(
"ledger",
"validated");
1158 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
1160 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
1161 lastRotated = ledgerSeq - 1;
1164 canDelete = env.
rpc(
"can_delete",
"now");
1166 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == ledgerSeq - 1);
1173 auto ledger = env.
rpc(
"ledger",
"validated");
1179 BEAST_EXPECT(store.getLastRotated() == lastRotated);
1185 auto ledger = env.
rpc(
"ledger",
"validated");
1191 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
1193 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
1194 lastRotated = ledgerSeq - 1;
1319 testcase(
"Wait for ledger gaps to fill in");
1325 auto failureMessage = [&](
char const* label,
auto expected,
auto actual) {
1327 ss << label <<
": Expected: " << expected <<
", Got: " << actual;
1331 auto const alice =
Account(
"alice");
1353 if (!BEAST_EXPECT(extraCloses.has_value()))
1358 lastRotated >= minSeq && lastRotated <= maxSeq,
std::to_string(lastRotated)))
1363 BEAST_EXPECTS(maxSeq == 3 + *extraCloses,
std::to_string(maxSeq));
1365 initialRange << minSeq <<
"-" << maxSeq;
1366 BEAST_EXPECTS(lm.getCompleteLedgers() == initialRange.
str(), lm.getCompleteLedgers());
1367 BEAST_EXPECT(lm.missingFromCompleteLedgerRange(minSeq, maxSeq) == 0);
1372 if (minSeq + 1 <= maxSeq - 1)
1374 BEAST_EXPECT(lm.missingFromCompleteLedgerRange(minSeq + 1, maxSeq - 1) == 0);
1376 BEAST_EXPECT(lm.missingFromCompleteLedgerRange(minSeq - 1, maxSeq + 1) == 2);
1377 BEAST_EXPECT(lm.missingFromCompleteLedgerRange(minSeq - 2, maxSeq - 2) == 2);
1378 BEAST_EXPECT(lm.missingFromCompleteLedgerRange(minSeq + 2, maxSeq + 2) == 2);
1380 auto expectedRange =
1383 expectedRange << minSeq;
1384 auto lastDelete = minSeq - 1;
1385 for (
auto deleteSeq : deleteSeqs)
1387 if (deleteSeq <= lastDelete)
1389 expectedRange <<
"-" << (deleteSeq - 1);
1390 if (deleteSeq + 1 <= maxSeq)
1391 expectedRange <<
"," << (deleteSeq + 1);
1392 lastDelete = deleteSeq;
1394 if (lastDelete + 1 < maxSeq)
1396 expectedRange <<
"-" << maxSeq;
1398 return expectedRange.
str();
1401 auto deleteLedgerSeq =
1402 [&lm, &store, &netOPs, &minSeq, &lastRotated, &expectedRange, &failureMessage,
this](
1406 using namespace std::chrono_literals;
1415 while (!lm.haveLedger(deleteSeq) && --iterations > 0)
1424 if (!BEAST_EXPECT(lm.haveLedger(deleteSeq)))
1432 lm.clearLedger(deleteSeq);
1433 deleteSeqs.push_back(deleteSeq);
1434 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1438 lm.getCompleteLedgers() == expectedRange(minSeq, deleteSeqs, maxSeq),
1441 expectedRange(minSeq, deleteSeqs, maxSeq),
1442 lm.getCompleteLedgers()));
1443 BEAST_EXPECT(lm.missingFromCompleteLedgerRange(minSeq, maxSeq) == deleteSeqs.size());
1445 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1455 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1459 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1461 BEAST_EXPECT(!store.rendezvous(10ms));
1466 store.getLastRotated() == lastRotated,
1467 failureMessage(
"lastRotated", lastRotated, store.getLastRotated()));
1469 lm.getCompleteLedgers() == expectedRange(minSeq, deleteSeqs, maxSeq),
1472 expectedRange(minSeq, deleteSeqs, maxSeq),
1473 lm.getCompleteLedgers()));
1483 for (
int t = 0; t < 3; ++t)
1494 using namespace std::chrono_literals;
1499 LedgerIndex const deleteSeq = deleteLedgerSeq(env, maxSeq, deleteSeqs);
1500 if (!BEAST_EXPECT(deleteSeq > 0))
1502 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1515 store.getLastRotated() == lastRotated,
1516 failureMessage(
"lastRotated", lastRotated, store.getLastRotated()));
1518 lm.getCompleteLedgers() == expectedRange(minSeq, deleteSeqs, maxSeq),
1521 expectedRange(minSeq, deleteSeqs, maxSeq),
1522 lm.getCompleteLedgers()));
1525 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1536 BEAST_EXPECT(!store.rendezvous(1s));
1544 store.getLastRotated() == lastRotated,
1545 failureMessage(
"lastRotated", lastRotated, store.getLastRotated()));
1547 lm.getCompleteLedgers() == expectedRange(minSeq, deleteSeqs, maxSeq),
1550 expectedRange(minSeq, deleteSeqs, maxSeq),
1551 lm.getCompleteLedgers()));
1558 LedgerIndex const deleteSeq = deleteLedgerSeq(env, maxSeq, deleteSeqs);
1559 if (!BEAST_EXPECT(deleteSeq > 0))
1561 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1569 for (
int l = 0; l < 5; ++l)
1575 store.getLastRotated() == lastRotated,
1576 failureMessage(
"lastRotated", lastRotated, store.getLastRotated()));
1578 lm.getCompleteLedgers() == expectedRange(minSeq, deleteSeqs, maxSeq),
1581 expectedRange(minSeq, deleteSeqs, maxSeq),
1582 lm.getCompleteLedgers()));
1583 if (!BEAST_EXPECT(!lm.haveLedger(deleteSeq)))
1591 BEAST_EXPECT(!store.rendezvous(1s));
1594 lm.setLedgerRangePresent(deleteSeq, deleteSeq);
1595 BEAST_EXPECT(deleteSeqs.back() == deleteSeq);
1596 deleteSeqs.pop_back();
1601 minSeq = lastRotated;
1602 while (deleteSeqs.front() < minSeq)
1604 deleteSeqs.erase(deleteSeqs.begin());
1606 lastRotated = deleteSeq + 1;
1611 env.
closed()->header().seq == maxSeq,
1612 failureMessage(
"maxSeq", maxSeq, env.
closed()->header().seq));
1614 store.getLastRotated() == lastRotated,
1615 failureMessage(
"lastRotated", lastRotated, store.getLastRotated()));
1617 auto const expected = expectedRange(minSeq, deleteSeqs, maxSeq);
1619 lm.getCompleteLedgers() == expected,
1620 failureMessage(
"CompleteLedgers", expected, lm.getCompleteLedgers()));
1622 BEAST_EXPECT(lm.missingFromCompleteLedgerRange(minSeq, maxSeq) == deleteSeqs.size());
1628 if (minSeq + 1 <= maxSeq - 1)
1631 lm.missingFromCompleteLedgerRange(minSeq + 1, maxSeq - 1) == deleteSeqs.size());
1635 BEAST_EXPECTS(
false, failureMessage(
"range collapsed", minSeq, maxSeq));
1638 lm.missingFromCompleteLedgerRange(minSeq - 1, maxSeq + 1) == deleteSeqs.size() + 2);
1640 lm.missingFromCompleteLedgerRange(minSeq - 2, maxSeq - 2) == deleteSeqs.size() + 2);
1642 lm.missingFromCompleteLedgerRange(minSeq + 2, maxSeq + 2) == deleteSeqs.size() + 2);