Details
-
Bug
-
Status: Closed
-
Critical
-
Resolution: Auto Closed
-
0.9
-
None
-
None
Description
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)
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)
if (! len) break;
refill();
}
}