You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "James E. King III (JIRA)" <ji...@apache.org> on 2018/12/18 16:46:00 UTC

[jira] [Commented] (THRIFT-1950) PHP gets stuck in infinite loop

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

James E. King III commented on THRIFT-1950:
-------------------------------------------

Still a problem?

> 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 was sent by Atlassian JIRA
(v7.6.3#76005)