Skip to content

Commit

Permalink
DaemonDb: trigger restart on schema change
Browse files Browse the repository at this point in the history
fixes #1964
  • Loading branch information
Thomas-Gelf committed Sep 30, 2019
1 parent 4ba2c21 commit 7a95f43
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 1 deletion.
8 changes: 8 additions & 0 deletions library/Director/Daemon/BackgroundDaemon.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,14 @@ protected function initializeDb(
// TODO: level is sent but not used
$processState->setComponentState('db', $state);
});
$db->on('schemaChange', function ($startupSchema, $dbSchema) {
Logger::info(sprintf(
"DB schema version changed. Started with %d, DB has %d. Restarting.",
$startupSchema,
$dbSchema
));
$this->reload();
});

$db->setConfigWatch(
$dbResourceName
Expand Down
49 changes: 48 additions & 1 deletion library/Director/Daemon/DaemonDb.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,15 @@ class DaemonDb
/** @var Deferred|null */
protected $pendingDisconnect;

/** @var \React\EventLoop\TimerInterface */
protected $refreshTimer;

/** @var \React\EventLoop\TimerInterface */
protected $schemaCheckTimer;

/** @var int */
protected $startupSchemaVersion;

public function __construct(DaemonProcessDetails $details, $dbConfig = null)
{
$this->details = $details;
Expand Down Expand Up @@ -84,6 +91,9 @@ public function run(LoopInterface $loop)
$this->refreshTimer = $loop->addPeriodicTimer(3, function () {
$this->refreshMyState();
});
$this->schemaCheckTimer = $loop->addPeriodicTimer(15, function () {
$this->checkDbSchema();
});
if ($this->configWatch) {
$this->configWatch->run($this->loop);
}
Expand Down Expand Up @@ -148,7 +158,8 @@ protected function reallyEstablishConnection($config)
if ($this->hasAnyOtherActiveInstance($connection)) {
throw new RuntimeException('DB is locked by a running daemon instance');
}
$this->details->set('schema_version', $migrations->getLastMigrationNumber());
$this->startupSchemaVersion = $migrations->getLastMigrationNumber();
$this->details->set('schema_version', $this->startupSchemaVersion);

$this->connection = $connection;
$this->db = $connection->getDbAdapter();
Expand All @@ -159,6 +170,42 @@ protected function reallyEstablishConnection($config)
return $connection;
}

protected function checkDbSchema()
{
if ($this->connection === null) {
return;
}

if ($this->schemaIsOutdated()) {
$this->emit('schemaChange', [
$this->getStartupSchemaVersion(),
$this->getDbSchemaVersion()
]);
}
}

protected function schemaIsOutdated()
{
return $this->getStartupSchemaVersion() < $this->getDbSchemaVersion();
}

protected function getStartupSchemaVersion()
{
return $this->startupSchemaVersion;
}

protected function getDbSchemaVersion()
{
if ($this->connection === null) {
throw new RuntimeException(
'Cannot determine DB schema version without an established DB connection'
);
}
$migrations = new Migrations($this->connection);

return $migrations->getLastMigrationNumber();
}

protected function onConnected()
{
$this->emitStatus('connected');
Expand Down

0 comments on commit 7a95f43

Please sign in to comment.