From f8c34582163e34a0e4ad4d0c16aec75dbf68b940 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 4 May 2011 21:05:25 -0700 Subject: [PATCH] Option to pre-load a plugin with checkschema script One of the problems we've had with running large-scale hosting systems for StatusNet is enabling new plugins. If the plugin is not enabled, its database tables are not checked at script time. Conversely, if it is enabled, it may take several hours to run checkschema for tens of thousands of sites -- during which time users might see DB errors. A new argument to checkschema lets it pre-load one or more plugins before checking the schema. This lets us prepare the plugins' database tables before they're used in production. In a multihome environment, this can be combined with tags to gradually roll out a new plugin. In the config file, a stanza like: $site = Status_network::getFromHostname(...); if ($site->hasTag('fooenabled')) { addPlugin('Foo'); } ...will only enable the plugin on certain sites. Meanwhile, a bash script like this should gradually enable the plugin: # For all sites... for site in `php allsites.php`; do # Update the schema for the Foo plugin php checkschema.php -s$site.wildcard -xFoo; # Enable the Foo plugin php settag.php -s$site.wildcard fooenabled; done --- scripts/checkschema.php | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/scripts/checkschema.php b/scripts/checkschema.php index 73fd74302c..cec5773683 100755 --- a/scripts/checkschema.php +++ b/scripts/checkschema.php @@ -2,7 +2,7 @@ $def) { } $schemaUpdater->checkSchema(); +if (have_option('x', 'extensions')) { + $ext = trim(get_option_value('x', 'extensions')); + $exts = explode(',', $ext); + foreach ($exts as $plugin) { + try { + addPlugin($plugin); + } catch (Exception $e) { + print $e->getMessage()."\n"; + exit(1); + } + } +} + Event::handle('CheckSchema');