refactor(P1.2-revue): Compact — один RebuildIndexes + ensureIndexes; журнал ревью-фиксов

Пункт 4 ревью: убран дублирующий блок перестройки индексов в Compact
(ensureIndexes на входе + один RebuildIndexes на выходе). Поведение то же,
логика чище. Дополнен HISTORY разделом о фиксах код-ревью.
This commit is contained in:
Repinoid
2026-10-07 08:44:02 +03:00
parent 2e1c594892
commit 33a0adc9be
2 changed files with 27 additions and 9 deletions
+5 -9
View File
@@ -298,15 +298,12 @@ func (q *Queue) CompactIfNeeded() {
// Compact — физически удаляет tombstone-слоты, сохраняя порядок живых, и
// перестраивает индексы. O(N). Вызывать под write-блокировкой.
func (q *Queue) Compact() {
// ensureIndexes гарантирует len(deadIdx)==len(Messages) (иначе слоты разъедутся)
// и корректность deadCount. При согласованном состоянии — две дешёвые проверки.
q.ensureIndexes()
if q.deadCount == 0 {
return
}
if len(q.deadIdx) != len(q.Messages) {
q.RebuildIndexes()
if q.deadCount == 0 {
return
}
}
n := 0
for i := range q.Messages {
if q.deadIdx[i] {
@@ -323,10 +320,9 @@ func (q *Queue) Compact() {
tail[i] = SqsMessage{}
}
q.Messages = q.Messages[:n]
// После чистки tombstone нет — сбрасываем флаги, чтобы RebuildIndexes
// построил индексы только по живым (иначе старые deadIdx-флаги «съедут»).
// После чистки tombstone нет: обнуляем флаги и перестраиваем индексы по живым
// (RebuildIndexes заново посчитает liveCount/deadCount и заполнит receipt/uuid).
q.deadIdx = q.deadIdx[:0]
q.deadCount = 0
q.RebuildIndexes()
}