Update SchemaQuery and the web UI to accommodate multiple master databases

Summary:
Depends on D16115. Ref T11044. In the brave new world of multiple masters, we need to check the schemata on each master when looking for missing storage patches, keys, schema changes, etc.

This realigns all the "check out what's up with that schema" calls to work for multiple hosts, and updates the web UI to include a "Server" column and allow you to browse per-server.

This doesn't update `bin/storage`, so it breaks things on its own (and unit tests probably won't pass). I'll update that in the next change.

Test Plan: Configured local environment in cluster mode with multiple masters, saw both hosts' status reported in web UI.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T11044

Differential Revision: https://secure.phabricator.com/D16847
This commit is contained in:
epriestley
2016-11-12 09:22:10 -08:00
parent ecc598f18d
commit bc15eee3f2
7 changed files with 339 additions and 187 deletions

View File

@@ -6,11 +6,11 @@ final class PhabricatorConfigDatabaseIssueController
public function handleRequest(AphrontRequest $request) {
$viewer = $request->getViewer();
$query = $this->buildSchemaQuery();
$query = new PhabricatorConfigSchemaQuery();
$actual = $query->loadActualSchema();
$expect = $query->loadExpectedSchema();
$comp = $query->buildComparisonSchema($expect, $actual);
$actual = $query->loadActualSchemata();
$expect = $query->loadExpectedSchemata();
$comp_servers = $query->buildComparisonSchemata($expect, $actual);
$crumbs = $this->buildApplicationCrumbs();
$crumbs->addTextCrumb(pht('Database Issues'));
@@ -18,65 +18,70 @@ final class PhabricatorConfigDatabaseIssueController
// Collect all open issues.
$issues = array();
foreach ($comp->getDatabases() as $database_name => $database) {
foreach ($database->getLocalIssues() as $issue) {
$issues[] = array(
$database_name,
null,
null,
null,
$issue,
);
}
foreach ($database->getTables() as $table_name => $table) {
foreach ($table->getLocalIssues() as $issue) {
foreach ($comp_servers as $ref_name => $comp) {
foreach ($comp->getDatabases() as $database_name => $database) {
foreach ($database->getLocalIssues() as $issue) {
$issues[] = array(
$ref_name,
$database_name,
$table_name,
null,
null,
null,
$issue,
);
}
foreach ($table->getColumns() as $column_name => $column) {
foreach ($column->getLocalIssues() as $issue) {
foreach ($database->getTables() as $table_name => $table) {
foreach ($table->getLocalIssues() as $issue) {
$issues[] = array(
$ref_name,
$database_name,
$table_name,
'column',
$column_name,
null,
null,
$issue,
);
}
}
foreach ($table->getKeys() as $key_name => $key) {
foreach ($key->getLocalIssues() as $issue) {
$issues[] = array(
$database_name,
$table_name,
'key',
$key_name,
$issue,
);
foreach ($table->getColumns() as $column_name => $column) {
foreach ($column->getLocalIssues() as $issue) {
$issues[] = array(
$ref_name,
$database_name,
$table_name,
'column',
$column_name,
$issue,
);
}
}
foreach ($table->getKeys() as $key_name => $key) {
foreach ($key->getLocalIssues() as $issue) {
$issues[] = array(
$ref_name,
$database_name,
$table_name,
'key',
$key_name,
$issue,
);
}
}
}
}
}
// Sort all open issues so that the most severe issues appear first.
$order = array();
$counts = array();
foreach ($issues as $key => $issue) {
$const = $issue[4];
$const = $issue[5];
$status = PhabricatorConfigStorageSchema::getIssueStatus($const);
$severity = PhabricatorConfigStorageSchema::getStatusSeverity($status);
$order[$key] = sprintf(
'~%d~%s%s%s',
9 - $severity,
$issue[0],
$issue[1],
$issue[3]);
$issue[2],
$issue[4]);
if (empty($counts[$status])) {
$counts[$status] = 0;
@@ -91,22 +96,25 @@ final class PhabricatorConfigDatabaseIssueController
// Render the issues.
$rows = array();
foreach ($issues as $issue) {
$const = $issue[4];
$const = $issue[5];
$uri = $this->getApplicationURI('/database/'.$issue[0].'/'.$issue[1].'/');
$database_link = phutil_tag(
'a',
array(
'href' => $this->getApplicationURI('/database/'.$issue[0].'/'),
'href' => $uri,
),
$issue[0]);
$issue[1]);
$rows[] = array(
$this->renderIcon(
PhabricatorConfigStorageSchema::getIssueStatus($const)),
$issue[0],
$database_link,
$issue[1],
$issue[2],
$issue[3],
$issue[4],
PhabricatorConfigStorageSchema::getIssueDescription($const),
);
}
@@ -117,6 +125,7 @@ final class PhabricatorConfigDatabaseIssueController
->setHeaders(
array(
null,
pht('Server'),
pht('Database'),
pht('Table'),
pht('Type'),
@@ -130,6 +139,7 @@ final class PhabricatorConfigDatabaseIssueController
null,
null,
null,
null,
'wide',
));