문제상황
- 발표자가 강의실을 나가면, 음성 녹음을 멈추기 위해, socket disconnect이벤트에 녹음 종료 함수를 추가해주었음.
- 기존까지는
SIGINT
로 인해, 남은 인코딩 데이터를 다 처리하고 process가 종료되었지만 함수를 추가하니, 프로세스가 바로 종료되어, 음성 후반부가 잘리게됨.
원인 분석
- 방이 터지며 router가 사라져서 이동하던 패킷들이 사라지나??
- 방에 2명이 존재할 경우, process가 바로 종료되지 않아 나쁘지 않은 추측이였음.
- 하지만 socket disconnect 이벤트에 추가하기 전, 방이 터지며 router가 삭제되는 것은 동일.
- 따라서 router가 없어지는 것은 원인이 아니였음.
- 메모리 누수를 막기위해 recordService에서 할당을 해제하면서 프로세스가 끝나는것인가?
- 체크해본 결과 전혀 상관없었음
- 기록하며 다시 생각해보니 정말 말도안되는 생각
- kill signal의 문제
- 다른곳에서 문제가 없었으니 kill signal의 문제만 남았음.
- 방이 터지며 모든 transport.close 이벤트 발동 ⇒ 등록한 이벤트리스너에서 kill signal 전송, socketdisconect에서도 kill signal 전송 ⇒
kill signal
이 여러번 전송되고 있음.
- 정보를 찾아보니 kill signal이 여러번 전송되면 아무리
SIGINT
라도 프로세스가 하던 작업을 마무리하지 못하고 종료된다고함
해결
recordConsumer.on('producerclose', () => {
this.stopRecord();
});
recordConsumer.on('transportclose', () => {
this.stopRecord();
});
stopRecord() {
if (this.ffmpegProcess) {
this.ffmpegProcess.kill('SIGINT');
}
this.recordConsumer.close();
this.plainTransport.close();
}
//producerClose, transportClose 이벤트 삭제
stopRecord() {
if (this.ffmpegProcess) {
this.ffmpegProcess.kill('SIGINT');
}
this.recordConsumer.close();
this.plainTransport.close();
}
- 여러곳에서 실행시키던
stopRecord
함수를, RecordService
에서 호출하게 만들어 한곳에서만 종료 로직 실행