[Pvfs2-cvs] commit by slang in pvfs2/src/io/trove/trove-dbpf: dbpf-error.c dbpf-keyval.c dbpf-thread.c dbpf.h

CVS commit program cvs at parl.clemson.edu
Fri Jan 12 22:00:57 EST 2007


Update of /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf
In directory parlweb1:/tmp/cvs-serv24184/src/io/trove/trove-dbpf

Modified Files:
      Tag: pvfs-2-6-branch
	dbpf-error.c dbpf-keyval.c dbpf-thread.c dbpf.h 
Log Message:
fix dbpf code to work with latest berkeley db (4.5).  Some notes:

* 4.5 now requires key.ulen to be >= key.size for a db->get.  Previously versions just assumed the key's matched and filled the data entry.

* The dbpf-thread servicing code was a bit broken if the DB error wasn't being converted to something trove understood (a negative value).  We now check for uknown errors, as well as convert DB_BUFFER_SMALL appropriately if that gets returned by a db call somehow.




Index: dbpf-error.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf/dbpf-error.c,v
diff -p -u -r1.8 -r1.8.40.1
--- dbpf-error.c	25 Oct 2005 18:01:00 -0000	1.8
+++ dbpf-error.c	13 Jan 2007 03:00:57 -0000	1.8.40.1
@@ -36,8 +36,15 @@ PVFS_error dbpf_db_error_to_trove_error(
 	case DB_RUNRECOVERY:
 	    gossip_err("Error: DB_RUNRECOVERY encountered.\n");
 	    return TROVE_EIO;
+#ifdef HAVE_DB_BUFFER_SMALL
+        case DB_BUFFER_SMALL:
+            /* all Berkeley DB gets should be allocating user memory,
+             * so if we get BUFFER_SMALL it must be programming error
+             */
+            return TROVE_EINVAL;
+#endif
     }
-    return -4243; /* return some identifiable number */
+    return DBPF_ERROR_UNKNOWN; /* return some identifiable value */
 }
 
 /*

Index: dbpf-keyval.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf/dbpf-keyval.c,v
diff -p -u -r1.78.8.1 -r1.78.8.2
--- dbpf-keyval.c	6 Dec 2006 00:39:05 -0000	1.78.8.1
+++ dbpf-keyval.c	13 Jan 2007 03:00:57 -0000	1.78.8.2
@@ -238,7 +238,7 @@ static int dbpf_keyval_read_op_svc(struc
            op_p->u.k_read.key->buffer, 
            op_p->u.k_read.key->buffer_sz);
     key.data = &key_entry;
-    key.size = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
+    key.size = key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
         op_p->u.k_read.key->buffer_sz);
 
     memset(&data, 0, sizeof(data));
@@ -374,7 +374,7 @@ static int dbpf_keyval_write_op_svc(stru
     memset(&key, 0, sizeof(key));
     memset(&data, 0, sizeof(data));
     key.data = &key_entry;
-    key.size = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
+    key.size = key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
         op_p->u.k_write.key.buffer_sz);
     data.data = op_p->u.k_write.val.buffer;
     data.size = op_p->u.k_write.val.buffer_sz;
@@ -1042,7 +1042,7 @@ static int dbpf_keyval_write_list_op_svc
         memset(&key, 0, sizeof(key));
         memset(&data, 0, sizeof(data));
         key.data = &key_entry;
-        key.size = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
+        key.size = key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
             op_p->u.k_write_list.key_array[k].buffer_sz);
         key.flags |= DB_DBT_USERMEM;
 
@@ -1079,12 +1079,12 @@ static int dbpf_keyval_write_list_op_svc
         memset(&data, 0, sizeof(data));
 
         key.data = &key_entry;
-        key.size = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
+        key.size = key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(
             op_p->u.k_write_list.key_array[k].buffer_sz);
 
         data.flags = 0;
         data.data = op_p->u.k_write_list.val_array[k].buffer;
-        data.size = op_p->u.k_write_list.val_array[k].buffer_sz;
+        data.size = data.ulen = op_p->u.k_write_list.val_array[k].buffer_sz;
 
         gossip_debug(GOSSIP_DBPF_KEYVAL_DEBUG,
                      "keyval_db->put(handle= %llu, key= %*s (%d)) size=%d\n",
@@ -1365,7 +1365,7 @@ static int dbpf_keyval_do_remove(
 
     memset(&db_key, 0, sizeof(db_key));
     db_key.data = &key_entry;
-    db_key.size = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(key->buffer_sz);
+    db_key.size = db_key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(key->buffer_sz);
 
     gossip_debug(GOSSIP_DBPF_KEYVAL_DEBUG,
                  "keyval_db->del(handle= %llu, key= %*s (%d)) size=%d\n",
@@ -1688,7 +1688,7 @@ static int dbpf_keyval_get_handle_info_o
     memset(&key, 0, sizeof(key));
     memset(&data, 0, sizeof(data));
     key.data = &key_entry;
-    key.size = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(0);
+    key.size = key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(0);
     key.flags = DB_DBT_USERMEM;
     data.data = op_p->u.k_get_handle_info.info;
     data.ulen = sizeof(TROVE_keyval_handle_info);
@@ -1735,7 +1735,7 @@ static int dbpf_keyval_handle_info_ops(s
         memset(&data, 0, sizeof(data));
         key.flags = DB_DBT_USERMEM;
         key.data = &key_entry;
-        key.size = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(0);
+        key.size = key.ulen = DBPF_KEYVAL_DB_ENTRY_TOTAL_SIZE(0);
         data.data = &info;
         data.ulen = sizeof(TROVE_keyval_handle_info);
         data.flags = DB_DBT_USERMEM;

Index: dbpf-thread.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf/dbpf-thread.c,v
diff -p -u -r1.36 -r1.36.8.1
--- dbpf-thread.c	20 Sep 2006 21:18:33 -0000	1.36
+++ dbpf-thread.c	13 Jan 2007 03:00:57 -0000	1.36.8.1
@@ -203,6 +203,14 @@ int dbpf_do_one_work_cycle(int *out_coun
                 return ret; /* not sure how to recover from failure here */
             }
         }
+        else if(ret == -DBPF_ERROR_UNKNOWN || ret == DBPF_ERROR_UNKNOWN)
+        {
+            /* If we get an error back from Berkeley DB, we assume fatal
+             * and just return.  Make sure the return code is negative
+             * here though.
+             */
+            return (ret < 0) ? ret : -ret;
+        }
         else
         {
 #ifndef __PVFS2_TROVE_AIO_THREADED__

Index: dbpf.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/io/trove/trove-dbpf/dbpf.h,v
diff -p -u -r1.79.6.1 -r1.79.6.2
--- dbpf.h	6 Dec 2006 00:39:05 -0000	1.79.6.1
+++ dbpf.h	13 Jan 2007 03:00:57 -0000	1.79.6.2
@@ -19,6 +19,10 @@ extern "C" {
 #include "dbpf-keyval-pcache.h"
 #include "dbpf-open-cache.h"
 
+/* For unknown Berkeley DB errors, we return some large value
+ */
+#define DBPF_ERROR_UNKNOWN 4243
+
 #define TROVE_DBPF_VERSION_KEY                       "trove-dbpf-version"
 #define TROVE_DBPF_VERSION_VALUE                                  "0.1.2"
 #define LAST_HANDLE_STRING                                  "last_handle"



More information about the Pvfs2-cvs mailing list