• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

tarantool / crud / 33089793479
89%
master: 89%

Build:
Build:
LAST BUILD BRANCH: add-s3-coverage-upload
DEFAULT BRANCH: master
Ran 27 Aug 2026 04:15PM UTC
Jobs 1
Files 68
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

27 Aug 2026 03:47PM UTC coverage: 88.556%. First build
33089793479

push

github

Satbek
fix: retry a call only after a recovery action

call_with_retry_and_recovery() retried every failed call once, no
matter what the error was, and for a single call it followed the
destination reported in a bucket ref error. Two problems came out of
that.

First, the destination redirect was unsafe. During a rebalancing the
source storage rejects a request with a bucket ref error and reports
the transfer destination; the router then sent the retry straight to
that destination, which may not have received the bucket yet. In fast
mode the request was applied there against an empty space, so the same
key could end up on two storages at once.

Second, a call that failed for an unrelated reason -- a storage error,
a timeout -- was retried blindly, which could silently double the
effective request timeout the user had asked for.

Rework the recovery into an explicit step: recover_from_err() performs
an action for the errors it knows and only then reports whether a
retry makes sense.

  * MISSING_MASTER -- the master is not discovered yet, so it is
    discovered explicitly and the same replicaset is retried.
  * NON_MASTER -- the cached master is stale, but the bucket did not
    move, so the master is updated and the same replicaset is retried.
  * WRONG_BUCKET, BUCKET_IS_LOCKED, TRANSFER_IS_IN_PROGRESS -- the
    route is stale, so the bucket route cache is reset and the retry
    target is re-discovered via vshard:route() instead of being taken
    from the error. If the error covers more than one bucket, there is
    no single target to retry on, so the error is returned as is.
  * Anything else is returned to the caller without a retry.

The retry no longer extends the request timeout: a deadline is taken
before the first attempt, and the retry gets only the time left before
it (request_timeout is clamped to the same value).

Map calls do not go through the recovery at all: they are async, so
storage errors arrive later in the future payload and there is... (continued)

37 of 43 new or added lines in 1 file covered. (86.05%)

5440 of 6143 relevant lines covered (88.56%)

11967.1 hits per line

Uncovered Changes

Lines Coverage ∆ File
6
91.28
crud/common/call.lua
Jobs
ID Job ID Ran Files Coverage
1 33089793479.1 27 Aug 2026 04:15PM UTC 68
88.56
GitHub Action Run
Source Files on build 33089793479
  • Tree
  • List 68
  • Changed 0
  • Source Changed 0
  • Coverage Changed 0
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • c8ae4a3b on github
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc