선택 해제 시 예상치 못한 동작 발생

5월에 새로운 기능이 추가되었습니다: Selective dismissal of New and Unread topics. 최근 최신 버전의 Discourse로 업그레이드했으며, 코드와 DB 로그를 확인해 보니 사용자가 항목을 선택하지 않고 “Dismiss New”(새 항목 무시)를 실행할 때(즉, 일괄 무시하는 경우) 요청 파라미터로 tracked = false만 전달하고 나머지는 아무것도 전달하지 않은 채 reset-new를 호출하는 것으로 보입니다.

image

PR 변경 사항을 살펴본 결과, topic_scope를 결정하는 과정에서 다음 위치에 도달하는 것 같습니다: FEATURE: Allow selective dismissal of new and unread topics (#12976) · discourse/discourse@7a79bd7 · GitHub

그리고 topic_ids를 전달하지 않으므로 if문을 건너뛰고 자동으로 L989로 이동하게 됩니다.

우리는 상당히 큰 규모의 Discourse 서버를 운영 중인데, 모든 Topics를 대상으로 하는 개념은 상당히 비용이 많이 드는 것 같습니다. 기본적으로 쿼리가 다음과 같이 생성되기 때문입니다:

LEFT JOIN topic_users ON topic_users.topic_id = topics.id AND topic_users.user_id = xxx WHERE "topics"."deleted_at" IS NULL AND "topics"."id" IN (1, ... 1000000) AND (topics.created_at >= 'date') AND (topic_users.last_read_post_number IS NULL) AND (topics.archetype <> 'private_message') ORDER BY topics.created_at DESC LIMIT 500

IN 절에는 100만 개가 넘는 모든 Topic ID가 포함된 것으로 보입니다.

일괄 선택 시 기본값을 모든 가능한 Topics 대신 해당 Topic ID들만 전달하도록 변경할 수 있을까요?

@martin 알림을 드려 죄송합니다. 위에 링크된 문제가 있는 커밋을 바로 전에 푸시하신 것 같습니다.

현재 확인되는 문제의 근본 원인이 이렇다는 분석이 정확한지 확인해 주실 수 있을까요? “모든 새 알림 해제” 기본 동작에서 쿼리에 거대한 필터 목록(약 100만 개의 토픽 ID)이 포함되어 있는 것을 확인했습니다. (저희 포럼에는 Discourse 토픽이 매우 많이 호스팅되어 있습니다.)

Discourse 팀에서 이 문제에 우선순위를 두지 않으신다면 PR을 통해 해결하는 데 도움을 드릴 수 있지만, 이 문제로 영향을 받는 곳이 저희뿐이 아닐 것 같고, 일부 고객들의 DB 성능에도 영향을 미치고 있을 수 있습니다.

@forkythetoy와 @Hooksmith에게 이 문제를 알려주셔서 감사합니다. 메타에서도 이 쿼리가 매우 무겁다는 것을 확인했습니다. 오늘 수정안을 작성할 예정이며, 사용자에게 ‘새로 추가됨’ 목록에 표시되는 토픽의 ID만 사용하는 방식으로 변경하면 될 정도로 간단할 것입니다. 패치가 준비되면 이곳에 다시 올릴 예정입니다.

오늘 이 수정 사항을 병합했습니다: