From b352cae97de47e699f6c8810f940dec7a0609a68 Mon Sep 17 00:00:00 2001 From: epriestley Date: Mon, 30 May 2016 08:30:57 -0700 Subject: [PATCH] Don't stop on read-only mode for read-only storage workflows Summary: Fixes T11042. Currently, all `bin/storage` workflows stop if `cluster.read-only` is set: ``` $ ./bin/storage adjust Usage Exception: Phabricator is currently in read-only mode. Use --force to override this mode. ``` However, some of them (`status`, `dump`, `databases`, etc) are read-only anyway and safe to run. Don't prompt in these cases. Test Plan: - Set `cluster.read-only` to `true`. - Ran `bin/storage dump`, `bin/storage status`, etc. No longer received messages. Reviewers: chad Reviewed By: chad Maniphest Tasks: T11042 Differential Revision: https://secure.phabricator.com/D15987 --- ...atorStorageManagementDatabasesWorkflow.php | 4 ++++ ...abricatorStorageManagementDumpWorkflow.php | 4 ++++ ...bricatorStorageManagementProbeWorkflow.php | 4 ++++ ...orStorageManagementRenamespaceWorkflow.php | 4 ++++ ...bricatorStorageManagementShellWorkflow.php | 6 ++++-- ...ricatorStorageManagementStatusWorkflow.php | 4 ++++ .../PhabricatorStorageManagementWorkflow.php | 21 ++++++++++++------- 7 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDatabasesWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDatabasesWorkflow.php index b10e9b9e41..e29dd60e33 100644 --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDatabasesWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDatabasesWorkflow.php @@ -10,6 +10,10 @@ final class PhabricatorStorageManagementDatabasesWorkflow ->setSynopsis(pht('List Phabricator databases.')); } + protected function isReadOnlyWorkflow() { + return true; + } + public function didExecute(PhutilArgumentParser $args) { $api = $this->getAPI(); $patches = $this->getPatches(); diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php index 4933bd70bb..1aec53fd63 100644 --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementDumpWorkflow.php @@ -19,6 +19,10 @@ final class PhabricatorStorageManagementDumpWorkflow )); } + protected function isReadOnlyWorkflow() { + return true; + } + public function didExecute(PhutilArgumentParser $args) { $api = $this->getAPI(); $patches = $this->getPatches(); diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementProbeWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementProbeWorkflow.php index d65b9bd85a..c45146e6d5 100644 --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementProbeWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementProbeWorkflow.php @@ -10,6 +10,10 @@ final class PhabricatorStorageManagementProbeWorkflow ->setSynopsis(pht('Show approximate table sizes.')); } + protected function isReadOnlyWorkflow() { + return true; + } + public function didExecute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); $console->writeErr( diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementRenamespaceWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementRenamespaceWorkflow.php index ad4960ceba..e64242344b 100644 --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementRenamespaceWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementRenamespaceWorkflow.php @@ -30,6 +30,10 @@ final class PhabricatorStorageManagementRenamespaceWorkflow )); } + protected function isReadOnlyWorkflow() { + return true; + } + public function didExecute(PhutilArgumentParser $args) { $console = PhutilConsole::getConsole(); diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementShellWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementShellWorkflow.php index c66fc73e98..3cf85e5c35 100644 --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementShellWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementShellWorkflow.php @@ -10,9 +10,11 @@ final class PhabricatorStorageManagementShellWorkflow ->setSynopsis(pht('Launch an interactive shell.')); } + protected function isReadOnlyWorkflow() { + return true; + } + public function execute(PhutilArgumentParser $args) { - - $api = $this->getAPI(); list($host, $port) = $this->getBareHostAndPort($api->getHost()); diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementStatusWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementStatusWorkflow.php index be4f8e5434..f9e91427d4 100644 --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementStatusWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementStatusWorkflow.php @@ -10,6 +10,10 @@ final class PhabricatorStorageManagementStatusWorkflow ->setSynopsis(pht('Show patch application status.')); } + protected function isReadOnlyWorkflow() { + return true; + } + public function didExecute(PhutilArgumentParser $args) { $api = $this->getAPI(); $patches = $this->getPatches(); diff --git a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php index 7f969793ec..8f22caa803 100644 --- a/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php +++ b/src/infrastructure/storage/management/workflow/PhabricatorStorageManagementWorkflow.php @@ -45,19 +45,24 @@ abstract class PhabricatorStorageManagementWorkflow return $this; } + protected function isReadOnlyWorkflow() { + return false; + } public function execute(PhutilArgumentParser $args) { $this->setDryRun($args->getArg('dryrun')); $this->setForce($args->getArg('force')); - if (PhabricatorEnv::isReadOnly()) { - if ($this->isForce()) { - PhabricatorEnv::setReadOnly(false, null); - } else { - throw new PhutilArgumentUsageException( - pht( - 'Phabricator is currently in read-only mode. Use --force to '. - 'override this mode.')); + if (!$this->isReadOnlyWorkflow()) { + if (PhabricatorEnv::isReadOnly()) { + if ($this->isForce()) { + PhabricatorEnv::setReadOnly(false, null); + } else { + throw new PhutilArgumentUsageException( + pht( + 'Phabricator is currently in read-only mode. Use --force to '. + 'override this mode.')); + } } }