Golang - "short write" 오류 원인
아직 초기라 그런 것인지, 원래 Go 언어 영역의 개발자라면 다 아는 것인지 모르겠지만 ^^; TCP Socket 연결로부터 구성한 bufio.Writer를 통해,
dialer := net.Dialer{Timeout: 5 * time.Second}
conn, err := dialer.Dial("tcp", "127.0.0.1:18000")
my.reader = bufio.NewReader(conn)
my.writer = bufio.NewWriter(conn)
소켓으로 데이터 쓰기를 했는데 불특정한 순간에 오류가 발생합니다.
func (my *MySocket) Write(packet []byte) {
_, err := my.writer.Write(packet)
if err != nil {
panic(fmt.Errorf("failed to send data to data server: %w", err))
}
}
재미있는 건, 저렇게 해서 출력되는 "err"의 "%w" 포맷 메시지가 단순히 "short write" 두 단어라는 점입니다. ^^; 다행히도, 검색해 보면 답이 나오는데요,
How to solve "short write" error when writing to CSV
; https://stackoverflow.com/questions/66174520/how-to-solve-short-write-error-when-writing-to-csv
그렇습니다, 동기화를 해줘야 하는 것입니다. ^^
// writeLock = new(sync.Mutex)
func (my *MySocket) Write(packet []byte) {
writeLock.Lock()
defer writeLock.Unlock()
_, err := my.writer.Write(packet)
if err != nil {
panic(fmt.Errorf("failed to send data to data server: %w", err))
}
}
기존의 프로그래밍 언어와는 달리 Go 언어의 경우 go routine을 통한 다중 스레드가 보편화되어 있어 thread-safe한 처리가 더 중요하게 되었으니, 사용하려는 개체들에 대한 꼼꼼한 접근 관리를 할 필요가 있습니다.
이런 의미에서 'short write' 단어를 다시 보면 이때의 short가 단락, 합선을 의미하는 뜻인 듯합니다. 동기화 대기를 해야 하는 상황에서 그냥 치고 들어와서 문제가 발생했다는... 뭐 그런 식의... 메시지로 보입니다. ^^
참고로, 위의 bufio.Write의 버퍼링이 워낙 잘 되어 있어서 위와 같이 코드를 작성한 경우 마지막 Write 데이터가 전달되지 않을 수 있습니다. 즉, Write 후 곧바로 전송하고 싶다면 반드시 Flush를 호출해야 합니다.
// writeLock = new(sync.Mutex)
func (my *MySocket) Write(packet []byte) {
writeLock.Lock()
defer writeLock.Unlock()
_, err := my.writer.Write(packet)
if err != nil {
panic(fmt.Errorf("failed to send data to data server: %w", err))
}
my.writer.Flush()
}
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]