Skip to content

Баг: MigrateAll перезаписывает более новые данные bbolt старым viewed.json при старте #678

@wpresident

Description

@wpresident

Описание бага

При переключении с 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

Миграция не проверяет какой источник новее — просто перезаписывает если данные не идентичны.

Как воспроизвести

  1. Запустить TorrServer с StoreViewedInJson: true какое-то время
  2. Переключить на StoreViewedInJson: falseviewed.json остаётся на диске
  3. Поставить несколько отметок о просмотре (записываются в bbolt)
  4. Перезапустить TorrServer
  5. Отметки пропадают — 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions