알림 개수가 일치하지 않고 잘못 표시됩니다

한 주 된 아주 작은 포럼을 운영 중이며, 최신 버전으로 업데이트를 마쳤는데도 여전히 매우 이상한 현상을 겪고 있습니다. 알림 카운트(새 항목 등)가 실제 카운트와 일치하지 않는 것 같고, 무작위로 변합니다.

현재 "New (3)"라고 표시됩니다.

"New"를 클릭하면 새 게시글이 없고, "(3)"도 사라집니다.

홈 페이지로 돌아가면 메뉴에 "New (3)"가 더 이상 표시되지 않습니다.

페이지를 새로고침하면 "New (3)"가 다시 나타납니다.

"Latest"를 클릭하면 "Unread (2)"가 보이지만, 목록의 어떤 메시지에도 안 읽음 표시가 없습니다.

"Unread (2)"를 클릭하면 안 읽은 메시지가 없다는 것을 알 수 있습니다.

가끔 "New"를 클릭하면 새 메시지가 없고 “Unread (1)” 표시만 보입니다.

/sidekiq/를 확인해 보았는데 모든 것이 정상으로 보이며, 대기 중이거나 백업된 작업은 없습니다.

3개의 좋아요

사이트가 어떤 버전의 Discourse를 사용 중인지 확인해 주시겠어요? 사이트 관리자 대시보드 상단 근처에 표시되어 있어야 합니다.

3개의 좋아요

2.5.0.beta4

( 74db317974 )

2개의 좋아요

음소거된 태그나 카테고리가 있나요?

일관된 재현 방법이 있나요?

2개의 좋아요

음소거된 항목은 없으며, 포럼에 새로운 활동이 생겨도 이 문제는 계속되고 있습니다. 직접 확인해 보려면 계정을 만들어 보시기 바랍니다. (다른 사람들도 같은 현상을 보고 있는지, 아니면 제 계정에서만 발생하는지는 아직 확인하지 못했습니다.)

관리자 영역을 확인해 보세요. 경고 메시지가 있는지, Sidekiq가 실행 중인지 확인해 주세요.

1개의 좋아요

경고 메시지가 없고, Sidekiq도 정상적으로 보입니다. 제가 이 내용을 제대로 이해하고 있다면 말이죠.

클라우드플레어 또는 유사한 CDN을 사용 중이신가요? 가속 기능이 꺼져 있더라도 클라우드플레어에서 일부 알림 지연이 발생하는 것을 확인했습니다. 예를 들어 로켓 로더(Rocket Loader) 같은 경우입니다.

1개의 좋아요

아, 이 부분을 놓치고 있었네요… 즉, 일관되게 뭔가 잘못된 것입니다. 이는 서버가 클라이언트에게 새로운 토픽이 여러 개 있다고 알려주지만, 실제로 들어가 보면 해당 토픽이 없다는 뜻입니다.

이전에도 예약 게시글(scheduled posts) 때문에 이런 일이 발생한 적이 있습니다… 예약 게시글을 사용하시나요? 이를 디버깅하는 것은 다소 까다로운데, 클라이언트가 새 것으로 인식하는 topic_id 목록을 확인해야 합니다.

지금 이 문제가 발생하고 있다면 다음을 실행해 보세요:

SELECT 
           u.id AS user_id,
           topics.id AS topic_id,
           topics.created_at,
           highest_staff_post_number highest_post_number,
           last_read_post_number,
           c.id AS category_id,
           tu.notification_level
