ruperty
(Ruperty)
2월 16, 2020, 3:59오후
1
mbxs를 가져오는 과정에서 부모 메시지가 존재하지 않는다는 오류가 발생하고 있습니다. 데이터베이스의 index.db 파일에는 해당 메시지가 존재하는 것으로 보이는데도 말이죠.
오류 메시지는 다음과 같습니다:
Parent message 9205270657.AB03850@ben.dciem.dnd.ca doesn’t exist. Skipping 9206031720.AA22567@ben.dciem.dnd.ca : A CALL FOR HELP
그리고 데이터베이스 항목은 다음과 같습니다:
이러한 실패가 발생하는 이유에 대해 어떤 제안이 있을까요?
gerhard
(Gerhard Schlager)
2월 16, 2020, 10:33오후
2
이메일을 제목별로 그룹화하고 있어서 정렬 순서가 잘못되었을 수도 있습니다. 확인해 볼 가치가 있습니다. 메시지는 Subject와 mbox 파일 내 이메일 순서만 기준으로 정렬됩니다.
정말 이메일을 제목별로 그룹화해야 하나요? 스크린샷을 보면 이메일에 올바른 Message-ID와 In-Reply-To, References 헤더가 포함된 것으로 보입니다.
ruperty
(Ruperty)
2월 17, 2020, 10:41오전
3
감사합니다. email_order 테이블을 확인해 보니 순서가 올바르게 정렬되어 있는 것처럼 보입니다:
이 부모 메시지를 가져오지 못하는 다른 문제가 있을 수 있을까요?
처음 가져오기를 했을 때 그룹화가 전혀 이루어지지 않은 것처럼 보였습니다. 문제가 되는 것이 회신이 원발신자가 아닌 메일링 리스트로 향하고 있다는 점이라고 생각합니다. 또한, 아카이브가 28년 동안 수동으로, 그리고 Eudora의 서로 다른 버전으로 다소 무질서하게 구축되었기 때문에 일부 메시지는 해당 필드가 전혀 없습니다.
gerhard
(Gerhard Schlager)
2월 17, 2020, 11:07오전
4
부모 메시지를 가져오는 데 실패한 것일까요? 오류가 있었나요? 메시지가 발견되지 않는 이유를 파악하기가 어렵습니다. 죄송하지만, 가져오기 스크립트의 Ruby 코드를 수정하여 직접 디버깅해야 할 것 같습니다.
ruperty
(Ruperty)
2월 17, 2020, 2:31오후
5
아니요, 오류가 있었다고 생각하지 않습니다.
알겠습니다. Ruby나 가져오기 스크립트에 익숙하지는 않지만, 시도해 볼 수 있을 것 같습니다.
어떤 스크립트를 어디에서 확인해야 하는지 알려 주실 수 있나요? "디버깅"이란 print 문을 추가하는 것을 의미하는 건가요, 아니면 더 정교한 기능이 있는 건가요?
gerhard
(Gerhard Schlager)
2월 17, 2020, 2:48오후
6
ruperty
(Ruperty)
2월 17, 2020, 9:38오후
7
음, map_first_post에 몇 개의 print 디버깅을 추가했습니다.
def map_first_post(row)
puts "Mapping parent #{row['msg_id']} #{row['subject'][0..40]}"
mapped = map_post(row)
mapped[:category] = category_id_from_imported_category_id(row['category'])
mapped[:title] = row['subject'].strip[0...255]
mapped
puts "Mapped message #{row['msg_id']} #{row['subject'][0..40]}"
end
def map_reply(row)
parent = @lookup.topic_lookup_from_imported_post_id(row['in_reply_to'])
if parent.blank?
puts "Parent message #{row['in_reply_to']} doesn't exist. Skipping #{row['msg_id']}: #{row['subject'][0..40]}"
return nil
end
mapped = map_post(row)
mapped[:topic_id] = parent[:topic_id]
mapped
end
이 출력은 정상적으로 작동하며, 부모 메시지가 매핑(또는 가져오기)되었음을 시사합니다.
873 / 65936 ( 1.3%) [3895 items/min]
Mapping parent 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
Mapped message 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
874 / 65936 ( 1.3%) [3900 items/min]
Parent message 9205270657.AB03850@ben.dciem.dnd.ca doesn’t exist. Skipping 9206031720.AA22567@ben.dciem.dnd.ca : A CALL FOR HELP
그래서 map_reply에서 부모가 왜 빈 값(blank)인지 이해가 되지 않습니다. 제가 주목한 유일한 점은 숫자(873/874)가 위의 rowid보다 1 작다는 것입니다.
하지만 @lookup.topic_lookup_from_imported_post_id가 무엇을 하는지 알 수 없고, vi로 편집한 후 가져오기를 다시 실행하는 과정이 매우 번거로워 더 이상 진행하기 어렵습니다. 각 사이클에 약 30분이 걸리니까요.
pfaffman
(Jay Pfaffman)
2월 17, 2020, 10:40오후
8
같은 디렉터리의 base.rb 파일에 있습니다. 그리고 함수 이름이 암시하듯, import_id(이 경우 메시지 ID일 것으로 추정됩니다)를 찾아서 topic_id를 조회하는 역할을 합니다. 이는 토픽 커스텀 필드(혹은 게시글 커스텀 필드?)에서 수행됩니다.
일주일씩 걸리는 것보다는 낫지 않나요? (가끔은 가져오기 스크립트가 디버깅하려는 부분만 가져오도록 설정할 수 있습니다. 어떻게 그렇게 하는지는 독자의 연습 문제로 남겨두겠습니다.)
데이터베이스를 확인하여 부모 메시지가 제대로 가져와졌는지, 그리고 import_id 토픽/게시글 커스텀 필드가 있는지 살펴볼 수 있습니다.
ruperty
(Ruperty)
2월 18, 2020, 12:54오후
9
어디서 검색하나요? topic_id가 제목(subject)을 의미하나요?
'데이터베이스’라고 하셨을 때 index.db를 의미하시나요? '가져오기(imported)'라고 하셨을 때 index.db의 이메일 테이블에 입력된 것을 의미하시나요? 네, 거기에는 있습니다. 하지만 'import_id’라는 이름의 컬럼은 없습니다.
pfaffman
(Jay Pfaffman)
2월 18, 2020, 1:40오후
10
여기서 데이터베이스라고 하면 discourse 데이터베이스를 의미합니다. import id는 topic_custom_field와 post_custom_field 테이블에 있습니다.
ruperty
(Ruperty)
2월 19, 2020, 8:55오후
11
아하!
데이터 탐색기 플러그인을 가져와서 Discourse 데이터베이스를 살펴봤습니다. 부모 메시지의 import_id가 topic_custom_field 테이블과 post_custom_field 테이블에 존재하는 것을 확인했습니다. 또한 해당 메시지도 실제로 존재했습니다.
하지만, 그 메시지는 삭제된 상태였습니다. 그래서 import가 index.db가 아니라 Discourse 데이터베이스를 조회하고 있었기 때문에 "부모 메시지가 존재하지 않습니다"라는 오류가 발생한 것으로 추측됩니다. 게시물이 삭제되었다는 내용의 오류 메시지가 나왔으면 좋았을 텐데 말입니다.
어쨌든, 초기 테스트 과정에서 가져온 첫 번째(작은) 배치의 게시물을 삭제한 적이 있었는데, 그 시점 이전으로 복원했다고 생각했지만 분명히 그렇지 않았던 것 같습니다.
다행히 이 문제는 제 테스트 서버에만 해당되며, 라이브 서버에서 가져오는 작업에서는 이 문제가 발생하지 않을 것입니다.
도움 주셔서 감사합니다.
pfaffman
(Jay Pfaffman)
2월 19, 2020, 8:58오후
12
ruperty:
하지만, 이미 삭제되어 있었습니다.
왜요? 누가 삭제했나요?
이것은 가져오기(import) 과정에서 발생하는 일이 아닙니다.
맞는 말씀입니다. 그리고 게시물을 삭제한다고 해서 실제로 삭제되는 것이 아니라, 삭제 처리로 표시 합니다.