Browse files

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.
  • Loading branch information...
1 parent 93fb7b5 commit c08ea5202f27ca2dc8d99cbd17b83fc58ba376ee @timhunt timhunt committed Apr 4, 2012
Showing with 16 additions and 4 deletions.
  1. +16 −4 lib/accesslib.php
View
20 lib/accesslib.php
@@ -5853,12 +5853,24 @@ protected static function get_cleanup_sql() {
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);
}
}

0 comments on commit c08ea52

Please sign in to comment.