FROM topics
JOIN users u on u.id = 1
JOIN user_stats AS us ON us.user_id = u.id
JOIN user_options AS uo ON uo.user_id = u.id
JOIN categories c ON c.id = topics.category_id
LEFT JOIN topic_users tu ON tu.topic_id = topics.id AND tu.user_id = u.id
LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 1
WHERE u.id = 1 AND
      
      topics.archetype <> 'private_message' AND
      ((1=0) OR ("topics"."deleted_at" IS NULL AND topics.created_at >= GREATEST(CASE
                  WHEN COALESCE(uo.new_topic_duration_minutes, 2880) = -1 THEN u.created_at
                  WHEN COALESCE(uo.new_topic_duration_minutes, 2880) = -2 THEN COALESCE(u.previous_visit_at,u.created_at)
                  ELSE ('2020-05-13 00:36:29.100619'::timestamp - INTERVAL '1 MINUTE' * COALESCE(uo.new_topic_duration_minutes, 2880))
               END, us.new_since, '2020-05-07 14:46:17') AND tu.last_read_post_number IS NULL AND COALESCE(tu.notification_level, 2) >= 2 AND topics.created_at > '2020-05-07 14:46:17' AND (category_users.last_seen_at IS NULL OR topics.created_at > category_users.last_seen_at))) AND
      
      
      topics.deleted_at IS NULL AND
      
      NOT (
        last_read_post_number IS NULL AND
        COALESCE(category_users.notification_level, 1) = 0
      )

UNION ALL

SELECT 
           u.id AS user_id,
           topics.id AS topic_id,
           topics.created_at,
           highest_staff_post_number highest_post_number,
           last_read_post_number,
           c.id AS category_id,
           tu.notification_level
FROM topics
JOIN users u on u.id = 1
JOIN user_stats AS us ON us.user_id = u.id
JOIN user_options AS uo ON uo.user_id = u.id
JOIN categories c ON c.id = topics.category_id
LEFT JOIN topic_users tu ON tu.topic_id = topics.id AND tu.user_id = u.id
LEFT JOIN category_users ON category_users.category_id = topics.category_id AND category_users.user_id = 1
WHERE u.id = 1 AND
       topics.updated_at >= us.first_unread_at AND 
      topics.archetype <> 'private_message' AND
      (("topics"."deleted_at" IS NULL AND tu.last_read_post_number < topics.highest_staff_post_number AND COALESCE(tu.notification_level, 1) >= 2) OR (1=0)) AND
      
      
      topics.deleted_at IS NULL AND
      
      NOT (
        last_read_post_number IS NULL AND
        COALESCE(category_users.notification_level, 1) = 0
      )

user_id = 1 부분을 사용자의 ID로 대체하세요 (select id, username from users where username = 'yourusername'를 실행하여 찾을 수 있습니다).

이 문제가 계속 발생한다면 data explorer를 설치해서 어떤 일이 일어나고 있는지 확인해 주시겠습니까?

1개의 좋아요

CDN도, 예약 게시글도 사용하지 않습니다. 이것은 Linode VPS에서 Docker로 실행되는 표준 Discourse 설치 환경일 뿐이며, 특별한 설정은 전혀 없습니다.

방금 데이터 익스플로러(data explorer) 플러그인을 설치했는데, 이제 설정 페이지조차 로드되지 않습니다. 콘솔에 JS 오류가 발생하며 크래시 납니다:

