Ryan Lane has submitted this change and it was merged.

Change subject: Cache a dict of member ids and names rather than just names.
......................................................................


Cache a dict of member ids and names rather than just names.

Having the ids and names allows for much faster lookup in
SpecialNovaSudoer.

Change-Id: Ifce2f56ce0ded10a6a5c789c64e4aeff20c941ac
---
M nova/OpenStackNovaProject.php
M special/SpecialNovaSudoer.php
2 files changed, 77 insertions(+), 66 deletions(-)

Approvals:
  Ryan Lane: Verified; Looks good to me, approved
  jenkins-bot: Checked



diff --git a/nova/OpenStackNovaProject.php b/nova/OpenStackNovaProject.php
index e493014..13e7a25 100644
--- a/nova/OpenStackNovaProject.php
+++ b/nova/OpenStackNovaProject.php
@@ -159,22 +159,25 @@
        }
 
        /**
-        * Return all users who are a member of this project
+        * Fill $this->members.
+        *
+        * $this->members uses the uid as index and the name as value.
         *
         * @return array
         */
-       function getMembers() {
+       function loadMembers() {
                global $wgAuth;
                global $wgMemc;
                global $wgOpenStackManagerLDAPDomain;
 
-               $key = wfMemcKey( 'openstackmanager', 'projectmembers', 
$this->projectname );
-               $members = $wgMemc->get( $key );
-               if ( is_array( $members ) ) {
-                       return $members;
+               $key = wfMemcKey( 'openstackmanager', 'projectuidsandmembers', 
$this->projectname );
+               $this->members = $wgMemc->get( $key );
+
+               if ( is_array( $this->members ) ) {
+                       return;
                }
 
-               $members = array();
+               $this->members = array();
                if ( isset( $this->projectInfo[0]['member'] ) ) {
                        $memberdns = $this->projectInfo[0]['member'];
                        // The first element in the member list is the count
@@ -182,24 +185,51 @@
                        // Shift it off.
                        array_shift( $memberdns );
                        foreach ( $memberdns as $memberdn ) {
+                               $member = explode( '=', $memberdn );
+                               $member = explode( ',', $member[1] );
+                               $member = $member[0];
+
                                $searchattr = $wgAuth->getConf( 
'SearchAttribute', $wgOpenStackManagerLDAPDomain );
                                if ( $searchattr ) {
                                        // We need to look up the search attr 
from the user entry
                                        // this is expensive, but must be done.
                                        $userInfo = 
$wgAuth->getUserInfoStateless( $memberdn );
-                                       $members[] = 
$userInfo[0][$searchattr][0];
+                                       $this->members[$member] = 
$userInfo[0][$searchattr][0];
                                } else {
-                                       $member = explode( '=', $memberdn );
-                                       $member = explode( ',', $member[1] );
-                                       $member = $member[0];
-                                       $members[] = $member;
+                                       $this->members[$member] = $member;
                                }
                        }
                }
 
-               $wgMemc->set( $key, $members, '3600' );
+               $wgMemc->set( $key, $this->members, '3600' );
+       }
 
-               return $members;
+       /**
+        * Return UIDs for users who are a member of this project
+        *
+        * We need this for managing things related to sudoers; generating
+        * the list is expensive and caching it here is a big speedup.
+        *
+        * @return array
+        */
+       function getMemberUIDs() {
+               $this->loadMembers();
+               return array_keys( $this->members );
+       }
+
+       /**
+        * Return all users who are a member of this project
+        *
+        * @return array
+        */
+       function getMembers() {
+               $this->loadMembers();
+               return array_values( $this->members );
+       }
+
+       function memberForUid( $uid ) {
+               $this->loadMembers();
+               return $this->members[$uid];
        }
 
        /**
@@ -388,7 +418,7 @@
                global $wgAuth;
                global $wgMemc;
 
-               $key = wfMemcKey( 'openstackmanager', 'projectmembers', 
$this->projectname );
+               $key = wfMemcKey( 'openstackmanager', 'projectuidsandmembers', 
$this->projectname );
                $wgMemc->delete( $key );
 
                if ( isset( $this->projectInfo[0]['member'] ) ) {
@@ -494,7 +524,7 @@
                global $wgAuth;
                global $wgMemc;
 
-               $key = wfMemcKey( 'openstackmanager', 'projectmembers', 
$this->projectname );
+               $key = wfMemcKey( 'openstackmanager', 'projectuidsandmembers', 
$this->projectname );
                $wgMemc->delete( $key );
 
                $members = array();
diff --git a/special/SpecialNovaSudoer.php b/special/SpecialNovaSudoer.php
index 941299a..4534644 100644
--- a/special/SpecialNovaSudoer.php
+++ b/special/SpecialNovaSudoer.php
@@ -287,56 +287,40 @@
                return true;
        }
 
-       function getProjectMemberUids( $project) {
-               $projectmembers = $project->getMembers();
-               $uids = array();
-
-               foreach ( $projectmembers as $projectmember ) {
-                       $user = new OpenStackNovaUser( $projectmember );
-                       $uids[] = $user->getUid();
-               }
-
-               return $uids;
-       }
-
        function getSudoUsers( $projectName, $sudoer=null ) {
                $project = OpenStackNovaProject::getProjectByName( $projectName 
);
-               $projectmembers = $project->getMembers();
+               $projectuids = $project->getMemberUids();
 
-               array_unshift( $projectmembers, $this->msg( 
'openstackmanager-allmembers' )->text() );
                $sudomembers = array();
                if ( $sudoer ) {
                        $sudomembers = $sudoer->getSudoerUsers();
                }
                $user_keys = array();
                $user_defaults = array();
-               foreach ( $projectmembers as $projectmember ) {
 
-                       $projectGroup = "%" . 
$project->getProjectGroup()->getProjectGroupName();
+               # Add the 'all project members' option to the top
+               $projectGroup = "%" . 
$project->getProjectGroup()->getProjectGroupName();
+               $all_members = $this->msg( 'openstackmanager-allmembers' 
)->text();
+               $user_keys[$all_members] = $all_members;
+               if ( in_array( 'ALL', $sudomembers ) || in_array ( 
$projectGroup, $sudomembers ) ) {
+                       $user_defaults[$all_members] = $all_members;
+               }
 
-                       if ( $projectmember == $this->msg( 
'openstackmanager-allmembers' )->text() ) {
-                               $userUid = $this->msg( 
'openstackmanager-allmembers' )->text();
-                               if ( in_array( 'ALL', $sudomembers ) || 
in_array ( $projectGroup, $sudomembers ) ) {
-                                       $user_defaults[$projectmember] = 
$userUid;
-                               }
-                       } else {
-                               $user = new OpenStackNovaUser( $projectmember );
-                               $userUid = $user->getUid();
-                               if ( in_array( $userUid, $sudomembers ) ) {
-                                       $user_defaults[$projectmember] = 
$userUid;
-                               }
-                       }
+               foreach ( $projectuids as $userUid ) {
+                       $projectmember = $project->memberForUid( $userUid );
 
                        $user_keys[$projectmember] = $userUid;
+                       if ( in_array( $userUid, $sudomembers ) ) {
+                               $user_defaults[$projectmember] = $userUid;
+                       }
                }
                return array( 'keys' => $user_keys, 'defaults' => 
$user_defaults );
        }
 
        function getSudoRunAsUsers( $projectName, $sudoer=null ) {
                $project = OpenStackNovaProject::getProjectByName( $projectName 
);
-               $projectmembers = $project->getMembers();
+               $projectuids = $project->getMemberUids();
 
-               array_unshift( $projectmembers, $this->msg( 
'openstackmanager-allmembers' )->text() );
                $runasmembers = array();
                if ( $sudoer ) {
                        $runasmembers = $sudoer->getSudoerRunAsUsers();
@@ -344,24 +328,22 @@
 
                $runas_keys = array();
                $runas_defaults = array();
-               foreach ( $projectmembers as $projectmember ) {
 
-                       $projectGroup = "%" . 
$project->getProjectGroup()->getProjectGroupName();
+               # Add the 'all project members' option to the top
+               $projectGroup = "%" . 
$project->getProjectGroup()->getProjectGroupName();
+               $all_members = $this->msg( 'openstackmanager-allmembers' 
)->text();
+               $runas_keys[$all_members] = $all_members;
+               if ( in_array( 'ALL', $runasmembers ) || in_array ( 
$projectGroup, $runasmembers ) ) {
+                       $runas_defaults[$all_members] = $all_members;
+               }
 
-                       if ( $projectmember == $this->msg( 
'openstackmanager-allmembers' )->text() ) {
-                               $userUid = $this->msg( 
'openstackmanager-allmembers' )->text();
-                               if ( in_array( 'ALL', $runasmembers ) || 
in_array ( $projectGroup, $runasmembers ) ) {
-                                       $runas_defaults[$projectmember] = 
$userUid;
-                               }
-                       } else {
-                               $user = new OpenStackNovaUser( $projectmember );
-                               $userUid = $user->getUid();
-                               if ( in_array( $userUid, $runasmembers ) ) {
-                                       $runas_defaults[$projectmember] = 
$userUid;
-                               }
-                       }
+               foreach ( $projectuids as $userUid ) {
+                       $projectmember = $project->memberForUid( $userUid );
 
                        $runas_keys[$projectmember] = $userUid;
+                       if ( in_array( $userUid, $runasmembers ) ) {
+                               $runas_defaults[$projectmember] = $userUid;
+                       }
                }
                return array( 'keys' => $runas_keys, 'defaults' => 
$runas_defaults );
        }
@@ -437,13 +419,12 @@
        function makeHumanReadableUserlist( $userList, $project ) {
                $HRList = array();
 
-               $projectmembers = $project->getMembers();
+               $projectuids = $project->getMemberUids();
                $leftovers = $userList;
-               foreach ( $projectmembers as $member ) {
-                       $user = new OpenStackNovaUser( $member );
-                       $userIndex = array_search( $user->getUid(), $userList );
+               foreach ( $projectuids as $uid ) {
+                       $userIndex = array_search( $uid, $userList );
                        if ( $userIndex !== false ) {
-                               $HRList[] = $member;
+                               $HRList[] = $project->memberForUid( $uid );
                                unset( $leftovers[$userIndex] );
                        }
                }
@@ -650,7 +631,7 @@
 
                        $projectName = $formData['project'];
                        $project = OpenStackNovaProject::getProjectByName( 
$projectName );
-                       $projectuids = $this->getProjectMemberUids( $project );
+                       $projectuids = $project->getMemberUids();
                        $projectGroup = "%" . 
$project->getProjectGroup()->getProjectGroupName();
 
                        $users = 
$this->removeALLFromUserKeys($formData['users']);

-- 
To view, visit https://gerrit.wikimedia.org/r/69155
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ifce2f56ce0ded10a6a5c789c64e4aeff20c941ac
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/OpenStackManager
Gerrit-Branch: master
Gerrit-Owner: Andrew Bogott <[email protected]>
Gerrit-Reviewer: Ryan Lane <[email protected]>
Gerrit-Reviewer: jenkins-bot

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to