Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

The last question's answers can be lost when a quiz ends

Aperta
#177 1 commento 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
58/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
node.js, postgresql, typescript
Ambito
backend, database

Direzione di ricerca

Start with apps/ws-server/src/utils/answerQueue.ts, focusing on flushSession, drainSession, and the insert-then-score-update sequence. Trace the quiz:end and end-of-questions callers, then locate the existing answer-queue tests and add coverage for an in-flight flush. Done means all buffered answers are written before the leaderboard is read, and answer persistence plus score updates are atomic or fully retryable.

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

Descrizione

Backend first issue bug help wanted

Answers are buffered in apps/ws-server/src/utils/answerQueue.ts and written in batches. Two paths in that file can lose a batch.

1. drainSession does not actually wait for an in-flight flush
export async function flushSession(sessionId: string): Promise<void> {
    if (flushing.has(sessionId)) return;     // resolves immediately
    ...
}

export async function drainSession(sessionId: string): Promise<void> {
    ...
    try {
        await flushSession(sessionId);       // a no-op if a flush is already running
    } catch { }
    ...
    buffers.delete(sessionId);               // deletes answers regardless
}

If a flush is already running, await flushSession() returns straight away without waiting for it, and drainSession goes on to delete the buffer. Two losses follow:

  • Answers that arrived during the in-flight write are still in buffers and are deleted unwritten.
  • If that in-flight flush then fails, its catch requeues into buffers.get(sessionId) — a map that was just deleted — so the requeue silently does nothing.

This fires on the hot path: drainSession runs at quiz:end and at end-of-questions, immediately after the final question closes, which is exactly when a flush is most likely to be in flight.

Impact: the final question's answers are missing from the leaderboard everyone finishes on, and there is no error anywhere.

2. A failed score update is never retried correctly

The flush inserts answers and then increments scores in two sequential awaits. If the insert succeeds and the score transaction fails, the whole batch is requeued — but on retry the rows already exist, skipDuplicates drops them all, and the returned set is empty. The score increments are skipped and never happen.

Result: ParticipantAnswer rows exist with the right points, while Participant.score was never incremented. The retry looks like a success. The leaderboard sorts on score, so the rankings stay wrong for the rest of the quiz.

What a fix looks like
  • Have flushSession return the in-flight promise rather than undefined, so callers can genuinely await it, and loop in drainSession until the buffer is empty before deleting.
  • Make the insert and the score increments atomic, or derive score from SUM(points) instead of incrementing — the data to reconcile is already in ParticipantAnswer.points.
Definition of done
  • Ending a quiz writes every buffered answer before the final leaderboard is read
  • A failed flush either fully applies or fully retries; no state where answers exist but scores do not
  • A test covering "flush in flight when the quiz ends"
Lingua principale
TypeScript
Stelle
21
Fork
7
Merge medio
4h 31m
PR unite (30g)
22

Preparare l'ambiente

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 TheCodeHeist-Coder/Rexial

Tutte le issue di TheCodeHeist-Coder/Rexial

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.