Develment's Develog✔
golang sheerun/queue 라이브러리 PR 본문
Golang으로 프로젝트를 진행 중 두 개의 Goroutine에서 Producer / Consumer 패턴을 구현하기로 했습니다.
그래서 자료구조인 queue를 사용해야해서 github 오픈소스를 알아보던 중
sheerun/queue
Lightweight, thread-safe, blocking FIFO queue based on auto-resizing circular buffer - sheerun/queue
github.com
Golang용 thread-safe queue를 발견했습니다.
이 프로젝트는 일반 큐와 다르게 멀티쓰레딩 환경에서 사용할 수 있도록 변수들을 mutex로 잠궈서 쓰레드 간 안전하게 데이터 큐를 공유하는 프로젝트였습니다.
이 상태가 된다면 Producer / Consumer 패턴을 손쉽게 구현할 수 있어 바로 차용했습니다.
하지만 프로젝트를 진행하면서 오류가 발생했는데
package main
import (
"github.com/sheerun/queue"
)
func main() {
q := queue.New()
for i := 0; i < 50; i++ {
q.Append(i)
}
q.Clean()
for i := 0; i < 50; i++ {
q.Append(i) // Out of Range!
}
}
Queue에 데이터를 넣고 Clean으로 모든 데이터를 비우고 다시 Append를 비우면 Out of range 오류가 발생했습니다.
// Removes all elements from queue
func (q *Queue) Clean() {
q.mutex.Lock()
defer q.mutex.Unlock()
q.items = make(map[int64]interface{})
q.ids = make(map[interface{}]int64)
q.buf = make([]int64, minQueueLen)
}
원본 코드에서 Clean 부분을 확인하니 q.tail부분이 제대로 초기화가 되지않아 발생하는 문제였습니다😂
// Removes all elements from queue
func (q *Queue) Clean() {
q.mutex.Lock()
defer q.mutex.Unlock()
q.items = make(map[int64]interface{})
q.ids = make(map[interface{}]int64)
q.buf = make([]int64, minQueueLen)
q.tail = 0
q.head = 0
q.count = 0
}
원본 소스를 위처럼 초기화 구문을 추가하여 오류를 해결하였습니다.
해당 사항을 Pull Request를 보냈습니다 😎
유닛 테스트 파일에 오류 예제를 넣어달라는 말을 잘못이해하여 조금 다른 길로 새다가
Merge 됐습니다 👌
규모가 있는 라이브러리는 아니지만 프로젝트를 진행 중 불편함이 생겨 해당 사항을 해결 후 바로 PR을 해보았습니다. 그래도 제가 처음으로 오픈소스 프로젝트에 기여한 일이기에 엄청난 뿌듯함을 얻었습니다. 앞으로도 PR을 더 자주날려서 오픈소스 생태계에 기여하는 사람이 됐으면 좋겠습니다👏