You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@drill.apache.org by "Karthikeyan Manivannan (JIRA)" <ji...@apache.org> on 2017/04/27 00:10:04 UTC

[jira] [Commented] (DRILL-5448) ODBC client crashed when user does not have access to text formatted hive table

    [ https://issues.apache.org/jira/browse/DRILL-5448?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15985780#comment-15985780 ] 

Karthikeyan Manivannan commented on DRILL-5448:
-----------------------------------------------

Sorabh and I took an initial stab at this. The failure is because the error message buffer in Drill::ErrorMessages::getMessage can only handle 10240 characters. The error message, in this case, is about 32k. This seems to be causing the segfault. No idea why this only occurs if the drillbit is busy.

(lldb) process launch --stop-at-entry -- -program_arg querySubmitter  query='select * from hive.voter_text' logLevel=trace type=sql connectStr=local=10.10.102.81:31010 api=sync  saslPluginPath='/Users/karthik/lib' user=karthik password=maprmapr1234
...
...
lldb) br s -n 'Drill::DrillClientError::getErrorObject(exec::shared::DrillPBError const&)' 
Breakpoint 1: where = libdrillClient.dylib`Drill::DrillClientError::getErrorObject(exec::shared::DrillPBError const&) + 15 at drillClient.cpp:33, address = 0x000000010017021f
(lldb) r
There is a running process, kill it and restart?: [Y/n] Y
Process 28268 exited with status = 9 (0x00000009) 
Process 36577 launched: '/Users/karthik/git-sources/drill-fork/contrib/native/client/build/querySubmitter' (x86_64)
Unknown option:-program_arg. Ignoring
Unknown option:querySubmitter. Ignoring
Connected!

Process 36577 stopped
* thread #2: tid = 0x1c2a096, 0x000000010017021f libdrillClient.dylib`Drill::DrillClientError::getErrorObject(e=0x00000001008013d0) + 15 at drillClient.cpp:33, stop reason = breakpoint 1.1
    frame #0: 0x000000010017021f libdrillClient.dylib`Drill::DrillClientError::getErrorObject(e=0x00000001008013d0) + 15 at drillClient.cpp:33
   30  	namespace Drill{
   31  	
   32  	DrillClientError* DrillClientError::getErrorObject(const exec::shared::DrillPBError& e){
-> 33  	    std::string s=Drill::getMessage(ERR_QRY_FAILURE, e.message().c_str());
   34  	    DrillClientError* err=NULL;
   35  	    err=new DrillClientError(QRY_FAILURE, QRY_ERROR_START+QRY_FAILURE, s);
   36  	    return err;
(lldb) step
Process 36577 stopped
* thread #2: tid = 0x1c2a096, 0x000000010017047c libdrillClient.dylib`exec::shared::DrillPBError::message(this=0x00000001008013d0) const + 12 at UserBitShared.pb.h:3409, stop reason = step in
    frame #0: 0x000000010017047c libdrillClient.dylib`exec::shared::DrillPBError::message(this=0x00000001008013d0) const + 12 at UserBitShared.pb.h:3409
   3406	  clear_has_message();
   3407	}
   3408	inline const ::std::string& DrillPBError::message() const {
-> 3409	  return *message_;
   3410	}
   3411	inline void DrillPBError::set_message(const ::std::string& value) {
   3412	  set_has_message();
(lldb) p *message
warning: could not load any Objective-C class information. This will significantly reduce the quality of type information available.
error: reference to non-static member function must be called; did you mean to call it with no arguments?
error: indirection requires pointer operand ('const string' (aka 'const std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >') invalid)
(lldb) p *message_
(std::__1::string) $6 = "SYSTEM ERROR: AccessControlException: User karthik(user id 503)  does not have access to maprfs:///user/hive/warehouse/voter_text\n\n\n[Error Id: 7efda71b-f55b-45b4-a040-a59b0fd059a7 on qa102-81.qa.lab:31010]\n\n  (org.apache.drill.exec.work.foreman.ForemanException) Unexpected exception during fragment initialization: Internal error: Error while applying rule DrillPushProjIntoScan, args [rel#15120:LogicalProject.NONE.ANY([]).[](input=rel#15119:Subset#0.ENUMERABLE.ANY([]).[],voter_id=$0,name=$1,age=$2,registration=$3,contributions=$4,voterzone=$5,create_timestamp=$6,create_date=$7), rel#15110:EnumerableTableScan.ENUMERABLE.ANY([]).[](table=[hive, voter_text])]\n    org.apache.drill.exec.work.foreman.Foreman.run():298\n    java.util.concurrent.ThreadPoolExecutor.runWorker():1142\n    java.util.concurrent.ThreadPoolExecutor$Worker.run():617\n    java.lang.Thread.run():745\n  Caused By (java.lang.AssertionError) Internal error: Error while applying rule DrillPushProjIntoScan, args [rel#15120:LogicalProject.NONE.ANY([]).[]"...
(lldb) p message_.size()
(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::size_type) $7 = 32737
  Fix-it applied, fixed expression was: 
    message_->size()
(lldb) p message_->size()
(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::size_type) $8 = 32737
(lldb) step
Process 36577 stopped
* thread #2: tid = 0x1c2a096, 0x0000000100170228 libdrillClient.dylib`Drill::DrillClientError::getErrorObject(e=0x00000001008013d0) + 24 at drillClient.cpp:33, stop reason = step in
    frame #0: 0x0000000100170228 libdrillClient.dylib`Drill::DrillClientError::getErrorObject(e=0x00000001008013d0) + 24 at drillClient.cpp:33
   30  	namespace Drill{
   31  	
   32  	DrillClientError* DrillClientError::getErrorObject(const exec::shared::DrillPBError& e){
-> 33  	    std::string s=Drill::getMessage(ERR_QRY_FAILURE, e.message().c_str());
   34  	    DrillClientError* err=NULL;
   35  	    err=new DrillClientError(QRY_FAILURE, QRY_ERROR_START+QRY_FAILURE, s);
   36  	    return err;
(lldb) 
Process 36577 stopped
* thread #2: tid = 0x1c2a096, 0x00000001002ac073 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 339 at errmsgs.cpp:76, stop reason = step in
    frame #0: 0x00000001002ac073 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 339 at errmsgs.cpp:76
   73  	
   74  	std::string getMessage(uint32_t msgId, ...){
   75  	    char str[10240];
-> 76  	    std::string s;
   77  	    assert((ERR_NONE <= msgId) && (msgId < ERR_QRY_MAX));
   78  	    va_list args;
   79  	    va_start (args, msgId);
(lldb) n
Process 36577 stopped
* thread #2: tid = 0x1c2a096, 0x00000001002ac163 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 579 at errmsgs.cpp:77, stop reason = step over
    frame #0: 0x00000001002ac163 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 579 at errmsgs.cpp:77
   74  	std::string getMessage(uint32_t msgId, ...){
   75  	    char str[10240];
   76  	    std::string s;
-> 77  	    assert((ERR_NONE <= msgId) && (msgId < ERR_QRY_MAX));
   78  	    va_list args;
   79  	    va_start (args, msgId);
   80  	    vsprintf (str, errorMessages[msgId-DRILL_ERR_START].msgFormatStr, args);
(lldb) 
Process 36577 stopped
* thread #2: tid = 0x1c2a096, 0x00000001002ac1e1 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 705 at errmsgs.cpp:79, stop reason = step over
    frame #0: 0x00000001002ac1e1 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 705 at errmsgs.cpp:79
   76  	    std::string s;
   77  	    assert((ERR_NONE <= msgId) && (msgId < ERR_QRY_MAX));
   78  	    va_list args;
-> 79  	    va_start (args, msgId);
   80  	    vsprintf (str, errorMessages[msgId-DRILL_ERR_START].msgFormatStr, args);
   81  	    va_end (args);
   82  	    s=std::string("[")+boost::lexical_cast<std::string>(msgId)+std::string("]")+str;
(lldb) 
Process 36577 stopped
* thread #2: tid = 0x1c2a096, 0x00000001002ac207 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 743 at errmsgs.cpp:80, stop reason = step over
    frame #0: 0x00000001002ac207 libdrillClient.dylib`Drill::getMessage(msgId=30029) + 743 at errmsgs.cpp:80
   77  	    assert((ERR_NONE <= msgId) && (msgId < ERR_QRY_MAX));
   78  	    va_list args;
   79  	    va_start (args, msgId);
-> 80  	    vsprintf (str, errorMessages[msgId-DRILL_ERR_START].msgFormatStr, args);
   81  	    va_end (args);
   82  	    s=std::string("[")+boost::lexical_cast<std::string>(msgId)+std::string("]")+str;
   83  	    return s;
(lldb) p args
(va_list) $9 = {
  [0] = (gp_offset = 16, fp_offset = 48, overflow_arg_area = 0x000070000007fa60, reg_save_area = 0x000070000007cff0)
}
(lldb) p (int *)(((char *)args[0].reg_save_area)+args[0].gp_offset)
(int *) $10 = 0x000070000007d000
(lldb) p *(int *)(((char *)args[0].reg_save_area)+args[0].gp_offset)
(int) $11 = 33723904
(lldb) p "%s" *(int *)(((char *)args[0].reg_save_area)+args[0].gp_offset)
error: invalid operands to binary expression ('const char *' and 'int *')
(lldb) p "%s", (int *)(((char *)args[0].reg_save_area)+args[0].gp_offset)
(int *) $12 = 0x000070000007d000
(lldb) expr (int) printf("%s", (int *)(((char *)args[0].reg_save_area)+args[0].gp_offset));
(int) $13 = 0
(lldb) expr (int) printf("%s", "foo")
(int) $14 = 3
(lldb) expr (int) printf("%s", "food")
(int) $15 = 4
(lldb) expr (int) printf("%s", "")
(int) $16 = 0
(lldb) set a =5
error: 'settings append' takes more arguments
(lldb) set a=5
error: unknown command shorthand suffix: '=5'
ambiguous command 'set'. Possible completions:
	settings
(lldb) p "%s", (char *)(((char *)args[0].reg_save_area)+args[0].gp_offset)
(char *) $17 = 0x000070000007d000 <no value available>
(lldb) p  *(char *)(((char *)args[0].reg_save_area)+args[0].gp_offset)
(char) $18 = '\0'
(lldb) 


> ODBC client crashed when user does not have access to text formatted hive table
> -------------------------------------------------------------------------------
>
>                 Key: DRILL-5448
>                 URL: https://issues.apache.org/jira/browse/DRILL-5448
>             Project: Apache Drill
>          Issue Type: Bug
>          Components: Client - C++
>    Affects Versions: 1.10.0, 1.11.0
>            Reporter: Krystal
>
> While many connections are connecting to the drillbit, odbc client crashed with "Segmentation Fault" while executing a select from a hive table in text format that the user does not have access to.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)