winbindd: speed up fill_grent_mem (i.e. winbindd_getgrent) a lot.
authorMichael Adam <obnox@samba.org>
Sun, 2 Nov 2008 22:02:02 +0000 (23:02 +0100)
committerMichael Adam <obnox@samba.org>
Sun, 2 Nov 2008 22:02:02 +0000 (23:02 +0100)
With large groups, getgrent ran into timeouts because after each
single user that was added to the expanded group list, the list
was sorted and made unique.

Now the list is sorted just once after all members have been added.

Michael

source/winbindd/winbindd_group.c

index f81caa22b6c3314096f266eef631c81b687e9250..66d263402833c7b0c170f7693b1a8ef70c3f48fb 100644 (file)
@@ -331,6 +331,24 @@ static int namecmp( const void *a, const void *b )
        return StrCaseCmp( * (char * const *) a, * (char * const *) b); 
 }
 
+static void sort_unique_list(char ***list, uint32 *n_list)
+{
+       uint32_t i;
+
+       /* search for duplicates for sorting and looking for matching
+          neighbors */
+
+       qsort(*list, *n_list, sizeof(char*), QSORT_CAST namecmp);
+
+       for (i=1; i < *n_list; i++) {
+               if (strcmp((*list)[i-1], (*list)[i]) == 0) {
+                       memmove(&((*list)[i-1]), &((*list)[i]),
+                                sizeof(char*)*((*n_list)-i));
+                       (*n_list)--;
+               }
+       }
+}
+
 static NTSTATUS add_names_to_list( TALLOC_CTX *ctx, 
                                   char ***list, uint32 *n_list, 
                                   char **names, uint32 n_names )
@@ -362,19 +380,6 @@ static NTSTATUS add_names_to_list( TALLOC_CTX *ctx,
                new_list[i] = talloc_strdup( new_list, names[j] );
        }
 
-       /* search for duplicates for sorting and looking for matching
-          neighbors */
-       
-       qsort( new_list, n_new_list, sizeof(char*), QSORT_CAST namecmp );
-       
-       for ( i=1; i<n_new_list; i++ ) {
-               if ( strcmp( new_list[i-1], new_list[i] ) == 0 ) {                      
-                       memmove( &new_list[i-1], &new_list[i], 
-                                sizeof(char*)*(n_new_list-i) );
-                       n_new_list--;
-               }
-       }
-
        *list = new_list;
        *n_list = n_new_list;   
 
@@ -576,7 +581,9 @@ static bool fill_grent_mem(struct winbindd_domain *domain,
                n_glist = n_new_glist;
        }
        TALLOC_FREE( glist );   
-        
+
+       sort_unique_list(&names, &num_names);
+
        DEBUG(10, ("looked up %d names\n", num_names));
 
  again: