[Pvfs2-cvs] commit by shuangy in pvfs2/src/server: chdirent.sm
rmdirent.sm
CVS commit program
cvs at parl.clemson.edu
Sun Apr 10 13:26:14 EDT 2011
Update of /projects/cvsroot/pvfs2/src/server
In directory parlweb1:/tmp/cvs-serv4052/src/server
Modified Files:
Tag: Orange-Elaine-Distr-Dir-Branch
chdirent.sm rmdirent.sm
Log Message:
1. add entry verification in chdirent.sm 2. add {cr|ch|rm}dirent retry to sys-rename.sm when dirdata mismatch.
Index: chdirent.sm
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/server/chdirent.sm,v
diff -p -u -r1.21.36.4 -r1.21.36.5
--- chdirent.sm 14 Mar 2011 19:52:10 -0000 1.21.36.4
+++ chdirent.sm 10 Apr 2011 17:26:14 -0000 1.21.36.5
@@ -14,6 +14,7 @@
#include "pvfs2-util.h"
#include "pvfs2-internal.h"
#include "pint-util.h"
+#include "dist-dir-utils.h"
enum
{
@@ -27,10 +28,27 @@ machine pvfs2_chdirent_sm
state prelude
{
jump pvfs2_prelude_sm;
+/*
success => read_directory_entry;
+*/
+ success => get_dist_dir_attr;
default => final_response;
}
+ state get_dist_dir_attr
+ {
+ run chdirent_get_dist_dir_attr;
+ success => get_bitmap;
+ default => setup_resp;
+ }
+
+ state get_bitmap
+ {
+ run chdirent_get_bitmap;
+ success => read_directory_entry;
+ default => setup_resp;
+ }
+
state read_directory_entry
{
run chdirent_read_directory_entry;
@@ -91,12 +109,184 @@ machine pvfs2_chdirent_sm
%%
+
+static PINT_sm_action chdirent_get_dist_dir_attr(
+ struct PINT_smcb *smcb, job_status_s *js_p)
+{
+ struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+ int ret;
+ job_id_t j_id;
+
+ /* set up key and value structures for reading the dist_dir_attr */
+ s_op->key.buffer = Trove_Common_Keys[DIST_DIR_ATTR_KEY].key;
+ s_op->key.buffer_sz = Trove_Common_Keys[DIST_DIR_ATTR_KEY].size;
+ if(s_op->free_val)
+ {
+ free(s_op->val.buffer);
+ }
+
+ s_op->val.buffer = &s_op->attr.u.dir.dist_dir_attr;
+ s_op->val.buffer_sz = sizeof(PVFS_dist_dir_attr);
+ s_op->free_val = 0;
+
+ js_p->error_code = 0;
+ gossip_debug(GOSSIP_SERVER_DEBUG,
+ " trying to read dist_dir_attr (coll_id = %d, "
+ "handle = %llu, key = %s (%d), val_buf = %p (%d))\n",
+ s_op->req->u.chdirent.fs_id, llu(s_op->req->u.chdirent.dirent_handle),
+ (char *)s_op->key.buffer, s_op->key.buffer_sz,
+ s_op->val.buffer, s_op->val.buffer_sz);
+
+ ret = job_trove_keyval_read(
+ s_op->req->u.chdirent.fs_id, s_op->req->u.chdirent.dirent_handle,
+ &s_op->key, &s_op->val,
+ 0,
+ NULL, smcb, 0, js_p,
+ &j_id, server_job_context, s_op->req->hints);
+
+ return ret;
+}
+
+
+static PINT_sm_action chdirent_get_bitmap(
+ struct PINT_smcb *smcb, job_status_s *js_p)
+{
+ struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+ int ret;
+ PVFS_object_attr *attr_p;
+ job_id_t j_id;
+
+ attr_p = &s_op->attr;
+
+ if(js_p->error_code == -TROVE_ENOENT)
+ {
+ gossip_debug(GOSSIP_SERVER_DEBUG, "chdirent: no DIST_DIR_ATTR key present in dirdata handle!!\n");
+ attr_p->u.dir.dist_dir_bitmap = NULL;
+ attr_p->u.dir.dirdata_handles = NULL;
+ return SM_ACTION_COMPLETE;
+ }
+
+ assert(attr_p->u.dir.dist_dir_attr.num_servers > 0);
+
+ gossip_debug(GOSSIP_SERVER_DEBUG,
+ "chdirent: get dist-dir-attr for dirdata handle %llu "
+ "with tree_height=%d, num_servers=%d, bitmap_size=%d, "
+ "split_size=%d, server_no=%d and branch_level=%d\n",
+ llu(s_op->req->u.chdirent.dirent_handle),
+ attr_p->u.dir.dist_dir_attr.tree_height,
+ attr_p->u.dir.dist_dir_attr.num_servers,
+ attr_p->u.dir.dist_dir_attr.bitmap_size,
+ attr_p->u.dir.dist_dir_attr.split_size,
+ attr_p->u.dir.dist_dir_attr.server_no,
+ attr_p->u.dir.dist_dir_attr.branch_level);
+
+ /* allocate space for dirdata bitmap */
+ attr_p->u.dir.dirdata_handles = NULL;
+ attr_p->u.dir.dist_dir_bitmap =
+ malloc(attr_p->u.dir.dist_dir_attr.bitmap_size *
+ sizeof(PVFS_dist_dir_bitmap_basetype));
+ if(!attr_p->u.dir.dist_dir_bitmap)
+ {
+ js_p->error_code = -PVFS_ENOMEM;
+ return SM_ACTION_COMPLETE;
+ }
+
+ /* set up attr->mask */
+ attr_p->mask |= PVFS_ATTR_DIR_DISTDIR_ATTR;
+
+ /* set up key and value structures for reading dirdata bitmap */
+ s_op->key.buffer = Trove_Common_Keys[DIST_DIRDATA_BITMAP_KEY].key;
+ s_op->key.buffer_sz = Trove_Common_Keys[DIST_DIRDATA_BITMAP_KEY].size;
+ if(s_op->free_val)
+ {
+ free(s_op->val.buffer);
+ }
+
+ s_op->val.buffer = attr_p->u.dir.dist_dir_bitmap;
+ s_op->val.buffer_sz =
+ attr_p->u.dir.dist_dir_attr.bitmap_size *
+ sizeof(PVFS_dist_dir_bitmap_basetype);
+ s_op->free_val = 0; /* will be freed in PINT_free_object_attr*/
+
+ js_p->error_code = 0;
+ gossip_debug(GOSSIP_SERVER_DEBUG,
+ " trying to read dirdata bitmap (coll_id = %d, "
+ "handle = %llu, key = %s (%d), val_buf = %p (%d))\n",
+ s_op->req->u.chdirent.fs_id, llu(s_op->req->u.chdirent.dirent_handle),
+ (char *)s_op->key.buffer, s_op->key.buffer_sz,
+ s_op->val.buffer, s_op->val.buffer_sz);
+
+ ret = job_trove_keyval_read(
+ s_op->req->u.chdirent.fs_id, s_op->req->u.chdirent.dirent_handle,
+ &s_op->key, &s_op->val,
+ 0,
+ NULL, smcb, 0, js_p,
+ &j_id, server_job_context, s_op->req->hints);
+
+ return ret;
+}
+
+
+
static PINT_sm_action chdirent_read_directory_entry(
struct PINT_smcb *smcb, job_status_s *js_p)
{
struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
int ret = -PVFS_EINVAL;
job_id_t j_id;
+ int i;
+ unsigned char *c;
+ PVFS_object_attr *attr_p;
+
+ attr_p = &s_op->attr;
+
+ /* gossip bitmap, since jump from get_bitmap*/
+ gossip_debug(GOSSIP_SERVER_DEBUG,
+ "chdirent: dist_dir_bitmap as:\n");
+ for(i = attr_p->u.dir.dist_dir_attr.bitmap_size - 1;
+ i >= 0 ; i--)
+ {
+ c = (unsigned char *)(attr_p->u.dir.dist_dir_bitmap + i);
+ gossip_debug(GOSSIP_SERVER_DEBUG,
+ " i=%d : %02x %02x %02x %02x\n",
+ i, c[3], c[2], c[1], c[0]);
+ }
+ gossip_debug(GOSSIP_SERVER_DEBUG, "\n");
+
+
+ /* make sure the entry belongs to the dirdata handle*/
+ PVFS_dist_dir_hash_type dirdata_hash;
+ int dirdata_server_index;
+
+ /* find the hash value and the dist dir bucket */
+ dirdata_hash = PINT_encrypt_dirdata(s_op->req->u.chdirent.entry);
+ gossip_debug(GOSSIP_SERVER_DEBUG, "chdirent: encrypt dirent %s into hash value %llu.\n",
+ s_op->req->u.chdirent.entry,
+ llu(dirdata_hash));
+
+ dirdata_server_index =
+ PINT_find_dist_dir_bucket(dirdata_hash,
+ &attr_p->u.dir.dist_dir_attr,
+ attr_p->u.dir.dist_dir_bitmap);
+ gossip_debug(GOSSIP_SERVER_DEBUG, "chdirent: selecting bucket No.%d from dist_dir_bitmap.\n",
+ dirdata_server_index);
+
+ if(dirdata_server_index !=
+ attr_p->u.dir.dist_dir_attr.server_no)
+ {
+ gossip_debug(GOSSIP_SERVER_DEBUG,
+ "chdirent: error: WRONG dirdata object for the dirent! Returning error.\n");
+
+ /* return an error to tell the client to try again */
+ js_p->error_code = -PVFS_EAGAIN;
+ return SM_ACTION_COMPLETE;
+ }
+ else
+ {
+ gossip_debug(GOSSIP_SERVER_DEBUG,
+ "chdirent: Correct dirdata object!\n");
+ }
+
gossip_debug(GOSSIP_SERVER_DEBUG,
" reading from dirent handle = %llu, name = %s\n",
@@ -174,7 +364,7 @@ static PINT_sm_action chdirent_change_di
ret = job_trove_keyval_write(
s_op->req->u.chdirent.fs_id, s_op->req->u.chdirent.dirent_handle,
&s_op->key, &s_op->val,
- TROVE_SYNC |
+ TROVE_SYNC | TROVE_KEYVAL_DIRECTORY_ENTRY |
0,
NULL, smcb, 0, js_p, &j_id, server_job_context, s_op->req->hints);
@@ -270,6 +460,9 @@ static PINT_sm_action chdirent_setup_res
static PINT_sm_action chdirent_cleanup(
struct PINT_smcb *smcb, job_status_s *js_p)
{
+ struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
+
+ PINT_free_object_attr(&s_op->attr);
return (server_state_machine_complete(smcb));
}
Index: rmdirent.sm
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/server/rmdirent.sm,v
diff -p -u -r1.57.36.5 -r1.57.36.6
--- rmdirent.sm 6 Apr 2011 21:42:07 -0000 1.57.36.5
+++ rmdirent.sm 10 Apr 2011 17:26:14 -0000 1.57.36.6
@@ -120,7 +120,7 @@ static PINT_sm_action rmdirent_get_dist_
gossip_debug(GOSSIP_SERVER_DEBUG,
" trying to read dist_dir_attr (coll_id = %d, "
"handle = %llu, key = %s (%d), val_buf = %p (%d))\n",
- s_op->u.crdirent.fs_id, llu(s_op->u.crdirent.dirent_handle),
+ s_op->req->u.rmdirent.fs_id, llu(s_op->req->u.rmdirent.dirent_handle),
(char *)s_op->key.buffer, s_op->key.buffer_sz,
s_op->val.buffer, s_op->val.buffer_sz);
More information about the Pvfs2-cvs
mailing list