paust-team / paust-db

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

Cannot read metadata #91

Closed kwjooo closed 5 years ago

kwjooo commented 5 years ago

docker 패키징을 하며 실험한 결과 client에서 write를 실행하였을 때 tx는 정상적으로 전달이 되고 write도 성공적으로 동작하였으나 metadata between query시 response가 null입니다.

dragon0170 commented 5 years ago

go test에서는 read metadata에 대한 에러가 잡히지 않고 CLI를 통해 로컬에서 직접 테스트를 해보니 response가 null로 아무런 데이터가 없었습니다.

해당 버그의 원인은 go test에서와 CLI 커맨드 내에서 ReadMetaData 함수를 호출할 때 argument중 ownerKey와 qualifier의 값이 달랐기 때문입니다.

func ReadMetaData(start uint64, end uint64, ownerKey []byte, qualifier []byte)

현재 MasterApplication에서는 MetaDataQueryObj의 ownerKey, qualifier 설정 여부를 확인할 때 해당 field의 데이터가 nil인지 아닌지 확인하는 방식으로 구분을 합니다. 그래서 CLI를 통해 ownerKey, qualifier를 명시하지 않은 채 metadata query를 하면 서버에서는 ownerKey와 qualifier가 empty byte slice인 데이터를 찾게되지만 그런 데이터는 존재하지 않으므로 null response가 return되게 됩니다.


@elon0823 @code-to-gold @co1god 따라서 ownerKey, qualifier가 특정되지 않은 metadata query의 경우 argument를 nil로 전해줄 지, empty byte slice로 전해줄 지 결정하고 해당 변경사항을 적용해야할 것 같습니다.

관련된 자료를 찾아보던 중 go code review에 "보통은 nil slice를 지향하지만 JSON object encoding과 같은 특수한 케이스는 empty slice를 지향한다."와 같은 내용이 있었습니다.(https://github.com/golang/go/wiki/CodeReviewComments#declaring-empty-slices) 이 내용을 참고하면 nil slice보다는 empty byte slice로 통일하는 것이 더 좋은 것 같네요.

1dennispark commented 5 years ago

@dragon0170 empty byte slice가 더 좋습니다. JSON parsing 라이브러리들 중에서 nil을 처리하지 못하는 경우가 많이 있습니다.

또한, JSON specification에서도 null은 가급적 지양하며 JSON patch 일때만 null을 쓰는것을 권고하고 있습니다.

그리고 추후에는 byte array로 전달시 Base64 encoding 문자열을 전하는 것이 낳을 수 있습니다. 이는 JSON은 byte array를 따로 처리하는 방법에 대해서 나와있지 않아서 대부분의 라이브러리가 사용하고 있는 방법입니다.

dragon0170 commented 5 years ago

그럼 empty byte slice로 통일해서 처리하도록 client와 server를 변경해야겠군요. @kwjooo

go의 json 패키지도 marshal할 때 byte array의 경우 base64 encoding 문자열로 바꾸어서 전달하더라구요.

kwjooo commented 5 years ago

server에서 check tx시 byte array가 nil일 경우 error를 return하는 로직을 추가하고 nil을 기준으로 case를 구분하고 분기를 타는 것이 아닌 empty byte slice를 기준으로 분기를 타는 것으로 수정할게요

kwjooo commented 5 years ago

@dragon0170 목요일에 hotfix브랜치 하나 따서 작업하쥬