Debug race condition mất 3 tiếng
Hôm nay dashboard thỉnh thoảng hiện số liệu của lần tải trước. Không lặp lại ổn định, nên mình nghi ngay là race condition.
Chuyện gì xảy ra
Hai request chạy gần như cùng lúc. Request cũ trả về sau request mới và ghi đè state bằng dữ liệu cũ.
let latest = 0;
async function load(q) {
const id = ++latest;
const data = await fetchData(q);
if (id !== latest) return; // bỏ kết quả cũ
render(data);
}
Bài học
- Bug "thỉnh thoảng" đáng nghi đầu tiên là thứ tự bất đồng bộ.
- Ghi log lúc request bắt đầu và kết thúc trước khi đoán.