Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

Develment's Develog✔

golang sheerun/queue 라이브러리 PR 본문

언어/GoLang

golang sheerun/queue 라이브러리 PR

Develment 2020. 11. 5. 19:42

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을 더 자주날려서 오픈소스 생태계에 기여하는 사람이 됐으면 좋겠습니다👏

Comments