mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-31 18:01:00 +01:00
Write fewer "applied" rows and clean up excess historical rows
Summary: - Only write the <ruleID, phid> row if the rule is a one-time rule. - Delete all the rows for rules which aren't one-time. NOTE: This is probably like several million rows for Facebook and could take a while. Test Plan: Added some one-time and every-time rules, ran them against objects, verified only relevant rows were inserted. Ran upgrade script against a database with one-time and every-time "ruleapplied" rows, got the irrelevant rows removed. Reviewers: nh, btrahan, jungejason Reviewed By: btrahan CC: aran, epriestley Differential Revision: https://secure.phabricator.com/D1484
This commit is contained in:
parent
cb0bb8165d
commit
5b463e634c
6 changed files with 96 additions and 14 deletions
51
resources/sql/patches/102.heraldcleanup.php
Normal file
51
resources/sql/patches/102.heraldcleanup.php
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2012 Facebook, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
echo "Cleaning up old Herald rule applied rows...\n";
|
||||||
|
|
||||||
|
$rules = id(new HeraldRule())->loadAll();
|
||||||
|
foreach ($rules as $key => $rule) {
|
||||||
|
$first_policy = HeraldRepetitionPolicyConfig::toInt(
|
||||||
|
HeraldRepetitionPolicyConfig::FIRST);
|
||||||
|
if ($rule->getRepetitionPolicy() != $first_policy) {
|
||||||
|
unset($rules[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$conn_w = id(new HeraldRule())->establishConnection('w');
|
||||||
|
|
||||||
|
$clause = '';
|
||||||
|
if ($rules) {
|
||||||
|
$clause = qsprintf(
|
||||||
|
$conn_w,
|
||||||
|
'WHERE ruleID NOT IN (%Ld)',
|
||||||
|
mpull($rules, 'getID'));
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "This may take a moment";
|
||||||
|
do {
|
||||||
|
queryfx(
|
||||||
|
$conn_w,
|
||||||
|
'DELETE FROM %T %Q LIMIT 1000',
|
||||||
|
HeraldRule::TABLE_RULE_APPLIED,
|
||||||
|
$clause);
|
||||||
|
echo ".";
|
||||||
|
} while ($conn_w->getAffectedRows());
|
||||||
|
|
||||||
|
echo "\n";
|
||||||
|
echo "Done.\n";
|
|
@ -96,7 +96,7 @@ class HeraldTestConsoleController extends HeraldController {
|
||||||
$effects = $engine->applyRules($rules, $adapter);
|
$effects = $engine->applyRules($rules, $adapter);
|
||||||
|
|
||||||
$dry_run = new HeraldDryRunAdapter();
|
$dry_run = new HeraldDryRunAdapter();
|
||||||
$engine->applyEffects($effects, $dry_run);
|
$engine->applyEffects($effects, $dry_run, $rules);
|
||||||
|
|
||||||
$xscript = $engine->getTranscript();
|
$xscript = $engine->getTranscript();
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ class HeraldEngine {
|
||||||
|
|
||||||
$engine = new HeraldEngine();
|
$engine = new HeraldEngine();
|
||||||
$effects = $engine->applyRules($rules, $object);
|
$effects = $engine->applyRules($rules, $object);
|
||||||
$engine->applyEffects($effects, $object);
|
$engine->applyEffects($effects, $object, $rules);
|
||||||
|
|
||||||
return $engine->getTranscript();
|
return $engine->getTranscript();
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,11 @@ class HeraldEngine {
|
||||||
return $effects;
|
return $effects;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function applyEffects(array $effects, HeraldObjectAdapter $object) {
|
public function applyEffects(
|
||||||
|
array $effects,
|
||||||
|
HeraldObjectAdapter $object,
|
||||||
|
array $rules) {
|
||||||
|
|
||||||
$this->transcript->setDryRun($object instanceof HeraldDryRunAdapter);
|
$this->transcript->setDryRun($object instanceof HeraldDryRunAdapter);
|
||||||
|
|
||||||
$xscripts = $object->applyHeraldEffects($effects);
|
$xscripts = $object->applyHeraldEffects($effects);
|
||||||
|
@ -132,18 +136,52 @@ class HeraldEngine {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->transcript->getDryRun()) {
|
if (!$this->transcript->getDryRun()) {
|
||||||
|
|
||||||
|
$rules = mpull($rules, null, 'getID');
|
||||||
|
$applied_ids = array();
|
||||||
|
$first_policy = HeraldRepetitionPolicyConfig::toInt(
|
||||||
|
HeraldRepetitionPolicyConfig::FIRST);
|
||||||
|
|
||||||
// Mark all the rules that have had their effects applied as having been
|
// Mark all the rules that have had their effects applied as having been
|
||||||
// executed for the current object.
|
// executed for the current object.
|
||||||
$rule_ids = mpull($xscripts, 'getRuleID');
|
$rule_ids = mpull($xscripts, 'getRuleID');
|
||||||
|
|
||||||
foreach ($rule_ids as $rule_id) {
|
foreach ($rule_ids as $rule_id) {
|
||||||
if (!$rule_id) {
|
if (!$rule_id) {
|
||||||
// Some apply transcripts are purely informational and not associated
|
// Some apply transcripts are purely informational and not associated
|
||||||
// with a rule, e.g. carryover emails from earlier revisions.
|
// with a rule, e.g. carryover emails from earlier revisions.
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
HeraldRule::saveRuleApplied($rule_id, $object->getPHID());
|
|
||||||
|
$rule = idx($rules, $rule_id);
|
||||||
|
if (!$rule) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($rule->getRepetitionPolicy() == $first_policy) {
|
||||||
|
$applied_ids[] = $rule_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($applied_ids) {
|
||||||
|
$conn_w = id(new HeraldRule())->establishConnection('w');
|
||||||
|
$sql = array();
|
||||||
|
foreach ($applied_ids as $id) {
|
||||||
|
$sql[] = qsprintf(
|
||||||
|
$conn_w,
|
||||||
|
'(%s, %d)',
|
||||||
|
$object->getPHID(),
|
||||||
|
$id);
|
||||||
|
}
|
||||||
|
queryfx(
|
||||||
|
$conn_w,
|
||||||
|
'INSERT IGNORE INTO %T (phid, ruleID) VALUES %Q',
|
||||||
|
HeraldRule::TABLE_RULE_APPLIED,
|
||||||
|
implode(', ', $sql));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
die("DERP");
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTranscript() {
|
public function getTranscript() {
|
||||||
|
|
|
@ -16,6 +16,8 @@ phutil_require_module('phabricator', 'applications/herald/storage/transcript/bas
|
||||||
phutil_require_module('phabricator', 'applications/herald/storage/transcript/condition');
|
phutil_require_module('phabricator', 'applications/herald/storage/transcript/condition');
|
||||||
phutil_require_module('phabricator', 'applications/herald/storage/transcript/object');
|
phutil_require_module('phabricator', 'applications/herald/storage/transcript/object');
|
||||||
phutil_require_module('phabricator', 'applications/herald/storage/transcript/rule');
|
phutil_require_module('phabricator', 'applications/herald/storage/transcript/rule');
|
||||||
|
phutil_require_module('phabricator', 'storage/qsprintf');
|
||||||
|
phutil_require_module('phabricator', 'storage/queryfx');
|
||||||
|
|
||||||
phutil_require_module('phutil', 'utils');
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
|
@ -87,15 +87,6 @@ class HeraldRule extends HeraldDAO {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function saveRuleApplied($rule_id, $phid) {
|
|
||||||
queryfx(
|
|
||||||
id(new HeraldRule())->establishConnection('w'),
|
|
||||||
'INSERT IGNORE INTO %T (phid, ruleID) VALUES (%s, %d)',
|
|
||||||
self::TABLE_RULE_APPLIED,
|
|
||||||
$phid,
|
|
||||||
$rule_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function loadConditions() {
|
public function loadConditions() {
|
||||||
if (!$this->getID()) {
|
if (!$this->getID()) {
|
||||||
return array();
|
return array();
|
||||||
|
|
|
@ -42,7 +42,7 @@ class PhabricatorRepositoryCommitHeraldWorker
|
||||||
$engine = new HeraldEngine();
|
$engine = new HeraldEngine();
|
||||||
|
|
||||||
$effects = $engine->applyRules($rules, $adapter);
|
$effects = $engine->applyRules($rules, $adapter);
|
||||||
$engine->applyEffects($effects, $adapter);
|
$engine->applyEffects($effects, $adapter, $rules);
|
||||||
|
|
||||||
$email_phids = $adapter->getEmailPHIDs();
|
$email_phids = $adapter->getEmailPHIDs();
|
||||||
if (!$email_phids) {
|
if (!$email_phids) {
|
||||||
|
|
Loading…
Reference in a new issue