mirror of
https://github.com/Xahau/xahaud.git
synced 2025-11-20 10:35:50 +00:00
Compare commits
4 Commits
validators
...
test-cron-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d0b31f85a | ||
|
|
e3863181c5 | ||
|
|
8bcebdea42 | ||
|
|
4cc63c028a |
@@ -1769,7 +1769,7 @@ pool.ntp.org
|
|||||||
# Unless an absolute path is specified, it will be considered relative to the
|
# Unless an absolute path is specified, it will be considered relative to the
|
||||||
# folder in which the xahaud.cfg file is located.
|
# folder in which the xahaud.cfg file is located.
|
||||||
[validators_file]
|
[validators_file]
|
||||||
validators.txt
|
validators-xahau.txt
|
||||||
|
|
||||||
# Turn down default logging to save disk space in the long run.
|
# Turn down default logging to save disk space in the long run.
|
||||||
# Valid values here are trace, debug, info, warning, error, and fatal
|
# Valid values here are trace, debug, info, warning, error, and fatal
|
||||||
|
|||||||
@@ -44,12 +44,15 @@ Cron::preflight(PreflightContext const& ctx)
|
|||||||
|
|
||||||
auto const ret = preflight0(ctx);
|
auto const ret = preflight0(ctx);
|
||||||
if (!isTesSuccess(ret))
|
if (!isTesSuccess(ret))
|
||||||
|
{
|
||||||
|
JLOG(ctx.j.fatal()) << "Cron: preflight failed";
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
auto account = ctx.tx.getAccountID(sfAccount);
|
auto account = ctx.tx.getAccountID(sfAccount);
|
||||||
if (account != beast::zero)
|
if (account != beast::zero)
|
||||||
{
|
{
|
||||||
JLOG(ctx.j.warn()) << "Cron: Bad source id";
|
JLOG(ctx.j.fatal()) << "Cron: Bad source id";
|
||||||
return temBAD_SRC_ACCOUNT;
|
return temBAD_SRC_ACCOUNT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,21 +60,21 @@ Cron::preflight(PreflightContext const& ctx)
|
|||||||
auto const fee = ctx.tx.getFieldAmount(sfFee);
|
auto const fee = ctx.tx.getFieldAmount(sfFee);
|
||||||
if (!fee.native() || fee != beast::zero)
|
if (!fee.native() || fee != beast::zero)
|
||||||
{
|
{
|
||||||
JLOG(ctx.j.warn()) << "Cron: invalid fee";
|
JLOG(ctx.j.fatal()) << "Cron: invalid fee";
|
||||||
return temBAD_FEE;
|
return temBAD_FEE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ctx.tx.getSigningPubKey().empty() || !ctx.tx.getSignature().empty() ||
|
if (!ctx.tx.getSigningPubKey().empty() || !ctx.tx.getSignature().empty() ||
|
||||||
ctx.tx.isFieldPresent(sfSigners))
|
ctx.tx.isFieldPresent(sfSigners))
|
||||||
{
|
{
|
||||||
JLOG(ctx.j.warn()) << "Cron: Bad signature";
|
JLOG(ctx.j.fatal()) << "Cron: Bad signature";
|
||||||
return temBAD_SIGNATURE;
|
return temBAD_SIGNATURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx.tx.getFieldU32(sfSequence) != 0 ||
|
if (ctx.tx.getFieldU32(sfSequence) != 0 ||
|
||||||
ctx.tx.isFieldPresent(sfPreviousTxnID))
|
ctx.tx.isFieldPresent(sfPreviousTxnID))
|
||||||
{
|
{
|
||||||
JLOG(ctx.j.warn()) << "Cron: Bad sequence";
|
JLOG(ctx.j.fatal()) << "Cron: Bad sequence";
|
||||||
return temBAD_SEQUENCE;
|
return temBAD_SEQUENCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,6 +87,12 @@ Cron::preclaim(PreclaimContext const& ctx)
|
|||||||
if (!ctx.view.rules().enabled(featureCron))
|
if (!ctx.view.rules().enabled(featureCron))
|
||||||
return temDISABLED;
|
return temDISABLED;
|
||||||
|
|
||||||
|
if (ctx.tx.getFieldU32(sfLedgerSequence) != ctx.view.info().seq)
|
||||||
|
{
|
||||||
|
JLOG(ctx.j.fatal()) << "Cron: wrong ledger sequence";
|
||||||
|
return tefFAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
return tesSUCCESS;
|
return tesSUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +114,7 @@ Cron::doApply()
|
|||||||
|
|
||||||
if (!sle->isFieldPresent(sfCron))
|
if (!sle->isFieldPresent(sfCron))
|
||||||
{
|
{
|
||||||
JLOG(j_.warn()) << "Cron: sfCron missing from account " << id;
|
JLOG(j_.fatal()) << "Cron: sfCron missing from account " << id;
|
||||||
return tefINTERNAL;
|
return tefINTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,7 +123,7 @@ Cron::doApply()
|
|||||||
auto sleCron = view.peek(klOld);
|
auto sleCron = view.peek(klOld);
|
||||||
if (!sleCron)
|
if (!sleCron)
|
||||||
{
|
{
|
||||||
JLOG(j_.warn()) << "Cron: Cron object missing for account " << id;
|
JLOG(j_.fatal()) << "Cron: Cron object missing for account " << id;
|
||||||
return tesSUCCESS;
|
return tesSUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,7 +135,10 @@ Cron::doApply()
|
|||||||
// do all this sanity checking before we modify the ledger...
|
// do all this sanity checking before we modify the ledger...
|
||||||
uint32_t afterTime = lastStartTime + delay;
|
uint32_t afterTime = lastStartTime + delay;
|
||||||
if (afterTime < lastStartTime)
|
if (afterTime < lastStartTime)
|
||||||
|
{
|
||||||
|
JLOG(j_.fatal()) << "Cron: afterTime < lastStartTime";
|
||||||
return tefINTERNAL;
|
return tefINTERNAL;
|
||||||
|
}
|
||||||
|
|
||||||
// in all circumstances the Cron object is deleted...
|
// in all circumstances the Cron object is deleted...
|
||||||
// if there are further crons to do then a new one is created at the next
|
// if there are further crons to do then a new one is created at the next
|
||||||
@@ -134,7 +146,10 @@ Cron::doApply()
|
|||||||
|
|
||||||
if (!view.dirRemove(
|
if (!view.dirRemove(
|
||||||
keylet::ownerDir(id), (*sleCron)[sfOwnerNode], klOld, false))
|
keylet::ownerDir(id), (*sleCron)[sfOwnerNode], klOld, false))
|
||||||
|
{
|
||||||
|
JLOG(j_.fatal()) << "Cron: Ownerdir bad. " << id;
|
||||||
return tefBAD_LEDGER;
|
return tefBAD_LEDGER;
|
||||||
|
}
|
||||||
|
|
||||||
view.erase(sleCron);
|
view.erase(sleCron);
|
||||||
|
|
||||||
@@ -156,19 +171,22 @@ Cron::doApply()
|
|||||||
auto const page =
|
auto const page =
|
||||||
view.dirInsert(keylet::ownerDir(id), klCron, describeOwnerDir(id));
|
view.dirInsert(keylet::ownerDir(id), klCron, describeOwnerDir(id));
|
||||||
if (!page)
|
if (!page)
|
||||||
|
{
|
||||||
|
JLOG(j_.fatal()) << "Cron: Ownerdir full. " << id;
|
||||||
return tecDIR_FULL;
|
return tecDIR_FULL;
|
||||||
|
}
|
||||||
|
|
||||||
sleCron = std::make_shared<SLE>(klCron);
|
auto newSleCron = std::make_shared<SLE>(klCron);
|
||||||
|
|
||||||
sleCron->setFieldU64(sfOwnerNode, *page);
|
newSleCron->setFieldU64(sfOwnerNode, *page);
|
||||||
sleCron->setFieldU32(sfDelaySeconds, delay);
|
newSleCron->setFieldU32(sfDelaySeconds, delay);
|
||||||
sleCron->setFieldU32(sfRepeatCount, recur - 1);
|
newSleCron->setFieldU32(sfRepeatCount, recur - 1);
|
||||||
sleCron->setFieldU32(sfStartTime, afterTime);
|
newSleCron->setFieldU32(sfStartTime, afterTime);
|
||||||
sleCron->setAccountID(sfOwner, id);
|
newSleCron->setAccountID(sfOwner, id);
|
||||||
|
|
||||||
sle->setFieldH256(sfCron, klCron.key);
|
sle->setFieldH256(sfCron, klCron.key);
|
||||||
|
|
||||||
view.insert(sleCron);
|
view.insert(newSleCron);
|
||||||
view.update(sle);
|
view.update(sle);
|
||||||
|
|
||||||
return tesSUCCESS;
|
return tesSUCCESS;
|
||||||
|
|||||||
@@ -1106,9 +1106,9 @@ chooseLedgerEntryType(Json::Value const& params)
|
|||||||
std::pair<RPC::Status, LedgerEntryType> result{RPC::Status::OK, ltANY};
|
std::pair<RPC::Status, LedgerEntryType> result{RPC::Status::OK, ltANY};
|
||||||
if (params.isMember(jss::type))
|
if (params.isMember(jss::type))
|
||||||
{
|
{
|
||||||
static constexpr std::array<std::pair<char const*, LedgerEntryType>, 22>
|
static constexpr std::array<std::pair<char const*, LedgerEntryType>, 23>
|
||||||
types{
|
types{{
|
||||||
{{jss::account, ltACCOUNT_ROOT},
|
{jss::account, ltACCOUNT_ROOT},
|
||||||
{jss::amendments, ltAMENDMENTS},
|
{jss::amendments, ltAMENDMENTS},
|
||||||
{jss::check, ltCHECK},
|
{jss::check, ltCHECK},
|
||||||
{jss::deposit_preauth, ltDEPOSIT_PREAUTH},
|
{jss::deposit_preauth, ltDEPOSIT_PREAUTH},
|
||||||
@@ -1129,7 +1129,9 @@ chooseLedgerEntryType(Json::Value const& params)
|
|||||||
{jss::ticket, ltTICKET},
|
{jss::ticket, ltTICKET},
|
||||||
{jss::nft_offer, ltNFTOKEN_OFFER},
|
{jss::nft_offer, ltNFTOKEN_OFFER},
|
||||||
{jss::nft_page, ltNFTOKEN_PAGE},
|
{jss::nft_page, ltNFTOKEN_PAGE},
|
||||||
{jss::unl_report, ltUNL_REPORT}}};
|
{jss::unl_report, ltUNL_REPORT},
|
||||||
|
{jss::cron, ltCRON},
|
||||||
|
}};
|
||||||
|
|
||||||
auto const& p = params[jss::type];
|
auto const& p = params[jss::type];
|
||||||
if (!p.isString())
|
if (!p.isString())
|
||||||
|
|||||||
@@ -781,6 +781,22 @@ public:
|
|||||||
auto const& hook = resp[jss::result][jss::account_objects][0u];
|
auto const& hook = resp[jss::result][jss::account_objects][0u];
|
||||||
BEAST_EXPECT(hook[sfAccount.jsonName] == gw.human());
|
BEAST_EXPECT(hook[sfAccount.jsonName] == gw.human());
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
// Create a Cron
|
||||||
|
env(cron::set(gw),
|
||||||
|
cron::startTime(env.now().time_since_epoch().count() + 100),
|
||||||
|
cron::delay(100),
|
||||||
|
cron::repeat(200),
|
||||||
|
fee(XRP(1)));
|
||||||
|
env.close();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// Find the cron.
|
||||||
|
Json::Value const resp = acct_objs(gw, jss::cron);
|
||||||
|
BEAST_EXPECT(acct_objs_is_size(resp, 1));
|
||||||
|
auto const& cron = resp[jss::result][jss::account_objects][0u];
|
||||||
|
BEAST_EXPECT(cron[sfOwner.jsonName] == gw.human());
|
||||||
|
}
|
||||||
{
|
{
|
||||||
// See how "deletion_blockers_only" handles gw's directory.
|
// See how "deletion_blockers_only" handles gw's directory.
|
||||||
Json::Value params;
|
Json::Value params;
|
||||||
|
|||||||
Reference in New Issue
Block a user