Skip to content

Commit

Permalink
Try to fix PHP/hhvm tests by working around an issue with SET NAMES (T…
Browse files Browse the repository at this point in the history
…echEmpower#3220)

I think we are running into this problem:

  facebook/hhvm#8111

We don't solve that problem, but we avoid it by specifying utf8 in a
different fashion.  I also took the opportunity to use the "TFB-database"
hostname instead of the DBHOST environment variable because it's simpler
that way.

Here are the steps I took in a local TFB environment that make me think
we're running into the same issue as that GitHub issue:

 - Run toolset/run-tests.py --mode verify --test hvm, see that it fails
   all tests with error messages that look like the application server
   simply isn't there
 - Enable logging in PHP/hhvm/deploy/config.hdf (basically copy the
   "Log" section over from config-debug.hdf), run the test again
 - Look at the log file it spit out, PHP/hhvm/error.log, notice messages
   like this:

    Core dumped: Segmentation fault
    Stack trace in /tmp/stacktrace.28653.log

 - /tmp is cleared by the TFB toolset each run, so I comment out that
   part of benchmarker.py that clears /tmp
 - Run the test again, look at the stacktrace file in /tmp, notice a
   stack trace referring to our implementation code like this:

    #0  PDO->__construct() called at [/home/techempower/FrameworkBenchmarks/frameworks/PHP/hhvm/once.php.inc:14]
    #1  Benchmark->setup_db() called at [/home/techempower/FrameworkBenchmarks/frameworks/PHP/hhvm/once.php.inc:31]
    #2  Benchmark->bench_db() called at [/home/techempower/FrameworkBenchmarks/frameworks/PHP/hhvm/db.php:10]
    #3  main() called at [/home/techempower/FrameworkBenchmarks/frameworks/PHP/hhvm/db.php:13]

 - Google a bit, come across a GitHub issue talking about a similar
   problem when they used "SET NAMES"
 - Comment the part of PHP/hhvm/once.php.inc that uses SET NAMES, run
   test again and it worked, except for fortunes which failed because of
   character encoding problems
 - Google for a different way to specify utf8 in the PDO constructor,
   try it again, all tests pass locally
  • Loading branch information
michaelhixson authored and zloster committed Feb 7, 2018
1 parent a5c03fe commit 8df1643
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 9 deletions.
14 changes: 6 additions & 8 deletions frameworks/PHP/hhvm/once.php.inc
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,13 @@
class Benchmark {
var $pdo;

public function setup_db($need_utf8 = true)
public function setup_db()
{
$attrs = array(PDO::ATTR_PERSISTENT => false);
// hhvm doesn't support charset=utf8 in the DSN yet
// See https://github.com/facebook/hhvm/issues/1309
if ($need_utf8) {
$attrs[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES utf8";
}
$this->pdo = new PDO('mysql:host=localhost;dbname=hello_world', 'benchmarkdbuser', 'benchmarkdbpass', $attrs);
$this->pdo = new PDO(
'mysql:host=TFB-database;dbname=hello_world;charset=utf8',
'benchmarkdbuser',
'benchmarkdbpass',
array(PDO::ATTR_PERSISTENT => false));
}

public function bench_json()
Expand Down
1 change: 0 additions & 1 deletion frameworks/PHP/hhvm/setup_hhvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

fw_depends mysql nginx php7 hhvm

sed -i 's|host=localhost;|host='"${DBHOST}"';|g' once.php.inc
sed -i 's|SourceRoot = .*/FrameworkBenchmarks/hhvm|SourceRoot = '"${TROOT}"'|g' deploy/config.hdf
sed -i 's|Path = .*/.hhvm.hhbc|Path = '"${TROOT}"'/.hhvm.bbhc|g' deploy/config.hdf
sed -i 's|PidFile = .*/hhvm.pid|PidFile = '"${TROOT}"'/hhvm.pid|g' deploy/config.hdf
Expand Down

0 comments on commit 8df1643

Please sign in to comment.