해당 토픽은 현재 세 가지 서로 다른 문제를 다루고 있으므로, 이 내용은 Latest update won't build due to various reasons 에서 분리해 정리합니다.
문제:
AI 플러그인이 설치된 상태에서 Discourse를 업데이트하려고 하면 다음 오류가 발생합니다.
PG::UndefinedColumn: ERROR: column llm_models.url does not exist
LINE 1: SELECT "llm_models".* FROM "llm_models" WHERE "llm_models"
그리고 AI 플러그인이 제거될 때까지 Discourse를 사용할 수 없게 됩니다.
발생 시점:
AI 플러그인이 설치된 인스턴스를 업데이트할 때
20240514171609마이그레이션이 아직 적용되지 않은 버전에서- 커밋 8d5f901 또는 그 이후 버전으로
(제 주요 질문은 왜 이 문제가 이미 설치된 플러그인을 업데이트할 때만 발생하고, 플러그인을 새로 설치할 때는 발생하지 않는지에 대한 것이었습니다. 그 이유는 코어가 PG::UndefinedTable 예외는 포착하지만 PG::UndefinedColumn은 포착하지 않기 때문입니다. 플러그인이 이미 설치된 상태라면 예외는 후자(PG::UndefinedColumn)가 되고, 플러그인이 완전히 새로운 상태라면 전자(PG::UndefinedTable)가 됩니다).
원인:
plugin.rb가 LlmModel.enable_or_disable_srv_llm!을 호출하는데, 이 메서드는 llm_models.url 컬럼이 존재하는 것에 의존합니다. 하지만 해당 컬럼을 추가하는 마이그레이션 20240514171609이 아직 적용되지 않았다면 크래시가 발생합니다.
문제는 db:migrate가 또한 이 코드를 실행한다는 것입니다. 이로 인해 마이그레이션이 적용되기 전에 rake 작업이 크래시합니다.
제안된 우회 방법 / 수정 사항:
- 코드를
LlmModel.enable_or_disable_srv_llm! if Discourse.running_in_rack?로 변경 (이렇게 하면db:migrate가 해당 메서드를 호출하지 않음)
또는 - 코드를
LlmModel.enable_or_disable_srv_llm! rescue nil로 변경 (크래시가 발생하지 않도록 함)
또는 - 코어의 부트스트래핑 코드를 수정하여
PG::UndefinedTable외에도PG::UndefinedColumn을 포착하도록 변경 (이것과 향후 유사한 문제가 포착되도록 함)