Uploaded image for project: 'Thrift'
  1. Thrift
  2. THRIFT-1950

PHP gets stuck in infinite loop

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical
    • Resolution: Auto Closed
    • Affects Version/s: 0.9
    • Fix Version/s: None
    • Component/s: PHP - Library
    • Labels:
      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)

      { $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();
      }
      }

        Attachments

          Activity

            People

            • Assignee:
              jking3 James E. King III
              Reporter:
              tbeauvais Travis Beauvais
            • Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: