Skip to content

fix(sugar): не глотать отмену в fallback-ах autofill + ValidationException для Flags - #86

Merged
Platonenkov merged 1 commit into
devfrom
claude/coderabbit-76-followups-b734b6
Aug 12, 2026
Merged

fix(sugar): не глотать отмену в fallback-ах autofill + ValidationException для Flags#86
Platonenkov merged 1 commit into
devfrom
claude/coderabbit-76-followups-b734b6

Conversation

@Platonenkov

@Platonenkov Platonenkov commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Summary

Два замечания CodeRabbit к релизному PR #76, оставшиеся неразобранными. Оба проверены по коду, оба валидны.

Отмена уходила в fallback autofill

FetchCounterpartySignerCount и FetchLoan оборачивают вызов клиента широким catch. Для случая, ради которого он существует, это верно: аккаунта контрагента или объекта Loan может ещё не быть, и rippled сам сообщит об этом в preclaim. Но в тот же catch попадал OperationCanceledException, поднятый из токена вызывающего, — и вместо остановки autofill продолжал работу и записывал комиссию, посчитанную по запасному значению (один подписант, отсутствующий заём), для запроса, который вызывающий уже отменил.

catch (Exception) when (!cancellationToken.IsCancellationRequested)

Фильтр пропускает наверх отмену, запрошенную вызывающим, и оставляет прежнее поведение для всего остального — в том числе для таймаута внутри клиента, который этот токен не отменяет и потому по-прежнему уходит в fallback.

Flags в MPTokenIssuanceSet сообщал не тем типом

Convert.ToUInt32(flags) бросает FormatException/InvalidCastException на нечисловом значении, тогда как проверка ImmutableFlags двумя строками ниже — и остальные валидаторы — сообщают ValidationException. Вызывающий, который ловит ValidationException, две первые не поймает. Заменено на Common.TryGetUInt32 с явным сообщением.

Тесты

Тест Что фиксирует
..._LoanSet_CancellationIsNotSwallowedByTheSignerFallback отменённый токен бросает и не оставляет Fee
..._LoanPay_CancellationIsNotSwallowedByTheLoanFallback то же для чтения объекта Loan
..._LoanPay_FailedLookupStillFallsBackWhenNotCancelled фильтр не превратил обычный сбой чтения в жёсткую ошибку
TestUMPTokenIssuanceSet_PreflightRules нечисловой Flags даёт ValidationException

Первые два падают, если убрать фильтры — проверено откатом: 2 из 29 в классе. Мок FeeTestClient теперь уважает токен через ThrowIfCancellationRequested, как это делает настоящий клиент.

Что отклонено и почему

TestUChangeServerFailure.cs:101,158 — гонка свободного порта. Зазор описан верно, но предложенные способы не подходят. Удержать listener до StartMock нельзя: тесту нужен именно закрытый порт — это сценарий «сервер поднимется позже», и так задокументировано в GetFreePort. Внутрипроцессные коллизии уже сняты через ClaimedPorts, а межпроцессная гонка не приводит к молчаливому зависанию: на строках 121 и 175 стоит Assert.IsTrue(TestUtils.IsPortStillFree(secondPort), "…rerun"), то есть быстрый отказ с понятной причиной.

connection.cs:2548 — keepalive-порог 30s не выведен из InactivityTimeout. Фактически верно: при InactivityTimeout меньше 30 секунд ветка полноценного ping-запроса недостижима. На дефолтах поведение прежнее, сам CodeRabbit пометил как Trivial / low value, и это чистая читаемость. Трогать connection.cs — файл, вокруг которого крутились четыре последних фикса переподключения, — ради этого перед релизом не стоит; вернёмся отдельно.

Проверка

930 юнит-тестов зелёные.

Summary by CodeRabbit

  • Bug Fixes

    • Autofill operations now correctly propagate cancellation requests instead of applying fallback fees.
    • Non-cancellation lookup failures continue to use fallback fee behavior.
    • Invalid transaction flag values now return a consistent validation error rather than an unexpected conversion error.
  • Tests

    • Added coverage for cancellation handling, fallback behavior, and invalid flag validation.

…ption для Flags

Замечания CodeRabbit к релизному PR #76.

- FetchCounterpartySignerCount и FetchLoan оборачивают вызов клиента широким
  catch — это верно для случая, ради которого он существует (аккаунт
  контрагента или объект Loan ещё не созданы, дальше отработает preclaim), но
  туда же уходил OperationCanceledException от токена вызывающего. Autofill
  продолжал работу и записывал комиссию, посчитанную по fallback — один
  подписант, отсутствующий заём, — для запроса, который вызывающий уже отменил.
  Добавлен фильтр when (!cancellationToken.IsCancellationRequested):
  отмена вызывающего всплывает, а таймаут внутри клиента, который этот токен не
  отменяет, по-прежнему уходит в fallback
- MPTokenIssuanceSet: Flags разбирался через Convert.ToUInt32, бросающий
  FormatException/InvalidCastException на нечисловом значении, тогда как
  соседняя проверка ImmutableFlags и остальные валидаторы сообщают
  ValidationException — её и ловят вызывающие

Тесты: отменённый токен обязан бросить и не оставить Fee (LoanSet и LoanPay),
нечитаемый объект Loan обязан по-прежнему уходить в fallback, нечисловой Flags —
давать ValidationException. Первые два падают, если убрать фильтры.
@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0566b4fd-91e3-4e29-ad23-eb4226308c26

📥 Commits

Reviewing files that changed from the base of the PR and between 5e6ed6e and fe2f417.

📒 Files selected for processing (5)
  • CHANGES.md
  • Tests/Xrpl.Tests/Models/TestUProtocolCompleteness.cs
  • Tests/Xrpl.Tests/Sugar/TestUAutofillFees.cs
  • Xrpl/Models/Transactions/MPTokenIssuanceSet.cs
  • Xrpl/Sugar/Autofill.cs

📝 Walkthrough

Walkthrough

Autofill now propagates caller cancellation during signer-list and loan lookups. Other lookup failures still use fallback fees. MPTokenIssuanceSet now reports malformed Flags values as ValidationException.

Changes

Autofill and transaction validation

Layer / File(s) Summary
Autofill cancellation propagation
Xrpl/Sugar/Autofill.cs, Tests/Xrpl.Tests/Sugar/TestUAutofillFees.cs, CHANGES.md
Lookup methods propagate caller cancellation. Tests verify cancellation, unchanged fees, and fallback behavior for other failures.
MP token flags validation
Xrpl/Models/Transactions/MPTokenIssuanceSet.cs, Tests/Xrpl.Tests/Models/TestUProtocolCompleteness.cs, CHANGES.md
Malformed Flags values now raise ValidationException. Completeness tests cover non-numeric input.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies both main changes: cancellation propagation in autofill fallbacks and ValidationException handling for Flags.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/coderabbit-76-followups-b734b6

Comment @coderabbitai help to get the list of available commands.

@Platonenkov
Platonenkov added this pull request to the merge queue Aug 12, 2026
Merged via the queue into dev with commit d3c8f50 Aug 12, 2026
4 checks passed
@Platonenkov
Platonenkov deleted the claude/coderabbit-76-followups-b734b6 branch August 12, 2026 19:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant