paust-team / paust-db

GNU General Public License v3.0
6 stars 5 forks source link

query time range bug #117

Closed dragon0170 closed 5 years ago

dragon0170 commented 5 years ago

paust-db-client status 커맨드 추가를 위해 테스트 하던 도중 발견한 버그입니다. 현재 master 기준으로 재연 가능합니다.(https://github.com/paust-team/paust-db/tree/b8d72423b63f3f0f677b372de4b7abb4e620de54)

$ ./paust-db-client query 1 2 query success. [{"id":"eyJ0aW1lc3RhbXAiOjE1NDQ3NzI4ODI0MzUzNzUwMDAsInNhbHQiOjE4fQ==","timestamp":1544772882435375000,"ownerKey":"NwdTf+S9+H5lsB6Us+s5Y1ChdB1aKECA6gsyGCa8SCM=","qualifier":"Y3B1"},{"id":"eyJ0aW1lc3RhbXAiOjE1NDQ3NzI5NjAwNDkxNzcwMDAsInNhbHQiOjI0NX0=","timestamp":1544772960049177000,"ownerKey":"mnhKcUWnR1iYTm6o4SJ/X0FV67QFIytpLB03EmWM1CY=","qualifier":"bWVt"},{"id":"eyJ0aW1lc3RhbXAiOjE1NDQ3NzI5NjczMzE0NTgwMDAsInNhbHQiOjc0fQ==","timestamp":1544772967331458000,"ownerKey":"aFw+o2z13LFCXzk7HptFoOY54s7VGDeQQVo32REPFCU=","qualifier":"c3BlZWQ="}]

kwjooo commented 5 years ago

버그의 원인은 KeyObj가 rowKey로 marshal 될 때 uint64자료형인 timestamp가 bigendian이 아닌 단순 byteArray로 사용되었기 때문입니다. 이로 인해 rocksdb 상에 저장될 때 부터 데이터가 시간 순으로 sort가 되어 있지 않게 되었습니다. 또한 query시 server가 사용하던 rocksdb의 key도 bigendian이 아닌 단순 byte array였기 때문에 2를 input으로 사용할 경우 모든 데이터를 가져왔던 것입니다. 이를 해결하기 위해 client에서 KeyObj와 queryObj를 만들 때 int인 자료형 모두를 bigendian byte array로 바꾸어 server에 전달하기로 하였습니다.

elon0823 commented 5 years ago

byte array 를 비교할시에 1544772882435375000 보다 2 가 큰것으로 결과가 나오게됩니다. 이에 공통 types에 Timestamp 관련 자료형을 byte array 로 변경하고 클라이언트는 cli 에서 uint64 형태로 받은 timestamp 형태를 bigendian byte array로 변경하여 서버에 넘겨주도록 변경하기로했습니다.