workbox-strategies.prod.js:1 Uncaught (in promise) no-response: no-response :: [{"url":"https://forum.livevideotech.today/admin/site_settings"}]
    at a.makeRequest (https://forum.livevideotech.today/javascripts/workbox/workbox-strategies.prod.js:1:2145)
1개의 좋아요

커스텀 플러그인이 있나요? 베타 브랜치를 사용 중이시나요, 아니면 tests-passed를 사용 중이시나요? 베타를 사용 중이시라면 당분간 tests-passed로 변경해 주실 수 있을까요?

플러그인 하나: GitHub - discourse/discourse-solved: Allow accepted answers on topics · GitHub

저는 표준 설치 과정을 거치고 프롬프트된 업그레이드를 실행한 끝에 2.5.0.beta4 버전을 사용하고 있습니다.

특정 브랜치로 전환하는 방법을 모르겠고, 어떻게 하는지 알아보려고 검색했을 때 나온 검색 결과 중 하나만 실패한 데이터베이스 마이그레이션을 시도하다가 문제가 생겼던 사람의 사례였기 때문에, 그 방법은 위험해 보입니다.

명령줄에서 데이터베이스에 연결하여 쿼리를 실행해 보았지만, 결과가 없었습니다:

discourse(#         last_read_post_number IS NULL AND
discourse(#         COALESCE(category_users.notification_level, 1) = 0
discourse(#       );
 user_id | topic_id | created_at | highest_post_number | last_read_post_number | category_id | notification_level
---------+----------+------------+---------------------+-----------------------+-------------+--------------------
(0 rows)

discourse=#

보충 설명을 드리자면, 현재 상태에서는 홈페이지를 열면 "새 글 (1)"이 표시되고, "새 글 (1)"을 클릭하면 새 글이 전혀 보이지 않습니다. 다시 홈페이지로 돌아가면 "새 글 (1)"이 사라집니다. 페이지를 새로고침하면 다시 나타납니다.

오래된 커밋을 실행 중이며 베타 버전이 아닙니다.

콘솔에서 다시 빌드해 주시겠어요? 데이터 탐색기가 작동해야 합니다.

현재 4078b22887 커밋을 사용 중이라고 표시되어 있으며, 이는 master보다 정확히 한 커밋 뒤처진 상태입니다.

아, 맞다. 죄송합니다. 사이트 설정에서 데이터 탐색기를 활성화한 후에도 여전히 오류가 발생하는지 확인해 주실 수 있을까요? 또한 다른 브라우저(Firefox/Chrome)에서도 시도해 보시고, 작업 상자 오류가 계속 발생하는지 확인해 주세요.

데이터 탐색기 문제는 나중에 처리할 예정입니다. 매번 내려가게 만들면서 포럼을 계속 재구축하고 싶지 않으니까요. 그냥 명령줄에서 쿼리를 실행하겠습니다.

현재 상태: “새로움 (4)”

 user_id | topic_id |         created_at         | highest_post_number | last_read_post_number | category_id | notification_level
---------+----------+----------------------------+---------------------+-----------------------+-------------+--------------------
       1 |      116 | 2020-05-13 06:48:33.784078 |                   1 |                       |           5 |
       1 |      118 | 2020-05-13 07:29:47.423296 |                   1 |                       |           5 |
       1 |      117 | 2020-05-13 06:52:39.448473 |                   1 |                       |          13 |
       1 |       31 | 2020-05-03 14:13:53.109324 |                   4 |                     3 |           7 |                  2

"새로움 (4)"을 클릭하면 118, 117, 116의 세 개의 게시물이 보입니다. 해당 topic_id 31은 표시되지 않습니다.

홈 페이지로 돌아가면 "새로움 (3)"으로 표시됩니다.

쿼리 결과는 여전히 동일한 4건을 반환합니다.

4개의 좋아요

흥미롭네요. 토픽 31로 이동해서 확인해 주실 수 있을까요? 뭔가 이상한 점이 있는 것 같습니다. 해당 토픽은 읽지 않은 토픽입니다(last_read_post_number가 3입니다)… 쿼리 결과로는 새 글 3개와 읽지 않은 글 1개가 있다고 판단하고 있습니다.

클라이언트 측에서 웹 워커 캐싱 관련 문제가 발생하고 있는 것 같다는 생각이 계속 듭니다.

크롬을 사용 중이신가요, 아니면 파이어폭스인가요… 다른 브라우저로 시도해 보실 수 있을까요? 확장 프로그램 없이 시크릿 모드(비공개 모드)에서도 테스트해 보실 수 있을까요?

4개의 좋아요

오, @martin, 방금 버그를 발견했어요… 우연히 태그를 음소거하고 계신가요?

태그를 음소거하고 있고, 100% 태그가 없는 주제(Topic)가 하나라도 있으면, 읽지 않은 항목에서 해당 주제가 누락되는 버그가 있습니다.

3개의 좋아요

이것이 정확히 @aaronpk 님의 문제인지 100% 확신은 없습니다… 하지만 이 수정사항은 이제 적용되었습니다:

6개의 좋아요