mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-19 21:32:43 +01:00
Do not perform write in PhabricatorDaemonLogQuery by default
Summary: See <http://github.com/facebook/phabricator/issues/487>. By default, we perform a write in this query to moved daemons to "dead" status after a timeout. This is normally reasonable, but after D7964 we do a setup check against the daemons, which means this query is invoked very early in the stack, before we have a write guard. Since doing this write unconditionally is unnecessarily, surprising, and overly ambitious, make the write conditional and do not attempt to perform it from the setup check. (We could also move this to a GC/cron sort of thing eventually, maybe -- it's a bit awkward here, but we don't have other infrastructure which is a great fit right now.) Test Plan: Hit setup issues and daemon pages. Will confirm with user that this fixes things. Reviewers: btrahan Reviewed By: btrahan CC: aran Differential Revision: https://secure.phabricator.com/D8023
This commit is contained in:
parent
56bcb33a18
commit
136af8d2ab
5 changed files with 19 additions and 4 deletions
|
@ -73,6 +73,7 @@ final class PhabricatorDaemonConsoleController
|
|||
$logs = id(new PhabricatorDaemonLogQuery())
|
||||
->setViewer($user)
|
||||
->withStatus(PhabricatorDaemonLogQuery::STATUS_ALIVE)
|
||||
->setAllowStatusWrites(true)
|
||||
->execute();
|
||||
|
||||
$taskmasters = 0;
|
||||
|
|
|
@ -12,6 +12,7 @@ final class PhabricatorDaemonLogListController
|
|||
|
||||
$logs = id(new PhabricatorDaemonLogQuery())
|
||||
->setViewer($viewer)
|
||||
->setAllowStatusWrites(true)
|
||||
->executeWithCursorPager($pager);
|
||||
|
||||
$daemon_table = new PhabricatorDaemonLogListView();
|
||||
|
|
|
@ -16,6 +16,7 @@ final class PhabricatorDaemonLogViewController
|
|||
$log = id(new PhabricatorDaemonLogQuery())
|
||||
->setViewer($user)
|
||||
->withIDs(array($this->id))
|
||||
->setAllowStatusWrites(true)
|
||||
->executeOne();
|
||||
if (!$log) {
|
||||
return new Aphront404Response();
|
||||
|
|
|
@ -34,6 +34,7 @@ final class PhabricatorDaemonManagementLogWorkflow
|
|||
$daemon = id(new PhabricatorDaemonLogQuery())
|
||||
->setViewer($this->getViewer())
|
||||
->withIDs(array($id))
|
||||
->setAllowStatusWrites(true)
|
||||
->executeOne();
|
||||
|
||||
if (!$daemon) {
|
||||
|
|
|
@ -9,6 +9,7 @@ final class PhabricatorDaemonLogQuery
|
|||
private $ids;
|
||||
private $status = self::STATUS_ALL;
|
||||
private $daemonClasses;
|
||||
private $allowStatusWrites;
|
||||
|
||||
public static function getTimeUntilUnknown() {
|
||||
return 3 * PhutilDaemonOverseer::HEARTBEAT_WAIT;
|
||||
|
@ -33,6 +34,11 @@ final class PhabricatorDaemonLogQuery
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function setAllowStatusWrites($allow) {
|
||||
$this->allowStatusWrites = $allow;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function loadPage() {
|
||||
$table = new PhabricatorDaemonLog();
|
||||
$conn_r = $table->establishConnection('r');
|
||||
|
@ -80,11 +86,16 @@ final class PhabricatorDaemonLogQuery
|
|||
$status = $status_dead;
|
||||
}
|
||||
|
||||
// If we changed the daemon's status, update it.
|
||||
// If we changed the daemon's status, adjust it.
|
||||
if ($status != $daemon->getStatus()) {
|
||||
$guard = AphrontWriteGuard::beginScopedUnguardedWrites();
|
||||
$daemon->setStatus($status)->save();
|
||||
unset($guard);
|
||||
$daemon->setStatus($status);
|
||||
|
||||
// ...and write it, if we're in a context where that's reasonable.
|
||||
if ($this->allowStatusWrites) {
|
||||
$guard = AphrontWriteGuard::beginScopedUnguardedWrites();
|
||||
$daemon->save();
|
||||
unset($guard);
|
||||
}
|
||||
}
|
||||
|
||||
// If the daemon no longer matches the filter, get rid of it.
|
||||
|
|
Loading…
Reference in a new issue