Описание бага
При переключении с StoreViewedInJson: true на false старый viewed.json
остаётся на диске. При каждом последующем старте TorrServer функция MigrateAll
в migrate.go перезаписывает данные Viewed в bbolt (config.db) более старыми
данными из viewed.json, что приводит к потере недавно поставленных отметок
о просмотре серий.
Причина
В MigrateAll, если target (bbolt) уже содержит запись для хеша, но она
отличается от source (json) — target безусловно перезаписывается:
targetData := target.Get(xpath, name)
if targetData != nil {
if equal, err := isByteArraysEqualJson(sourceData, targetData); err == nil && equal {
skippedCount++
continue
}
}
target.Set(xpath, name, sourceData) // ← перезаписывает более новые данные bbolt старым json
Миграция не проверяет какой источник новее — просто перезаписывает если данные не идентичны.
Как воспроизвести
- Запустить TorrServer с
StoreViewedInJson: true какое-то время
- Переключить на
StoreViewedInJson: false — viewed.json остаётся на диске
- Поставить несколько отметок о просмотре (записываются в bbolt)
- Перезапустить TorrServer
- Отметки пропадают — bbolt был перезаписан старым
viewed.json
Ожидаемое поведение
Если target (bbolt) уже содержит данные для хеша, нужно либо:
- Пропустить (не перезаписывать) — bbolt является активным хранилищем
- Смержить индексы из обоих источников — объединение множеств file_index
Предлагаемый фикс в MigrateAll:
targetData := target.Get(xpath, name)
if targetData != nil {
skippedCount++ // уже есть в target — пропускаем, не перезаписываем
continue
}
target.Set(xpath, name, sourceData)
Масштаб проблемы
Затронуты все пользователи у кого остался viewed.json от периода работы
с StoreViewedInJson: true. При каждом рестарте история просмотров молча
откатывалась назад. Подтверждено на MatriX.137, код migrate.go идентичен в MatriX.141.
Описание бага
При переключении с
StoreViewedInJson: trueнаfalseстарыйviewed.jsonостаётся на диске. При каждом последующем старте TorrServer функция
MigrateAllв
migrate.goперезаписывает данные Viewed в bbolt (config.db) более старымиданными из
viewed.json, что приводит к потере недавно поставленных отметоко просмотре серий.
Причина
В
MigrateAll, если target (bbolt) уже содержит запись для хеша, но онаотличается от source (json) — target безусловно перезаписывается:
Миграция не проверяет какой источник новее — просто перезаписывает если данные не идентичны.
Как воспроизвести
StoreViewedInJson: trueкакое-то времяStoreViewedInJson: false—viewed.jsonостаётся на дискеviewed.jsonОжидаемое поведение
Если target (bbolt) уже содержит данные для хеша, нужно либо:
Предлагаемый фикс в
MigrateAll:Масштаб проблемы
Затронуты все пользователи у кого остался
viewed.jsonот периода работыс
StoreViewedInJson: true. При каждом рестарте история просмотров молчаоткатывалась назад. Подтверждено на MatriX.137, код migrate.go идентичен в MatriX.141.