오픈소스 버그 개선하기

Chungeun Choi·2023년 10월 2일
1

오픈소스

목록 보기
1/7
post-thumbnail

OSSCA(오픈소스 컨트리뷰션 아카데미) 경험한 내용 중 ‘python-mysql-replication 라이브러리의 버그 개선’에 대한 내용을 적어보려고 합니다

버그 파악, 수정


Fix test code - 'isMariaDB'

MariaDB 지원하는 기능(event)을 개발 하던 도중 DBMS가 MariaDB인지 확인하는 함수가 필요하였습니다 해당 함수는 이미 구현되어져있었고 isMariaDB 이라는 이름 테스트 코드에서 사용 중 이었습니다

개발된 isMariaDB 를 사용하여 테스트 코드를 디버깅하는 도중 계속해서 해당 함수에서 Fasle가 return 되는 것을 확인하였습니다(MARIADB면 True를 리턴합니다) 그 이유를 확인해 보니 아래와 같이 fetchone 함수의 return 값의 타입이 tuple임에 따라 문자열(”MariaDB”)과 비교하지 못해서 생기는 오류였습니다.

fetchone 함수의 첫번째 요소를 가져와 비교하게끔 로직을 변경하여 해당 문제를 개선하였습니다

Incorrect Parsing of Extra Data(NDB info) in Rows Event

해당 버그에 대해 설명하기에 앞서 ‘Extra DATA’에 대해 설명하고자 합니다 Extra Data는 rows event가 발생할 때 같이 전달되는 데이터입니다 해당 데이터는 table의 partition정보와 ndb cluster에 대한 정보를 담고 있는 데이터입니다

해당 버그는 extra data 테스트를 진행하던 도중 발견하였는데요. 문제의 원인을 찾기 위해 MYSQL 소스코드에서 extra_row_ndb_info 관련 내용을 확인하여 파악할 수 있었습니다.

원인은 ndb cluster에 대한 정보를 파싱 할 때 읽을 바이트의 개수를 잘 못 지정하여 생기는 문제였습니다.

ndb_info_length(Len of ndb_info)와 ndb_info_format(Format)을 각각 1바이트씩 읽어야 했지만 라이브러리 내의 로직에서는 1바이트로 읽고 있었습니다

해당 바이트의 읽는 크기를 조절해 줌으로써 해결하였습니다.

  • extra_row_ndb_info 필드 별 바이트 크기 (MYSQL source code)
    	
    	     	+----------+--------------------------------------+
                |type_code |        extra_row_ndb_info            |
                +--- ------+--------------------------------------+
                | NDB      |Len of ndb_info |Format |ndb_data     |
                | 1 byte   |1 byte          |1 byte |len - 2 byte |
                +----------+----------------+-------+-------------+
        
  • python-mysql-replication 라이브러리에서 파싱할 때

Fix GitHub Actions Failure by Updating Test Code

다른 기능을 개발하던 도중 지속적으로 Git Actions가 실패하는 문제가 있었습니다.

Git Actions의 로그를 확인해 보니 현재 개발된 event의 개수와 테스트코드의 개수가 맞지 않아 발생하는 오류였습니다.

저희 조원이 개발하고 있던 기능은 해당 테스트 코드와 연관이 있는 기능이 아니었음에도 에러가 발생해서 gitlog를 확인하던 도중 충돌을 처리하기 위해 메인테이너가 작업을 하던 도중 테스트 코드를 갱신하지 않아서 발생하는 문제였더군요. PR올린 뒤 메인테이너가 코멘트도 남겨주셨습니다.

후기


버그 개선하면서 느낀 후기 몇글자를 적어봅니다.

  1. 자세한 디버깅: 'isMariaDB' 함수의 문제점을 파악하면서 작은 코드 조차도 문제의 원인이 될 수 있음을 깨달았어요. 이를 통해 디버깅 과정에서 더욱 세세한 부분까지 주의 깊게 살펴보는 습관이 필요함을 알게되었습니다.
  2. 소스 코드의 중요성: 'Incorrect Parsing of Extra Data' 문제를 해결하기 위해 MYSQL 소스코드를 직접 확인하는 과정에서, 공식 문서만으로는 이해하기 어려운 부분들을 소스코드를 통해 파악할 수 있었습니다. 이를 통해 버그 해결의 중요한 힌트를 얻을 수 있었고, 이러한 경험을 통해 원본 소스 코드의 중요성을 다시 한번 느낄 수 있었습니다.
profile
소프트웨어 엔지니어 최충은입니다

0개의 댓글