[
https://issues.apache.org/jira/browse/THRIFT-1950?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13651266#comment-13651266
]
Travis Beauvais commented on THRIFT-1950:
-----------------------------------------
After further investigation, in the C binding, int he readBytes method,
buffer_used gets set to 0, so "size_t chunk_size = MIN(len, buffer_used);" sets
chunk_size to 0 since the minimum between len and buffer_used is 0 but len is
still 4.
> PHP gets stuck in infinite loop
> -------------------------------
>
> Key: THRIFT-1950
> URL: https://issues.apache.org/jira/browse/THRIFT-1950
> Project: Thrift
> Issue Type: Bug
> Components: PHP - Library
> Affects Versions: 0.9
> Reporter: Travis Beauvais
> Priority: Critical
>
> We have scripts that run continuously and make hundreds of calls to a service
> using the thrift PHP library. On the receiving side of the request, it
> occasionally gets stuck in an infinite loop which causes the processes to use
> up CPU and never die. This doesn't happen 100% of the time and the script
> will sometimes run for 10 minutes or more before this happens. We run 50
> instances of the script and I can watch in htop when each one gets stuck. It
> happens when using the C binding as well as the PHP library. It happens in
> TTransport.php line 68-77.
> public function readAll($len) {
> // return $this->read($len);
> $data = '';
> $got = 0;
> while (($got = TStringFuncFactory::create()->strlen($data)) < $len) {
> $data .= $this->read($len - $got);
> }
> return $data;
> }
> And in the C binding in php_thrift_protocol.cpp lines 317-330.
> void readBytes(void* buf, size_t len) {
> while (len) {
> size_t chunk_size = MIN(len, buffer_used);
> if (chunk_size) {
> memcpy(buf, buffer_ptr, chunk_size);
> buffer_ptr = reinterpret_cast<char*>(buffer_ptr) + chunk_size;
> buffer_used -= chunk_size;
> buf = reinterpret_cast<char*>(buf) + chunk_size;
> len -= chunk_size;
> }
> if (! len) break;
> refill();
> }
> }
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira