MDL-32462 accesslib: fix context_user::build_paths performance

The problem was that the query was updating every row whether it needed
it or not. This turns out to be a really bad thing to do on Postgres,
because it then triggers a long expensive vacuum, which lock the context
table for a long time a really bad thing to do.
This commit is contained in:
Tim Hunt
2012-04-20 10:30:26 +01:00
parent 93fb7b528b
commit c08ea5202f
+16 -4
View File
@@ -5853,12 +5853,24 @@ class context_user extends context {
protected static function build_paths($force) {
global $DB;
// first update normal users
// First update normal users.
$path = $DB->sql_concat('?', 'id');
$pathstart = '/' . SYSCONTEXTID . '/';
$params = array($pathstart);
if ($force) {
$where = "depth <> 2 OR path IS NULL OR path <> ({$path})";
$params[] = $pathstart;
} else {
$where = "depth = 0 OR path IS NULL";
}
$sql = "UPDATE {context}
SET depth = 2,
path = ".$DB->sql_concat("'/".SYSCONTEXTID."/'", 'id')."
WHERE contextlevel=".CONTEXT_USER;
$DB->execute($sql);
path = {$path}
WHERE contextlevel = " . CONTEXT_USER . "
AND ($where)";
$DB->execute($sql, $params);
}
}