socket을 통해 데이터를 받아 WriteStream을 이용해 특정 파일에 write하고,
보존연한이 지난 파일은 unlink로 삭제하는 서버 구동 중,

파일은 삭제되었는데 디스크 용량은 반환되지 않는 문제 발생.



삭제된 파일이 ls로는 보이지 않지만,
lsof 로 확인시 아래와 같이 (deleted) 상태로 해당 서버가 fd를 물고 있는 상황.

dump 10774 10781 root 32w REG 8,49 129186206042 63438865 /dump/20210630.tar.gz (deleted)
dump 10774 10781 root 33w REG 8,49 129533227257 63438866 /dump/20210701.tar.gz (deleted)
dump 10774 10781 root 35w REG 8,49 130101169666 63438869 /dump/20210703.tar.gz (deleted)

 

 

socket 연결이 끊어지면 WriteStream이 닫히면서 자동으로 fd로 close된다고 생각하고 명시적으로 닫는 코드를 넣어주지 않았던게 문제였는 듯.
socket.on('end') 이벤트 핸들러에서 명시적으로 WriteStream을 닫아주는 코드를 넣어 해결.

sock.on('end', async()=>{
    wStream.end();
    await require('events').once(wStream, 'finish');
});

 

 

 

 

 

Posted by bloodguy
,