[
https://issues.apache.org/jira/browse/THRIFT-347?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12688977#action_12688977
]
Mark Slee commented on THRIFT-347:
----------------------------------
Hmm, seems okay. But how are these sockets getting into blocking mode?
Presumably this requires a call to stream_set_blocking(), which we never do in
TSocket.php.
I'm not sure if the rest of the code recovers properly in this case. When you
debug log on your system, do you actually get the socket call coming back with
the 'blocked' key set?
My concern is that with this change, fetchAll could potentially infinite loop,
continuously receiving empty string back. That probably won't happen, but it
does seem like it could use up more than the timeout, due to teh while(true).
I'm not sure how the PHP streams lib handles timeouts in blocking mode. As long
as you can verify it still handles timeouts appropriately, then consider this
diff approved.
But yeah, my main question is how you're getting client sockets in blocking
mode here?
> PHP TSocket Timeout Issues
> --------------------------
>
> Key: THRIFT-347
> URL: https://issues.apache.org/jira/browse/THRIFT-347
> Project: Thrift
> Issue Type: Bug
> Components: Library (PHP)
> Environment: Fedora 8, 64bit, php 5.2.4
> Reporter: Gary Richardson
> Attachments: TSocket.php.diff
>
>
> I'm working with the Hive thrift service and I get the following exception
> when I execute a SELECT statement:
> PHP Fatal error: Uncaught exception 'TException' with message 'TSocket:
> timed out reading 4 bytes from localhost:10000' in
> /root/leap/dev/servers/hive/thriftroot/
> transport/TSocket.php:228
> Stack trace:
> #0 /root/leap/dev/servers/hive/thriftroot/protocol/TBinaryProtocol.php(292):
> TSocket->readAll(4)
> #1 /root/leap/dev/servers/hive/thriftroot/protocol/TBinaryProtocol.php(184):
> TBinaryProtocol->readI32(NULL)
> #2
> /root/leap/dev/servers/hive/thriftroot/packages/hive_service/ThriftHive.php(59):
> TBinaryProtocol->readMessageBegin(NULL, 0, 0)
> #3
> /root/leap/dev/servers/hive/thriftroot/packages/hive_service/ThriftHive.php(28):
> ThriftHiveClient->recv_execute()
> #4 /root/leap/dev/servers/hive/testscript.php(30):
> ThriftHiveClient->execute('SELECT num FROM...')
> #5 {main}
> thrown in /root/leap/dev/servers/hive/thriftroot/transport/TSocket.php on
> line 228
> The script I'm using to cause this is:
> ======================================
> #!/usr/bin/php
> <?php
> $GLOBALS['THRIFT_ROOT'] = 'thriftroot/';
> require_once $GLOBALS['THRIFT_ROOT'] . 'packages/hive_service/ThriftHive.php';
> require_once $GLOBALS['THRIFT_ROOT'] . 'transport/TSocket.php';
> require_once $GLOBALS['THRIFT_ROOT'] . 'protocol/TBinaryProtocol.php';
> $transport = new TSocket('localhost', 10000);
> $protocol = new TBinaryProtocol($transport);
> $client = new ThriftHiveClient($protocol);
> $transport->open();
> try
> {
> $client->execute('DROP TABLE testOverThrift');
> }
> catch (Exception $e)
> {
> error_log("Got exception while trying to drop table: " .
> $e->getMessage());
> }
> $client->execute('CREATE TABLE testOverThrift (num int)');
> $client->execute('LOAD DATA LOCAL
> INPATH "/root/testdata.txt"
> INTO TABLE testOverThrift');
> $client->execute('SELECT num FROM testOverThrift WHERE num < 5');
> $result = $client->fetchAll();
> var_dump($result);
> ==================================
> I have a patch that fixes the problem that I'll attach. It looks like
> fetchAll() doesn't know the difference between a timeout and a blocking port.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.