queries++; $result = $this->mysqli->query($sql); if ($this->snapshotOverride !== null && str_contains($sql, 'FROM `ts_value_general_json`')) { $rows = $result instanceof mysqli_result ? $result->fetch_all(MYSQLI_ASSOC) : []; foreach ($rows as &$row) { if (array_key_exists('value', $row)) { $row['value'] = $this->snapshotOverride; } } return new BenchRows($rows); } return $result; } public function sql_fetch_array(mysqli_result|bool|BenchRows $result, int $mode): array|false|null { if ($result instanceof BenchRows) { return $result->rows[$result->position++] ?? false; } return $result instanceof mysqli_result ? $result->fetch_array($mode) : false; } public function sql_real_escape_string(string $value): string { return $this->mysqli->real_escape_string($value); } public function sql_insert_id(): int { return $this->mysqli->insert_id; } public function sql_affected_rows(): int { return $this->mysqli->affected_rows; } } $mysqli = new mysqli('localhost', 'root', '', 'pmc_release_bench_20260928', 3306, '/run/mysqld/mysqld.sock'); $mysqli->set_charset('utf8mb4'); $db = new BenchDb($mysqli); $db->snapshotOverride = '[]'; $base = strtotime('2026-08-20 21:02:52'); $samplesPerTrial = 50; $trialCount = 5; $allDates = []; for ($i = 0; $i < $samplesPerTrial * $trialCount + 1; $i++) { $allDates[] = date('Y-m-d H:i:s', $base + $i * 30); } $insert = $mysqli->prepare('INSERT IGNORE INTO ts_value_general_json (`date`,id_ts_variable,id_mysql_server,`value`) VALUES (?,3760,327,\'[]\')'); foreach ($allDates as $date) { $insert->bind_param('s', $date); $insert->execute(); } $insert->close(); $window = static fn (string $date): array => [ 'ts_file' => 'mysql_processlist', 'id_mysql_server' => 327, 'id_ts_file' => 3759, 'min_date' => $date, 'max_date' => $date, ]; $reset = static function () use ($mysqli): void { foreach (['alerting_metadata_lock_schedule','pmc_alert_observation','pmc_alert_level_point','pmc_alert_level_interval','pmc_event_alert'] as $table) { $mysqli->query("DELETE FROM `$table`"); } }; $summarize = static function (array $values): array { sort($values, SORT_NUMERIC); $count = count($values); return [ 'mean_ms' => array_sum($values)/$count, 'median_ms' => ($values[intdiv($count-1,2)]+$values[intdiv($count,2)])/2, 'p95_ms' => $values[(int)floor(($count-1)*.95)], 'max_ms' => $values[$count-1], ]; }; $results = []; try { foreach (['due_healthy', 'skipped_healthy'] as $case) { $results[$case] = []; for ($trial = 0; $trial < $trialCount; $trial++) { $reset(); if ($case === 'skipped_healthy') { App\Plugin\Alerting\AlertFeed::process($window($allDates[0]), $db); } $durations = $queries = []; for ($i = 0; $i < $samplesPerTrial; $i++) { $date = $case === 'due_healthy' ? $allDates[$trial*$samplesPerTrial+$i] : $allDates[0]; $queryBefore = $db->queries; $start = hrtime(true); $result = App\Plugin\Alerting\AlertFeed::process($window($date), $db); $durations[] = (hrtime(true)-$start)/1e6; $queries[] = $db->queries-$queryBefore; if (($result['processed'] ?? 0) !== ($case === 'due_healthy' ? 1 : 0)) { // Newer releases can report a threshold evaluation on a skipped metadata-lock callback. if ($case === 'due_healthy') { throw new RuntimeException('Due callback was not processed'); } } } $results[$case][] = $summarize($durations) + [ 'queries_min' => min($queries), 'queries_max' => max($queries), 'last_result' => $result, ]; } } echo json_encode([ 'revision' => $argv[3] ?? null, 'php' => PHP_VERSION, 'mariadb' => $mysqli->server_info, 'database' => 'pmc_release_bench_20260928', 'samples_per_trial' => $samplesPerTrial, 'trials' => $trialCount, 'cases' => $results, ], JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR), "\n"; } finally { $mysqli->close(); }