[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