Перейти к основному содержанию

Seafile 12 — не работает статистика и ошибка Failed to get total storage occupation: RepoSize

Seafile

Продолжаю заниматься отладкой и приведением в порядок Seafile после апгрейда до 12 версии. В логе seafevents.log вижу ошибку:

[2026-01-06 22:42:34] [WARNING] root:197 [TotalStorageCounter] Failed to get total storage occupation: RepoSize

seafile

Не факт что эта ошибка появилась после апгрейда до версии 12, возможно, она появилась ещё раньше. Но всё равно полечим.

И статистика хранилища показывает нули.

seafile

Вот кусок кода, выводящий данную ошибку:

try:
    RepoSize = SeafBase.classes.RepoSize
    VirtualRepo = SeafBase.classes.VirtualRepo
    OrgRepo = SeafBase.classes.OrgRepo

    stmt = select(func.sum(RepoSize.size).label("size"), OrgRepo.org_id).outerjoin(
                  VirtualRepo, RepoSize.repo_id == VirtualRepo.repo_id).outerjoin(
                  OrgRepo, RepoSize.repo_id == OrgRepo.repo_id).where(
                  VirtualRepo.repo_id == null()).group_by(OrgRepo.org_id)
    results = self.seafdb_session.execute(stmt).all()
except Exception as e:
    self.seafdb_session.close()
    self.edb_session.close()
    logging.warning('[TotalStorageCounter] Failed to get total storage occupation: %s', e)
    return
seafile

Исключение происходит в строке:

RepoSize = SeafBase.classes.RepoSize

Причин несколько. Табличка OrgRepo в базе данных seafile_db отсутствует. Это уже не первый раз, когда теряются таблички при апгрейде. Создаём таблицу вручную:

CREATE TABLE IF NOT EXISTS OrgRepo (
  id BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  org_id INTEGER,
  repo_id CHAR(37),
  user VARCHAR(255),
  UNIQUE INDEX(org_id, repo_id),
  UNIQUE INDEX (repo_id),
  INDEX (org_id, user),
  INDEX(user)
) ENGINE=INNODB;
seafile

Вторая причина в том, что в настройках БД отключена чувствительность к регистру, а в коде — нет. К примеру, если код:

RepoSize = SeafBase.classes.RepoSize

заменить на

RepoSize = SeafBase.classes.reposize

и перезапустить сервисы, то ошибка изменится на:

[WARNING] root:197 [TotalStorageCounter] Failed to get total storage occupation: VirtualRepo

automap_base создает класс reposize (маленькими буквами), потому что чувствительность к регистру в настройках БД отключена. И это сильно меня печалит. Очень похоже на костыль в коде Seafile, потому что основной функционал прекрасно работает.

Не думаю, что править код питона правильно. Вероятно, мне нужно будет включить обратно поддержку чувствительности к регистру таблиц БД. И после вручную переименовать таблицы, как планировали их назвать разработчики Seafile.

Переименовываю таблицы

Переименовываю таблицы и добавляю недостающие:

Seafile 12 — недостающие таблицы

seafile

Таблиц мало, делаю руками.

seafile

Готово. В результате нашёл несколько неиспользуемых таблиц, оставил как есть, пусть живут.

Перезагружаю службы. Проверяю.

seafile

В логах ошибки больше нет.

seafile

И статистика заработала.

В базе seahub не переименовал таблички, стали автоматически создаваться дубли. Пришлось вручную переносить данные и удалять старые таблицы. Заметил что в новых таблицах структура может отличаться. Ещё один камень в огород разработчиков.

Думаю, следует рассмотреть вопрос разворачивания нового Seafile (уже версии 13 в докере) и переносе в него данных с нуля. Но это уже не сегодня.

Ссылки

Теги

 

Похожие материалы