DRILL-1566: C++ Client does not handle incoming record batches with zero records
Project: http://git-wip-us.apache.org/repos/asf/incubator-drill/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-drill/commit/fdbd6a9f Tree: http://git-wip-us.apache.org/repos/asf/incubator-drill/tree/fdbd6a9f Diff: http://git-wip-us.apache.org/repos/asf/incubator-drill/diff/fdbd6a9f Branch: refs/heads/master Commit: fdbd6a9fc8d846567a272025bd37002d43c7a3fa Parents: 2e07c62 Author: Parth Chandra <[email protected]> Authored: Tue Oct 21 14:30:50 2014 -0700 Committer: Jinfeng Ni <[email protected]> Committed: Fri Nov 7 10:50:55 2014 -0800 ---------------------------------------------------------------------- contrib/native/client/example/querySubmitter.cpp | 2 +- contrib/native/client/src/clientlib/drillClientImpl.cpp | 12 +++++++++--- contrib/native/client/src/clientlib/recordBatch.cpp | 5 ++++- contrib/native/client/src/include/drill/recordBatch.hpp | 6 ++++-- 4 files changed, 18 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fdbd6a9f/contrib/native/client/example/querySubmitter.cpp ---------------------------------------------------------------------- diff --git a/contrib/native/client/example/querySubmitter.cpp b/contrib/native/client/example/querySubmitter.cpp index 040f9d7..7b98bc9 100644 --- a/contrib/native/client/example/querySubmitter.cpp +++ b/contrib/native/client/example/querySubmitter.cpp @@ -71,7 +71,7 @@ Drill::status_t QueryResultsListener(void* ctx, Drill::RecordBatch* b, Drill::Dr if(bTestCancel){ return Drill::QRY_FAILURE; }else{ - return Drill::QRY_SUCCESS ; + return Drill::QRY_SUCCESS ; } }else{ assert(b==NULL); http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fdbd6a9f/contrib/native/client/src/clientlib/drillClientImpl.cpp ---------------------------------------------------------------------- diff --git a/contrib/native/client/src/clientlib/drillClientImpl.cpp b/contrib/native/client/src/clientlib/drillClientImpl.cpp index 2f27b48..cc70020 100644 --- a/contrib/native/client/src/clientlib/drillClientImpl.cpp +++ b/contrib/native/client/src/clientlib/drillClientImpl.cpp @@ -509,8 +509,10 @@ status_t DrillClientImpl::processQueryResult(AllocatedBufferPtr allocatedBuffer // Ignore these state messages since they means the query is not completed. // I have not observed those messages in testing though. break; + // m_pendingRequests should be decremented when the query is - // canncelled or completed + // canceled or completed + // in both cases, fall back to free mememory case exec::shared::QueryResult_QueryState_CANCELED: ret=handleTerminatedQryState(ret, getMessage(ERR_QRY_CANCELED), @@ -519,7 +521,6 @@ status_t DrillClientImpl::processQueryResult(AllocatedBufferPtr allocatedBuffer ret=handleTerminatedQryState(ret, getMessage(ERR_QRY_COMPLETED), pDrillClientQueryResult); - // in both case, fall back to free mememory delete allocatedBuffer; delete qr; break; @@ -534,6 +535,8 @@ status_t DrillClientImpl::processQueryResult(AllocatedBufferPtr allocatedBuffer break; } return ret; + }else{ + DRILL_LOG(LOG_WARNING) << "DrillClientImpl::processQueryResult: Query State was not set (assuming a query with no result set.\n"; } //Validate the RPC message @@ -562,7 +565,9 @@ status_t DrillClientImpl::processQueryResult(AllocatedBufferPtr allocatedBuffer << pRecordBatch->isLastChunk() << std::endl; ret=pDrillClientQueryResult->setupColumnDefs(qr); - if(ret==QRY_SUCCESS_WITH_INFO)pRecordBatch->schemaChanged(true); + if(ret==QRY_SUCCESS_WITH_INFO){ + pRecordBatch->schemaChanged(true); + } pDrillClientQueryResult->m_bIsQueryPending=true; pDrillClientQueryResult->m_bIsLastChunk=qr->is_last_chunk(); @@ -781,6 +786,7 @@ void DrillClientImpl::broadcastError(DrillClientError* pErr){ } return; } + // The implementation is similar to handleQryError status_t DrillClientImpl::handleTerminatedQryState( status_t status, http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fdbd6a9f/contrib/native/client/src/clientlib/recordBatch.cpp ---------------------------------------------------------------------- diff --git a/contrib/native/client/src/clientlib/recordBatch.cpp b/contrib/native/client/src/clientlib/recordBatch.cpp index dfa12fd..2a679fa 100644 --- a/contrib/native/client/src/clientlib/recordBatch.cpp +++ b/contrib/native/client/src/clientlib/recordBatch.cpp @@ -346,7 +346,10 @@ ret_t RecordBatch::build(){ size_t len=pFmd->getBufferLength(); FieldBatch* pField = new FieldBatch(*pFmd, this->m_buffer, startOffset, len) ; startOffset+=len; - pField->load(); // set up the value vectors + // We may get an empty record batch. All the fields will be empty, except for metadata. + if(len>0){ + pField->load(); // set up the value vectors + } this->m_fields.push_back(pField); this->m_fieldDefs->push_back(pFmd); } http://git-wip-us.apache.org/repos/asf/incubator-drill/blob/fdbd6a9f/contrib/native/client/src/include/drill/recordBatch.hpp ---------------------------------------------------------------------- diff --git a/contrib/native/client/src/include/drill/recordBatch.hpp b/contrib/native/client/src/include/drill/recordBatch.hpp index de65202..28377cb 100644 --- a/contrib/native/client/src/include/drill/recordBatch.hpp +++ b/contrib/native/client/src/include/drill/recordBatch.hpp @@ -804,8 +804,10 @@ class FieldBatch{ public: FieldBatch(const Drill::FieldMetadata& fmd, const ByteBuf_t data, size_t start, size_t length): m_fieldMetadata(fmd){ - m_pValueVector=NULL; - m_pFieldData=new SlicedByteBuf(data, start, length); + m_pValueVector=NULL;m_pFieldData=NULL; + if(length>0){ + m_pFieldData=new SlicedByteBuf(data, start, length); + } } ~FieldBatch(){
