gruut / tethys

This software cannot be used commercially without our permission. If you are interested in, contact nyang@thevaulters.com
GNU General Public License v2.0
2 stars 1 forks source link

# FIX - result query, rdb #205

Closed SeongKwangMoon closed 5 years ago

SeongKwangMoon commented 5 years ago

변경 사항

  1. 현재 처리중인 블럭에 head가 위치해있을 때 state tree에서 조회하여 ledger를 바로 검색하는 함수인 findXXXLedgerFromHead 함수가 현재 처리중인 블럭을 찾지 않는다는 사실을 발견하여, 해당 과정을 추가하였습니다. 이 문제는 result의 처리값들을 바로바로 state tree에 반영하지 않고, 해당 블럭의 모든 처리를 끝낸 후 한꺼번에 반영해서 생깁니다. 자세한 사항은 맨 아래에 따로 쓰겠습니다.

  2. 1의 과정에서 ledger_type의 is_empty의 기본 생성값을 true로 변경하여, ledger_list[pid] 에서 pid에 대응하는 ledger가 존재하지 않아도 빈 ledger를 생성합니다. 따라서 is_empty가 true로 생성되어 존재하지 않는다는 리턴을 줄 수 있게 하였습니다.

  3. ledger에서 동일 블럭에서 insert였던 ledger를 또다시 수정할 경우 update로 바꿔버리던 문제를 해결하였습니다. up_block을 조회하여 해당 ledger가 현 블럭에서 생성된 경우, insert를 유지하도록 합니다.

  4. getBlock이 블록 자체를 접근하는지 UnresolvedBlock을 접근하는지가 애매해서 정확하게 이름을 바꿨습니다.

  5. user ledger, contract ledger, user cert, user attribute, contract 테이블의 insert, update 문을 정확히 수정하였습니다. ledger에서 insert와 update가 혼재되는 경우가 있어서 ON DUPLICATE KEY UPDATE 문을 사용할까 했는데, 중복되는 unique key가 잘못 들어왔을 경우에도 오류를 내지 않고 수정해버리는 위험성이 존재할 것 같아서 querytype으로 sql문을 분기하였습니다. user attribute는 현재로서는 모든 사항이 다 주어져야 작동 하는 것으로 스펙이 명시되어있어서 위험성이 없다고 판단되어 ON DUPLICATE KEY UPDATE를 사용하고 있습니다. 여기 또한 문제가 된다면 추후 query type를 명시해서 분기할 예정입니다.

TODO : 수정하다보니 chain_plugin의 result query를 처리하는 processTxResult 함수에서 unresolved block을 수정한 후 pool에 반영하는 부분이 없는것으로 보여, 수정이 필요합니다.

즉시 갱신 일괄 갱신
과거 내용 없음 state tree 확인 현 블록 ledger 확인,
state tree 확인
이전 블록에 과거 내용 존재 state tree 확인 현 블록 ledger 확인,
state tree 확인
현재 블록에 과거 내용 존재 state tree 확인 현 블록 ledger 확인
갱신 횟수 쿼리의 수만큼 쿼리들 중 서로 다른 pid의 수만큼
ex) 쿼리 100개 중 unique pid 90개씩
3블럭
state tree 확인 * 300 현 블록 ledger 확인 300,
state tree 확인
270

어느 쪽이건 잘못된 구현은 아닙니다. 현재 구현은 일괄 갱신입니다.