migrate-type redis-command: complex-key sub-field migration produces MOVED <wrong-slot>

Aperta
#3,498 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
48/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
cpp, redis

Direzione di ricerca

Parti dal percorso di migrazione di redis-command e dalle posizioni in slot_migrate.cc indicate nell'errore, quindi riproduci il caso a due shard con una chiave hash contenente il tag {T1}. Traccia come vengono codificate le sottochiavi delle chiavi complesse e come la destinazione calcola il loro slot. Il lavoro è completato quando la migrazione di redis-command per le chiavi hash con tag termina senza MOVED; fai il confronto con raw-key-value come baseline del workaround.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug

Summary

With migrate-type redis-command, migrating a slot that contains a hash
key whose name has a {tag} aborts mid-stream:

[I][slot_migrate.cc:373] The key ij/staging/{N/<rand>/<id>} successfully migrated
[E][slot_migrate.cc:203] Failed to send snapshot of slot(s) <range>.
  Error: failed to migrate a key ij/staging/{N/<rand>/<id>}:101:
  failed to migrate complex key: failed to send commands to restore a key:
  wrong response from the destination node:
  got invalid response of length 61: -MOVED <slot> <host>:<port>

The slot number returned in the MOVED reply is different from
CLUSTER KEYSLOT <key> for the same key (we saw parent=5466 and the
reported MOVED=5465). The destination is computing the slot from an
encoded sub-key buffer that does not preserve the {tag} hashtag, so
the destination's command dispatcher believes that sub-key belongs to a
different slot it does not own → MOVED, abort.

Workaround

migrate-type raw-key-value transfers each key as a RocksDB blob and
does not decompose complex keys, so the sub-key hashing path is never
exercised. The same migration that fails with redis-command completes
in seconds with raw-key-value.

We recommend documenting raw-key-value as the preferred type for
production slot migration until the redis-command path is fixed.

Repro (vanilla setup)

  1. Two-shard cluster, migrate-type redis-command (current default).
  2. Insert a hash with a tag: HSET ij/staging/{T1}:101 f1 v1 f2 v2.
  3. Trigger slot migration that includes the slot of {T1}.
  4. Migration aborts with the MOVED error above.

Versions

  • Apache Kvrocks 2.15.0
Lingua principale
C++
Stelle
4.5k
Fork
689
Merge medio
2g 1h
PR unite (30g)
35

Preparare l'ambiente

Apri in Codespaces

Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.

  • Include un Dockerfile o un file Docker Compose
  • Nessun modello di pull request
  • Nessuna guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di apache/kvrocks

Tutte le issue di apache/kvrocks

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.