Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

[Bug]: DELETE /{db} returns 500 badarg instead of 404 when the shard map cache still lists a just-deleted database

Open Beginner friendly
#6,142 0 comments 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
1/5
Estimated time
Under an hour
Newbie friendliness
90/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
erlang
Domain
api, backend, databases

Research direction

Start in src/fabric/src/fabric_db_delete.erl at fabric_db_delete:maybe_stop/2, specifically the branch where every shard returns not_found. Check the warning format and verify the completed behavior with the reported concurrent-reader reproduction: the second DELETE returns 404 with not_found and the warning is logged instead of producing a 500 badarg.

Written by the indexing model from the issue text.

Description

Version

3.5.1

Describe the problem you're encountering

Right after a database is deleted, a second DELETE /{db} can answer 500 {"error":"unknown_error","reason":"badarg"} instead of 404 not_found. The stack trace in the log points to fabric_db_delete:maybe_stop/2.

That branch should turn "every shard answered not_found" into {stop, not_found}, but it crashes while formatting its own log message:

%% src/fabric/src/fabric_db_delete.erl (line 79 in 3.5.1, line 78 in 3.5.2 and main)
{W, 0, W} ->
    {#shard{dbname = Name}, _} = hd(Counters),
    couch_log:warning("~p not_found ~d", [?MODULE, Name]),
    {stop, not_found};

Name is a binary, so ~d raises badarg and the request fails with a 500.

This branch is only reached when the shard map cache (mem3) still lists the database after it was deleted, for example when a read that raced with the deletion put its shards back in the cache. Until the cache catches up, other requests on that database also fail with 500 "No DB shards could be opened.". That part may be expected while the deletion propagates; the badarg is not.

Expected Behaviour

The second DELETE should answer 404 {"error":"not_found","reason":"Database does not exist."}, and the warning should be logged. Using ~s (or ~p) instead of ~d in that format string should be enough.

Steps to Reproduce

On a single-node CouchDB 3.5.1 (couchdb:3.5.1 Docker image, default config). Replace $COUCH with the server URL including admin credentials.

DB=badarg_repro
curl -s -X PUT "$COUCH/$DB"
# a few concurrent readers
for i in 1 2 3 4; do
  ( while true; do curl -s -o /dev/null "$COUCH/$DB"; done ) &
done
curl -s -X DELETE "$COUCH/$DB"   # {"ok":true}
curl -s -X DELETE "$COUCH/$DB"   # often: 500 {"error":"unknown_error","reason":"badarg","ref":...}
kill %1 %2 %3 %4

With this script, the second DELETE answered 500 badarg (always "ref":17476293) in 14 of 40 runs on our machine; a tighter loop hit it in 188 of 200. With no concurrent readers it did not reproduce (0 out of 150).

Your Environment
  • CouchDB 3.5.1, official Docker image, single node
  • Seen from the CouchDB integration tests of rouchdb, on a GitHub Actions Linux runner and on Docker Desktop for macOS
Additional Context

The format string is the same in 3.5.2 and on main, so those are likely affected as well. On the client side we now retry these 500s for about a second after a delete.

Dominant language
Erlang
Stars
7k
Forks
1.1k
Avg merge
2d 10h
Merged PRs (30d)
18

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from apache/couchdb

All issues in apache/couchdb

Similar issues

More Backend & API Design issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.