환영 배너 설정 활성화 이해하기 어려움

가능은 하겠지만… 제 생각에는 설정값이 변경될 때 발생하는 그 이상한 지연 현상을 설명하기에는 부족해 보입니다. 또한 초기 마이그레이션을 지나면 더 이상 이전 사이트 설정 값을 사용하지 않으므로, 이 문제가 영향을 미칠 거라고 생각하지 않습니다.

음, 이건 흥미롭네요… Moin, 관리자 UI에서 활성화되어 있음에도 불구하고 Foundation이 다시 사이트에서 누락되고 있습니다. SiteSetting.clear_cache!(expire_theme_site_setting_cache: true)로 캐시를 지워도 캐시가 지워지지 않습니다. 여기서 두 가지 다른 결과를 얻고 있습니다:

discourse(prod)> SiteSetting.theme_site_settings_json_uncached(-1)
=> "{\"enable_welcome_banner\":true,\"search_experience\":\"search_field\"}"
discourse(prod)> SiteSetting.theme_site_settings_json(-1)
=> "{\"enable_welcome_banner\":false,\"search_experience\":\"search_field\"}"

그리고 방금 이 코드를 직접 실행해 보았습니다:

Discourse.cache.delete(SiteSettingExtension.theme_site_settings_cache_key(-1))

그러자 작동하더군요?? 그 후 관리자에게서 설정을 다시 변경했는데 캐시가 유지되고 있습니다 :thinking: theme_site_settings의 메모리 내 처리에서 뭔가 이상한 일이 일어나고 있는 것 같습니다:

여기서는 다음과 같은 값을 반환합니다:

 -2=>{:enable_welcome_banner=>false, :search_experience=>"search_field"},
 -1=>{:enable_welcome_banner=>true, :search_experience=>"search_field"}}

반면 DB에서 가져오면, 올바른 false 값을 가진 다음 결과가 나옵니다:

ThemeSiteSetting.where(theme_id: -1)
=>
[#<ThemeSiteSetting:0x00007f9164acb2d0 id: 3, theme_id: -1, name: "enable_welcome_banner", data_type: 5, value: "f", created_at: "2025-07-16 07:04:11.117747000 +0000", updated_at: "2025-08-11 06:35:07.606301000 +0000">,
 #<ThemeSiteSetting:0x00007f9164acb190 id: 13, theme_id: -1, name: "search_experience", data_type: 7, value: "search_field", created_at: "2025-07-16 07:04:11.117747000 +0000", updated_at: "2025-07-20 20:56:49.405228000 +0000">]
discourse(prod)> Theme.find(-1).themeable_site_settings
=>
[{:setting=>:enable_welcome_banner, :default=>true, :description=>"Display a banner on your main topic list pages to welcome members and allow them to search site content", :humanized_name=>"Enable welcome banner", :type=>"bool", :value=>false},
 {:setting=>:search_experience,
  :default=>"search_icon",
  :description=>"The default position and appearance of search on desktop devices",
  :humanized_name=>"Search experience",
  :type=>"enum",
  :valid_values=>[{:name=>"search.experience.search_field", :value=>"search_field"}, {:name=>"search.experience.search_icon", :value=>"search_icon"}],
  :translate_names=>true,
  :value=>"search_field"}]

여기서 이 부분을 다룹니다:

그리고 여기:

이것은 여기서 호출됩니다:

그래서 이것이 왜 일어나는지는 아직 확실하지 않지만, 캐시가 이 메모리 내 객체로부터 생성되기 때문에 캐시가 유지되는 이유를 설명할 수 있을 것입니다.

수정: 또한 다른 곳에서는 이 문제를 재현할 수 없지만, Moin님의 사이트에서는 꽤 일관되게 재현할 수 있습니다.

음… 아마도 로컬에서 재현하는 데 성공한 것 같습니다. 멀티프로세스 버그인 것 같아요. 기본적으로 프로세스 A에서 관리자가 인메모리 설정을 변경하지만, 이후 사용자가 프로세스 B로 요청을 보내면 해당 사용자가 새로운 캐시 값을 설정하게 되고, 결과적으로 인메모리 캐시에 오래된 값이 남게 됩니다.

다른 사이트 설정들은 누군가가 설정을 변경할 때마다 MessageBus를 통해 모든 설정을 새로고침하여 이 문제를 우회하고 있습니다:

내일 수정 방법을 찾아보겠습니다 (지금은 제 퇴근 시간이거든요). Moin, 기다려 주셔서 감사합니다!

수정 사항을 병합했습니다. 테스트 방법을 알아내는 데 시간이 좀 더 걸렸기 때문에 시간이 더 소요되었습니다:

Moin 님, 곧 사이트를 배포하겠습니다.

수정: 수정 사항이 배포되었습니다.