Skip to content

NilLabel WAL entries cause 400 error on AsyncProcessor replay via v3 API #213

@eazyhozy

Description

@eazyhozy

Description

When system-mutation-mode=ASYNC is enabled, mutations to NilLabel tables (e.g., sys.info) are written to WAL and queued like regular mutations. AsyncProcessor then attempts to replay these WAL entries via the v3 sync endpoint (/edges/sync?force=true), which rejects NilLabel because V2BackedEngine.getTableBinding() requires HBaseIndexedLabel.

Error observed (3 occurrences during mode transition):

[AbAsyncDevStreaming] InvalidHttpStatusCodeException : Failed to mutate edge:
http://ab-dev.dev.onkakao.net/graph/v3/databases/sys/tables/info/edges/sync?force=true
{"mutations":[{"type":"INSERT","edge":{"version":1773306252508,"source":"origin","target":"warmup_0","properties":{"props_active":true,"message":"warmup"}}}]}
{"status":400,"error":"Bad Request","message":"This Label (sys.info, class ...NilLabel) is not indexed or not supported for edge mutation"}

Root cause: v2 and v3 mutation APIs behave differently for NilLabel.

Path NilLabel support Result
v2 (/graph/v2/service/sys/label/info/edge) O Returns IDLE
v3 (/graph/v3/databases/sys/tables/info/edges/sync?force=true) X Throws 400

Since AsyncProcessor relays WAL entries through the v3 API, this mismatch causes unnecessary errors during system-mutation-mode transitions.

Expected Behavior

NilLabel is a no-op table that never persists data. Either:

  1. WAL should not be written for NilLabel tables — WAL exists for data durability, but NilLabel has no data to recover. Skipping WAL at the source eliminates the problem without adding business logic to AsyncProcessor.
  2. v3 API should handle NilLabel gracefully — align v3 behavior with v2 by returning IDLE instead of throwing 400.

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions