Index: src/io/trove/trove-dbpf/dbpf-dspace.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf/dbpf-dspace.c,v
retrieving revision 1.144
diff -a -u -r1.144 dbpf-dspace.c
--- src/io/trove/trove-dbpf/dbpf-dspace.c	2 Feb 2007 02:08:58 -0000	1.144
+++ src/io/trove/trove-dbpf/dbpf-dspace.c	22 Feb 2007 23:11:40 -0000
@@ -3,6 +3,7 @@
  *
  * See COPYING in top-level directory.
  */
+#define _XOPEN_SOURCE 600
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -30,6 +31,7 @@
 #include "dbpf-attr-cache.h"
 #include "dbpf-open-cache.h"
 
+
 #ifdef __PVFS2_TROVE_THREADED__
 #include <pthread.h>
 #include "dbpf-thread.h"
@@ -535,8 +537,13 @@
     DBC *dbc_p = NULL;
     DBT key, data;
     union dbpf_dspace_recno_handle_key recno_key;
+    void * multiples_buffer = NULL;
     TROVE_ds_storedattr_s s_attr;
-    TROVE_handle dummy_handle = TROVE_HANDLE_NULL;
+    TROVE_handle dummy_handle;
+    size_t sizeof_handle = 0, sizeof_attr = 0;
+    int start_size;
+    void *tmp_ptr;
+    uint32_t dbpagesize;
 
     if (*op_p->u.d_iterate_handles.position_p == TROVE_ITERATE_END)
     {
@@ -596,30 +603,94 @@
         }
     }
 
-    /* read handles until we run out of handles or space in buffer */
-    for (i = 0; i < *op_p->u.d_iterate_handles.count_p; i++)
+    start_size = ((sizeof(TROVE_handle) + sizeof(s_attr)) *
+                  *op_p->u.d_iterate_handles.count_p);
+    /* round up to the nearest 1024 */
+    start_size = (start_size + 1023) & (~(unsigned long)1023);
+
+    ret = op_p->coll_p->ds_db->get_pagesize(op_p->coll_p->ds_db, &dbpagesize);
+
+    ret = posix_memalign(&multiples_buffer, dbpagesize, start_size);
+    if(ret != 0)
     {
-        memset(&key, 0, sizeof(key));
-        key.data = &op_p->u.d_iterate_handles.handle_array[i];
-        key.size = key.ulen = sizeof(TROVE_handle);
-        key.flags |= DB_DBT_USERMEM;
+        ret = -TROVE_ENOMEM;
+        goto return_error;
+    }
 
-        memset(&data, 0, sizeof(data));
-        data.data = &s_attr;
-        data.size = data.ulen = sizeof(s_attr);
-        data.flags |= DB_DBT_USERMEM;
+    key.data = &dummy_handle;
+    key.size = key.ulen = sizeof(TROVE_handle);
+    key.flags = DB_DBT_USERMEM;
+
+    data.data = multiples_buffer;
+    data.size = data.ulen = start_size;
+    data.flags = DB_DBT_USERMEM;
 
-        ret = dbc_p->c_get(dbc_p, &key, &data, DB_NEXT);
-        if (ret == DB_NOTFOUND)
+    i = 0;
+    while(i < *op_p->u.d_iterate_handles.count_p)
+    {
+        ret = dbc_p->c_get(dbc_p, &key, &data, DB_MULTIPLE_KEY|DB_NEXT);
+        if(ret == DB_BUFFER_SMALL)
+        {
+            /* need to allocate more and try again */
+            free(multiples_buffer);
+            multiples_buffer = malloc(data.size);
+            if(!multiples_buffer)
+            {
+                ret = -TROVE_ENOMEM;
+                goto return_error;
+            }
+            data.data = multiples_buffer;
+            data.ulen = data.size;
+
+            ret = dbc_p->c_get(dbc_p, &key, &data, DB_MULTIPLE_KEY|DB_NEXT);
+        }
+
+        if(ret == DB_NOTFOUND)
         {
             goto return_ok;
         }
-        else if (ret != 0)
+
+        if(ret < 0)
         {
             ret = -dbpf_db_error_to_trove_error(ret);
             gossip_err("c_get failed on iteration %d\n", i);
             goto return_error;
         }
+
+        DB_MULTIPLE_INIT(tmp_ptr, &data);
+
+        /* read handles until we run out of handles or space in buffer */
+        for (; i < *op_p->u.d_iterate_handles.count_p; i++)
+        {
+            void *tmp_handle;
+            void *tmp_attr;
+
+            /* the semantics of this macro are a little odd.  after
+             * it returns, tmp_handle points into the data buffer
+             * (multiples_buffer) at the location of the key, so the
+             * pointer value of tmp_buffer actually changes, and it
+             * must be derefenced to get the handle value.
+             */
+            DB_MULTIPLE_KEY_NEXT(tmp_ptr, &data,
+                                 tmp_handle, sizeof_handle,
+                                 tmp_attr, sizeof_attr);
+            if(!tmp_ptr)
+            {
+                break;
+            }
+
+            /* verify sizes are correct */
+            if(sizeof_handle != sizeof(TROVE_handle) ||
+               sizeof_attr != sizeof(s_attr))
+            {
+                /* something is wrong with the result */
+                ret = -TROVE_EINVAL;
+                goto return_error;
+            }
+
+            op_p->u.d_iterate_handles.handle_array[i] = 
+                *(TROVE_handle *)tmp_handle;
+        }
     }
 
   return_ok:
@@ -667,6 +738,11 @@
         dbc_p->c_close(dbc_p);
     }
 
+    if(multiples_buffer)
+    {
+        free(multiples_buffer);
+    }
+
     return 1;
 
 return_error:
@@ -676,6 +752,11 @@
     if (dbc_p)
     {
         dbc_p->c_close(dbc_p);
+    }
+
+    if(multiples_buffer)
+    {
+        free(multiples_buffer);
     }
 
     return ret;
Index: src/io/trove/trove-handle-mgmt/trove-handle-mgmt.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-handle-mgmt/trove-handle-mgmt.h,v
retrieving revision 1.13
diff -a -u -r1.13 trove-handle-mgmt.h
--- src/io/trove/trove-handle-mgmt/trove-handle-mgmt.h	28 Jul 2004 14:32:52 -0000	1.13
+++ src/io/trove/trove-handle-mgmt/trove-handle-mgmt.h	22 Feb 2007 23:11:40 -0000
@@ -7,7 +7,7 @@
 #ifndef __TROVE_HANDLE_MGMT_H
 #define __TROVE_HANDLE_MGMT_H
 
-#define MAX_NUM_VERIFY_HANDLE_COUNT        512
+#define MAX_NUM_VERIFY_HANDLE_COUNT        4096
 
 #define TROVE_DEFAULT_HANDLE_PURGATORY_SEC 360
 
