[Pvfs2-cvs] commit by kunkel in pvfs2/src/server: mgmt-migrate.sm prelude.sm pvfs2-server.c pvfs2-server.h

CVS commit program cvs at parl.clemson.edu
Sat Aug 26 09:37:48 EDT 2006


Update of /projects/cvsroot/pvfs2/src/server
In directory parlweb1:/tmp/cvs-serv11028/src/server

Modified Files:
      Tag: kunkel-branch
	mgmt-migrate.sm prelude.sm pvfs2-server.c pvfs2-server.h 
Log Message:
Migration of datafiles between different servers works. Uses msgpairray.sm,
transfers only one datafile between two servers and rewrites metadata.
Todo: Adaption of request scheduler to ensure that migration and write 
I/O do not happen concurrently on source dataserver.
Also allow users to specify command line parameter which supresses
transfer of pvfs2-hints.


Index: mgmt-migrate.sm
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/server/Attic/mgmt-migrate.sm,v
diff -p -u -r1.1.2.1 -r1.1.2.2
--- mgmt-migrate.sm	22 Aug 2006 10:54:20 -0000	1.1.2.1
+++ mgmt-migrate.sm	26 Aug 2006 13:37:48 -0000	1.1.2.2
@@ -1,6 +1,6 @@
 /* 
  * (C) 2001 Clemson University and The University of Chicago 
- *
+ * I'm happy to got it this far :) (JMK)
  * See COPYING in top-level directory.
  */
 
@@ -13,35 +13,213 @@
 #include "pvfs2-attr.h"
 #include "gossip.h"
 #include "pvfs2-internal.h"
+#include "pvfs2-req-proto.h"
+#include "pint-cached-config.h"
+#include "pint-util.h"
+#include "msgpairarray.h"
 
-static int mgmt_migrate(
+extern PINT_dist basic_dist;
+
+static int migrate_decide_role(
+    PINT_server_op *s_op, job_status_s *js_p);
+
+/*****************************/    
+static int mgmt_migrate_metaserver_init(
+    PINT_server_op *s_op, job_status_s *js_p);
+static int mgmt_migrate_metaserver_notify_old_dataserver_prepare(
     PINT_server_op *s_op, job_status_s *js_p);
+static int mgmt_migrate_metaserver_find_target_handle_number(
+    PINT_server_op *s_op, job_status_s *js_p);    
+static int mgmt_migrate_metaserver_rewrite_handles(
+    PINT_server_op *s_op, job_status_s *js_p);    
+    
+/*****************************/
+static int mgmt_migrate_source_dataserver_prepare_io_write(
+    PINT_server_op *s_op, job_status_s *js_p);
+static int mgmt_migrate_source_dataserver_prepare_io_read(
+    PINT_server_op *s_op, job_status_s *js_p);
+static int mgmt_migrate_source_dataserver_flow_finished(
+    PINT_server_op *s_op, job_status_s *js_p);    
+static int mgmt_migrate_source_dataserver_wait_for_write_ack(
+    PINT_server_op *s_op, job_status_s *js_p);
+static int mgmt_migrate_source_dataserver_remove_datafile_setup(
+    PINT_server_op *s_op, job_status_s *js_p);    
+/*****************************/    
+    
 static int mgmt_migrate_cleanup(
     PINT_server_op *s_op, job_status_s *js_p);
 
+enum{
+    STATE_METASERVER = PVFS_MIGRATE_ROLE_METASERVER,
+    STATE_SOURCE_DATASERVER = PVFS_MIGRATE_ROLE_SOURCE_DATA_SERVER
+};
+
+#define STATUS_ACK_RCVD 100
+
+static int mgmt_migrate_io_start_cmp_fn(
+    void *v_p, struct PVFS_server_resp *resp_p, int index);
+    
 extern PINT_server_trove_keys_s Trove_Common_Keys[];
 
+/*
+ * Depending on role do work,
+ * logic moved to server to make it easier to implement variants.
+ * 3 different roles: metadadataserver, source data server, target data server.
+ */
+
 %%
 
 machine pvfs2_mgmt_migrate_sm(
     prelude,
-    migrate,
+    decide_role,
+    metaserver_init,
+    metaserver_read_handles,
+    metadataserver_find_target_handle_number,    
+    metaserver_notify_old_dataserver_prepare,
+    metaserver_notify_old_dataserver_prepare_xfer_msgpair,  
+    metaserver_rewrite_handles,
+    source_dataserver_prepare_io_write,
+    source_dataserver_start_io_write,
+    source_dataserver_start_io_read,
+    source_dataserver_flow_finished,
+    source_dataserver_wait_for_write_ack,
+    source_dataserver_remove_datafile_setup,
+    source_dataserver_remove_datafile_work,
     final_response,
     cleanup)
 {
     state prelude
     {
         jump pvfs2_prelude_sm;
-        success => migrate;
+        success => decide_role;
         default => final_response;
     }
 
-    state migrate
+    state decide_role
+    {
+        run migrate_decide_role;
+        STATE_METASERVER => metaserver_init;
+        STATE_SOURCE_DATASERVER => source_dataserver_prepare_io_write;
+        default => final_response;
+    }
+    
+    /*
+     * metaserver: 
+     *  protocol ongoing migration in metadata, if another migrates abort current 
+     *      migration 
+     *  notify new_dataserver about incomming message from olddataserver
+     *  notify old_dataserver to send all data to new_dataserver
+     *  migration finished, notify client done in final_response
+     *  Problem: metaserver dies while newdataserevr waits to receive msg.
+     */
+    state metaserver_init
     {
-        run mgmt_migrate;
+        run mgmt_migrate_metaserver_init;
+        success => metaserver_read_handles;
         default => final_response;
     }
 
+    state metaserver_read_handles
+    {
+        jump pvfs2_get_attr_work_sm;
+        success => metadataserver_find_target_handle_number;
+        default => final_response; 
+    }
+    
+    state metadataserver_find_target_handle_number
+    {
+        run mgmt_migrate_metaserver_find_target_handle_number;
+        success => metaserver_notify_old_dataserver_prepare;
+        default => final_response; 
+    }
+    
+    state metaserver_notify_old_dataserver_prepare
+    {
+        run mgmt_migrate_metaserver_notify_old_dataserver_prepare;
+        success => metaserver_notify_old_dataserver_prepare_xfer_msgpair;
+        default => final_response;
+    }
+   
+    
+    state metaserver_notify_old_dataserver_prepare_xfer_msgpair
+    {
+        jump pvfs2_msgpairarray_sm;
+        success => metaserver_rewrite_handles;
+        default => final_response; /* failure */
+    }
+    
+    /*
+     * Once the message pair finishes we know the datatransfer is completed.
+     */
+
+    state metaserver_rewrite_handles
+    {
+        run mgmt_migrate_metaserver_rewrite_handles;
+        default => final_response; 
+    }
+          
+    /*
+     * old dataserver: 
+     *  start client I/O sm to actually do I/O
+     *  remove file, this is necessary that no other server could possibly
+     *  do I/O with the deprecated file. Write ops are stalled.
+     *  send ack to meta server via final response, now all data is written.
+     */
+    state source_dataserver_prepare_io_write
+    {
+        run mgmt_migrate_source_dataserver_prepare_io_write;
+        success => source_dataserver_start_io_write;
+        default => final_response;
+    }
+    
+    state source_dataserver_start_io_write
+    {
+        jump pvfs2_msgpairarray_sm;
+        success => source_dataserver_start_io_read;
+        default => final_response;
+    }
+    
+    state source_dataserver_start_io_read
+    {
+        run mgmt_migrate_source_dataserver_prepare_io_read;
+        success => source_dataserver_flow_finished;
+        default => final_response;
+    }
+    
+    state source_dataserver_flow_finished
+    {
+        run mgmt_migrate_source_dataserver_flow_finished;
+        success => source_dataserver_wait_for_write_ack;
+        default => final_response;
+    }
+    
+    
+    state source_dataserver_wait_for_write_ack
+    {
+        run mgmt_migrate_source_dataserver_wait_for_write_ack;
+        success => source_dataserver_remove_datafile_setup;
+        default => final_response;
+    }    
+    
+    state source_dataserver_remove_datafile_setup
+    {
+        run mgmt_migrate_source_dataserver_remove_datafile_setup;
+        success => source_dataserver_remove_datafile_work;
+        default => final_response;
+    }    
+    
+    state source_dataserver_remove_datafile_work
+    {
+        jump pvfs2_remove_work_sm;
+        default => final_response;
+    }  
+    
+    /*
+     * target dataserver:
+     *  does a normal I/O write from source !
+     */
+     
+     /**********************/
     state final_response
     {
         jump pvfs2_final_response_sm;
@@ -57,19 +235,505 @@ machine pvfs2_mgmt_migrate_sm(
 
 %%
 
-static int mgmt_migrate(
+
+
+/***************/
+
+static int mgmt_migrate_source_dataserver_prepare_io_write(
+    PINT_server_op *s_op, job_status_s *js_p){
+    PVFS_BMI_addr_t  target_dataserver;
+    int ret;
+    PINT_sm_msgpair_state *msg_p = NULL;
+    PVFS_handle handle = s_op->req->u.mgmt_migrate.new_datafile_handle;
+    PVFS_fs_id  fs_id = s_op->req->u.mgmt_migrate.fs_id ;
+    struct filesystem_configuration_s* cur_fs = NULL;
+    struct server_configuration_s *server_config = NULL;
+
+    js_p->error_code = 0; 
+    s_op->u.mgmt_migrate.file_size = s_op->ds_attr.b_size;
+    gossip_debug(GOSSIP_SERVER_DEBUG, 
+        "mgmt_migrate_source_dataserver_prepare_io_write, file size: %lld\n", 
+        lld(s_op->u.mgmt_migrate.file_size));
+
+    ret = PINT_cached_config_map_to_server( & target_dataserver,
+        handle, fs_id );
+    if( ret != 0)
+    {
+        js_p->error_code = ret;
+        return 1;        
+    }
+
+    server_config = get_server_config_struct();
+    cur_fs = PINT_config_find_fs_id(server_config, fs_id);
+    
+    PINT_init_msgpair(s_op, msg_p);
+    
+    ret = PVFS_Request_contiguous(s_op->u.mgmt_migrate.file_size, PVFS_BYTE, 
+        & s_op->u.mgmt_migrate.file_request);
+    if (ret < 0)
+    {
+        gossip_err("Error: PVFS_Request_contiguous failure\n");
+        return (ret);
+    }
+        
+    /*
+     * start I/O
+     */
+    PINT_SERVREQ_IO_FILL(
+        msg_p->req,
+        s_op->req->credentials,
+        fs_id,
+        handle,
+        PVFS_IO_WRITE,
+        cur_fs->flowproto,
+        /*
+        s_op->req->u.mgmt_migrate.server_nr, 
+        s_op->req->u.mgmt_migrate.server_ct,
+        s_op->req->u.mgmt_migrate.io_dist,
+        */
+        0,
+        1,
+        & basic_dist,
+        s_op->u.mgmt_migrate.file_request,
+        0, /* sm_p->u.io.file_req_offset */
+        s_op->u.mgmt_migrate.file_size,
+        s_op->req->hints);
+       
+    msg_p->fs_id = fs_id;
+    msg_p->handle = handle;
+    msg_p->retry_flag = PVFS_MSGPAIR_RETRY;
+    msg_p->comp_fn =  mgmt_migrate_io_start_cmp_fn;    
+    msg_p->svr_addr = target_dataserver;
+    
+    s_op->u.mgmt_migrate.write_ack.recv_id = -1;
+    return 1;
+}
+
+static int mgmt_migrate_io_start_cmp_fn(
+    void *v_p, struct PVFS_server_resp *resp_p, int index)
+{
+    assert(resp_p->op == PVFS_SERV_IO);
+
+    if (resp_p->status == 0)
+    {
+       if( resp_p->u.io.bstream_size != 0 )
+       {
+            gossip_err("mgmt_migrate_io_start_cmp_fn: io filesize of new file != 0\n");
+            return -PVFS_EBADF;
+       } 
+    }
+    
+    return resp_p->status;
+}
+    
+static int mgmt_migrate_source_dataserver_prepare_io_read(
+    PINT_server_op *s_op, job_status_s *js_p){
+    PVFS_BMI_addr_t  source_dataserver;
+    PVFS_BMI_addr_t  target_dataserver;
+    int ret;
+    job_id_t tmp_id;
+    PVFS_handle handle = s_op->req->u.mgmt_migrate.old_datafile_handle;
+    PVFS_fs_id  fs_id = s_op->req->u.mgmt_migrate.fs_id ;
+    struct filesystem_configuration_s* cur_fs = NULL;
+    struct server_configuration_s *server_config = NULL;
+    PINT_server_sm_recv_state * write_ack;
+    struct PINT_server_mgmt_migrate * migrate;
+    migrate =& s_op->u.mgmt_migrate;
+
+    js_p->error_code = 0; 
+    migrate->file_size = s_op->ds_attr.b_size;
+    gossip_debug(GOSSIP_SERVER_DEBUG, 
+        "mgmt_migrate_source_dataserver_prepare_io_read, file size: %lld\n", 
+        lld(migrate->file_size));
+
+    ret = PINT_cached_config_map_to_server( & target_dataserver,
+        s_op->req->u.mgmt_migrate.new_datafile_handle, fs_id );
+    if( ret != 0)
+    {
+        js_p->error_code = ret;
+        return 1;        
+    }
+
+    ret = PINT_cached_config_map_to_server( & source_dataserver,
+        handle, fs_id );
+    if( ret != 0)
+    {
+        js_p->error_code = ret;
+        return 1;        
+    }
+    
+    server_config = get_server_config_struct();
+    cur_fs = PINT_config_find_fs_id(server_config, fs_id);
+        
+    /*
+     * pre-post final write ACK
+     */
+     
+   write_ack = & migrate->write_ack;
+   
+   write_ack->max_resp_sz = PINT_encode_calc_max_size(
+        PINT_ENCODE_RESP, PVFS_SERV_WRITE_COMPLETION,
+        cur_fs->encoding);
+   write_ack->encoded_resp_p = BMI_memalloc(
+        target_dataserver, write_ack->max_resp_sz,
+        BMI_RECV);
+
+    if (!write_ack->encoded_resp_p)
+    {
+        gossip_err("BMI_memalloc (for write ack) failed\n");
+        js_p->error_code = -PVFS_ENOMEM;
+        return 1;
+    }
+
+    /*
+       pre-post this recv with an infinite timeout and adjust it
+       after the flow completes since we don't know how long a flow
+       can take at this point
+       */ 
+    write_ack->address = target_dataserver;
+    
+    ret = job_bmi_recv(
+        target_dataserver, write_ack->encoded_resp_p,
+        write_ack->max_resp_sz, s_op->msgpair.session_tag,
+        BMI_PRE_ALLOC, s_op, STATUS_ACK_RCVD,
+        & write_ack->recv_status, & write_ack->recv_id,
+        server_job_context, JOB_TIMEOUT_INF);
+
+    if (ret < 0)
+    {
+        gossip_err("job_bmi_recv (write ack) failed\n");
+        js_p->error_code = ret;
+        return 1;
+    }     
+    
+
+    /*
+     * prepare flow to disk !
+     */
+
+    /* must reset the error_code and internal PINT_distribute fields
+     * in case of a retry */
+    migrate->flow_d = PINT_flow_alloc();
+    if (!migrate->flow_d)
+    {
+        js_p->error_code = -PVFS_ENOMEM;
+        return 1;
+    }
+    
+    migrate->flow_d->file_data.fsize = migrate->file_size;
+    migrate->flow_d->file_data.dist = & basic_dist;
+    migrate->flow_d->file_data.server_nr = 0;
+    migrate->flow_d->file_data.server_ct = 1; /*s_op->req->u.mgmt_migrate.server_ct*/
+
+    migrate->flow_d->file_req = migrate->file_request;
+    migrate->flow_d->file_req_offset = 0;
+
+    /*migrate->flow_d->mem_req = migrate->file_request;*/
+
+    migrate->flow_d->tag = s_op->msgpair.session_tag;
+    migrate->flow_d->type = cur_fs->flowproto;
+    migrate->flow_d->user_ptr = NULL;
+
+    gossip_debug(GOSSIP_IO_DEBUG, "Migration start flow bstream_size=%lld, "
+                "datafile handle:%lld nr=%d, ct=%d, file_req_off = %lld\n",
+                 lld(migrate->flow_d->file_data.fsize),
+                 lld(handle),
+                 migrate->flow_d->file_data.server_nr,
+                 migrate->flow_d->file_data.server_ct,
+                 lld(migrate->flow_d->file_req_offset));
+
+    migrate->flow_d->file_data.extend_flag = 0;
+    
+    migrate->flow_d->src.endpoint_id = TROVE_ENDPOINT;
+    migrate->flow_d->src.u.trove.handle = handle;
+    migrate->flow_d->src.u.trove.coll_id = fs_id;
+    migrate->flow_d->dest.endpoint_id = BMI_ENDPOINT;
+    migrate->flow_d->dest.u.bmi.address = target_dataserver;
+
+    /* pick up any buffer settings overrides from fs conf */
+    migrate->flow_d->buffer_size = cur_fs->fp_buffer_size;
+    migrate->flow_d->buffers_per_flow = cur_fs->fp_buffers_per_flow;
+    migrate->flow_d->aggregate_size = migrate->file_size;
+    
+    ret = job_flow(
+        migrate->flow_d, s_op, 0,
+        js_p, &tmp_id,
+        server_job_context,
+        server_config->server_job_flow_timeout);
+
+    return ret;
+}
+
+static int mgmt_migrate_source_dataserver_flow_finished(
+    PINT_server_op *s_op, job_status_s *js_p)
+{
+    PINT_server_sm_recv_state * write_ack;
+    write_ack = & s_op->u.mgmt_migrate.write_ack;
+        
+    gossip_debug(GOSSIP_SERVER_DEBUG, 
+        "mgmt_migrate_source_dataserver_flow_finished transferred:%lld\n",
+         s_op->u.mgmt_migrate.flow_d->total_transferred);
+    
+    if( s_op->u.mgmt_migrate.flow_d->total_transferred != 
+        s_op->u.mgmt_migrate.file_size )
+    {
+        gossip_err(
+        "mgmt_migrate_source_dataserver_flow_finished with errors transferred:%lld" 
+        " of %lld bytes\n",
+         s_op->u.mgmt_migrate.flow_d->total_transferred,
+         s_op->u.mgmt_migrate.file_size);        
+    }
+        
+    if (s_op->u.mgmt_migrate.flow_d->error_code != 0)
+    {
+        js_p->error_code = s_op->u.mgmt_migrate.flow_d->error_code;
+        gossip_debug(GOSSIP_SERVER_DEBUG, 
+            "Migrate flow desc error: %d\n",(js_p->error_code));
+       return 1;
+    }
+    
+    return 0;
+}
+
+
+static int mgmt_migrate_source_dataserver_wait_for_write_ack(
+    PINT_server_op *s_op, job_status_s *js_p)
+{
+    int ret;
+    struct PINT_decoded_msg decoded_resp;
+    PINT_server_sm_recv_state * write_ack;
+    write_ack = & s_op->u.mgmt_migrate.write_ack;
+    
+    gossip_debug(GOSSIP_SERVER_DEBUG, 
+        "mgmt_migrate_source_dataserver_wait_for_write_ack\n");
+        
+    ret = PINT_decode(write_ack->encoded_resp_p, PINT_DECODE_RESP,
+                  & decoded_resp, /* holds data on decoded resp */
+                  write_ack->address, write_ack->max_resp_sz);
+
+    if (ret != 0)
+    {
+        PVFS_perror_gossip("msgpairarray decode error", ret);
+    }
+    js_p->error_code = ret;
+    
+    assert(js_p->status_user_tag == STATUS_ACK_RCVD);
+    
+    if( write_ack->recv_status.error_code != 0 )
+    {
+        gossip_debug(GOSSIP_SERVER_DEBUG, 
+            "mgmt_migrate_source_dataserver_wait_for_write_ack error code:%d\n",
+                write_ack->recv_status.error_code);    
+         js_p->error_code = write_ack->recv_status.error_code;
+    }
+    
+    PINT_decode_release(& decoded_resp, PINT_DECODE_RESP);
+                
+    return 1;
+}
+
+static int mgmt_migrate_source_dataserver_remove_datafile_setup(
     PINT_server_op *s_op, job_status_s *js_p)
 {
-    int ret = -PVFS_EINVAL;
+    gossip_debug(GOSSIP_SERVER_DEBUG, 
+        "mgmt_migrate_source_dataserver_remove_datafile_setup\n");
+    s_op->u.remove.handle = s_op->req->u.mgmt_migrate.old_datafile_handle;
+    s_op->u.remove.fs_id = s_op->req->u.mgmt_migrate.fs_id;
+    js_p->error_code = 0;
+
+    return 1;
+}
+
+/***************/
+static int mgmt_migrate_metaserver_init(
+    PINT_server_op *s_op, job_status_s *js_p){
+    js_p->error_code = 0; 
+    gossip_debug(GOSSIP_SERVER_DEBUG, "mgmt_migrate_metaserver_init\n");
+    
+    PINT_init_msgarray_params_server(&s_op->msgarray_params);
+    
+    s_op->u.getattr.handle = s_op->req->u.mgmt_migrate.metafile_handle;
+    s_op->u.getattr.fs_id = s_op->req->u.mgmt_migrate.fs_id;
+    s_op->u.getattr.attrmask = PVFS_ATTR_META_DFILES | PVFS_ATTR_META_DIST;
+    
+    return 1;         
+}
+
+static int mgmt_migrate_metaserver_find_target_handle_number(
+    PINT_server_op *s_op, job_status_s *js_p)
+{
+    int i;
+    i = PINT_copy_object_attr(& s_op->attr, & s_op->resp.u.getattr.attr);
+    PINT_free_object_attr(& s_op->resp.u.getattr.attr);
+    if( i != 0 )
+    {
+        js_p->error_code = i;
+        return 1;
+    }
+    
+    assert(s_op->attr.u.meta.dist);
+    assert(s_op->attr.u.meta.dfile_count);
+    assert(s_op->attr.u.meta.dfile_array);
+    
+    js_p->error_code = 0;
+
+    gossip_debug(GOSSIP_SERVER_DEBUG,
+                 "migrate state: mgmt_migrate_metaserver_find_target_handle_number\n");    
+    /*
+     * lookup old handle:
+     */
+         
+    for(i=0; i < s_op->attr.u.meta.dfile_count ; i++)
+    {
+        if (s_op->attr.u.meta.dfile_array[i] == 
+            s_op->req->u.mgmt_migrate.old_datafile_handle)
+        {
+            
+            gossip_debug(GOSSIP_SERVER_DEBUG,
+                 "Migration found datafile on pos %i with new datafile\n", i);
+            s_op->u.mgmt_migrate.dfile_to_replace = i;
+            break;
+        }
+    }    
+    if ( i == s_op->attr.u.meta.dfile_count)
+    {
+        /*
+         * This should never happen !
+         */
+        gossip_err("Could not find datafile %lld for migration in metafile: %lld!\n",
+                   s_op->req->u.mgmt_migrate.old_datafile_handle,
+                   s_op->req->u.mgmt_migrate.metafile_handle);
+        js_p->error_code = -PVFS_EINVAL;
+    }
+    
+    return 1;  
+}    
+
+
+static int mgmt_migrate_metaserver_notify_old_dataserver_prepare(
+    PINT_server_op *s_op, job_status_s *js_p){
+    PINT_sm_msgpair_state *msg_p = NULL;
+    PVFS_BMI_addr_t  old_dataserver;
+    int ret;
+    
+    js_p->error_code = 0;
+    gossip_debug(GOSSIP_SERVER_DEBUG,
+                 "migrate state: mgmt_migrate_metaserver_notify_old_dataserver_prepare\n");
+    PVFS_handle handle = s_op->req->u.mgmt_migrate.old_datafile_handle;
+    PVFS_fs_id  fs_id = s_op->req->u.mgmt_migrate.fs_id ;
+
+    ret = PINT_cached_config_map_to_server( & old_dataserver,
+        handle, fs_id);
+    if( ret != 0)
+    {
+        js_p->error_code = ret;
+        return 1;        
+    }
+    
+    PINT_init_msgpair(s_op, msg_p);
+
+    PINT_SERVREQ_MGMT_MIGRATE_FILL(
+        msg_p->req,
+        s_op->req->credentials,
+        fs_id,
+        s_op->req->u.mgmt_migrate.metafile_handle,
+        s_op->req->u.mgmt_migrate.old_datafile_handle,
+        s_op->req->u.mgmt_migrate.new_datafile_handle,
+        PVFS_MIGRATE_ROLE_SOURCE_DATA_SERVER,
+        /*s_op->u.mgmt_migrate.dfile_to_replace,
+        s_op->attr.u.meta.dfile_count,
+        s_op->attr.u.meta.dist,*/
+        s_op->req->hints);
+            
+    msg_p->fs_id = fs_id;
+    msg_p->handle = s_op->req->u.mgmt_migrate.new_datafile_handle;
+    msg_p->retry_flag = PVFS_MSGPAIR_RETRY;
+    msg_p->comp_fn =  NULL;    
+    msg_p->svr_addr = old_dataserver;
+    return 1;         
+}
+
+
+static int mgmt_migrate_metaserver_rewrite_handles(
+    PINT_server_op *s_op, job_status_s *js_p)
+{
+    int ret = 0;
     job_id_t j_id;
+    
+    js_p->error_code = 0;
 
+    gossip_debug(GOSSIP_SERVER_DEBUG,
+                 "migrate state: mgmt_migrate_metaserver_rewrite_handles\n");    
 
-    return ret;
+    s_op->attr.u.meta.dfile_array[s_op->u.mgmt_migrate.dfile_to_replace] = 
+                s_op->req->u.mgmt_migrate.new_datafile_handle;
+
+    /* set up key and value structure for keyval write */
+    s_op->key.buffer = Trove_Common_Keys[METAFILE_HANDLES_KEY].key;
+    s_op->key.buffer_sz = Trove_Common_Keys[METAFILE_HANDLES_KEY].size;
+    
+    s_op->val.buffer = s_op->attr.u.meta.dfile_array;
+    s_op->val.buffer_sz =  
+        s_op->attr.u.meta.dfile_count * sizeof(PVFS_handle);    
+
+    ret = job_trove_keyval_write(
+        s_op->req->u.mgmt_migrate.fs_id, 
+        s_op->req->u.mgmt_migrate.metafile_handle,
+        &(s_op->key), &(s_op->val),
+        TROVE_SYNC,
+        NULL, s_op, 0, js_p, &j_id, server_job_context);
+    
+    return ret;  
+}    
+    
+/***************/
+    
+static int migrate_decide_role(
+    PINT_server_op *s_op, job_status_s *js_p)
+{
+    gossip_debug(GOSSIP_SERVER_DEBUG, "mgmt_migrate decide role: %d\n",
+                     llu(s_op->req->u.mgmt_migrate.role));    
+                     
+    js_p->error_code = s_op->req->u.mgmt_migrate.role;
+    return 1;
 }
 
+
+
 static int mgmt_migrate_cleanup(
     PINT_server_op *s_op, job_status_s *js_p)
 {
+    gossip_debug(GOSSIP_SERVER_DEBUG, "mgmt_migrate_cleanup role: %d \n",
+        s_op->req->u.mgmt_migrate.role );
+    if ( s_op->req->u.mgmt_migrate.role == PVFS_MIGRATE_ROLE_METASERVER )
+    {
+        PINT_free_object_attr(& s_op->attr);
+    }else if(s_op->req->u.mgmt_migrate.role == PVFS_MIGRATE_ROLE_SOURCE_DATA_SERVER &&
+        s_op->u.mgmt_migrate.file_request != 0 )
+    {
+        PVFS_Request_free(& s_op->u.mgmt_migrate.file_request);
+    
+        if (s_op->u.mgmt_migrate.flow_d != 0)
+        {
+            if (s_op->u.mgmt_migrate.flow_d->error_code != 0)
+            {
+                js_p->error_code = s_op->u.mgmt_migrate.flow_d->error_code;
+                gossip_debug(GOSSIP_SERVER_DEBUG, 
+                    "cleanup migrate flow desc error: %d\n",(js_p->error_code));
+            }
+            PINT_flow_free(s_op->u.mgmt_migrate.flow_d);
+        }
+        
+        if( s_op->u.mgmt_migrate.write_ack.recv_id != -1 )
+        {
+            gossip_debug(GOSSIP_SERVER_DEBUG, "cleanup migrate bmi cancel recv\n");
+            job_bmi_cancel(s_op->u.mgmt_migrate.write_ack.recv_id, 
+                server_job_context);
+        }
+    }
+    
+    
+
     return(server_state_machine_complete(s_op));
 }
 

Index: prelude.sm
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/server/prelude.sm,v
diff -p -u -r1.60 -r1.60.6.1
--- prelude.sm	28 May 2006 16:52:08 -0000	1.60
+++ prelude.sm	26 Aug 2006 13:37:48 -0000	1.60.6.1
@@ -264,7 +264,7 @@ static int prelude_perm_check(
 		 */
 		js_p->error_code = 0;
 	    }
-            else /* setattr, seteattr, seteattr_list */
+            else /* setattr, seteattr, seteattr_list, migration */
             {
                 /*
                   NOTE: on other file systems, setattr doesn't

Index: pvfs2-server.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/server/pvfs2-server.c,v
diff -p -u -r1.218.2.6 -r1.218.2.7
--- pvfs2-server.c	22 Aug 2006 10:54:20 -0000	1.218.2.6
+++ pvfs2-server.c	26 Aug 2006 13:37:48 -0000	1.218.2.7
@@ -408,7 +408,7 @@ struct PINT_server_req_params PINT_serve
     {PVFS_SERV_MGMT_MIGRATE,
         "mgmt_migrate",
         PINT_SERVER_CHECK_ATTR,
-        PINT_SERVER_ATTRIBS_NOT_REQUIRED,
+        PINT_SERVER_ATTRIBS_REQUIRED,
         &pvfs2_mgmt_migrate_sm},      
 };
 

Index: pvfs2-server.h
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/server/pvfs2-server.h,v
diff -p -u -r1.135.2.2 -r1.135.2.3
--- pvfs2-server.h	22 Aug 2006 10:54:20 -0000	1.135.2.2
+++ pvfs2-server.h	26 Aug 2006 13:37:48 -0000	1.135.2.3
@@ -255,6 +255,29 @@ struct PINT_server_remove_op
     PVFS_ds_keyval_handle_info keyval_handle_info;
 };
 
+typedef struct PINT_server_sm_recv_state_s
+{
+    int max_resp_sz;
+    void *encoded_resp_p;
+    job_id_t recv_id;
+    job_status_s recv_status;
+    PVFS_BMI_addr_t address;
+} PINT_server_sm_recv_state;
+
+struct PINT_server_mgmt_migrate
+{
+    /* metaserver */
+    int32_t                     dfile_to_replace;  
+    
+    /* dataserver */
+    
+    PVFS_size                   file_size;
+    PVFS_Request                file_request;
+    PINT_server_sm_recv_state   write_ack;
+
+    flow_descriptor            *flow_d;    
+};
+
 struct PINT_server_mgmt_remove_dirent_op
 {
     PVFS_handle dirdata_handle;
@@ -381,18 +404,19 @@ typedef struct PINT_server_op
 	/* request-specific scratch spaces for use during processing */
         struct PINT_server_eattr_op eattr;
         struct PINT_server_getattr_op getattr;
-	struct PINT_server_getconfig_op getconfig;
-	struct PINT_server_lookup_op lookup;
-	struct PINT_server_crdirent_op crdirent;
-	struct PINT_server_readdir_op readdir;
-	struct PINT_server_remove_op remove;
-	struct PINT_server_chdirent_op chdirent;
-	struct PINT_server_rmdirent_op rmdirent;
-	struct PINT_server_io_op io;
+    	struct PINT_server_getconfig_op getconfig;
+    	struct PINT_server_lookup_op lookup;
+    	struct PINT_server_crdirent_op crdirent;
+    	struct PINT_server_readdir_op readdir;
+    	struct PINT_server_remove_op remove;
+    	struct PINT_server_chdirent_op chdirent;
+    	struct PINT_server_rmdirent_op rmdirent;
+    	struct PINT_server_io_op io;
         struct PINT_server_small_io_op small_io;
-	struct PINT_server_flush_op flush;
-	struct PINT_server_truncate_op truncate;
-	struct PINT_server_mkdir_op mkdir;
+    	struct PINT_server_flush_op flush;
+    	struct PINT_server_truncate_op truncate;
+    	struct PINT_server_mkdir_op mkdir;
+        struct PINT_server_mgmt_migrate mgmt_migrate;
         struct PINT_server_mgmt_remove_dirent_op mgmt_remove_dirent;
         struct PINT_server_mgmt_get_dirdata_op mgmt_get_dirdata_handle;
     } u;



More information about the Pvfs2-cvs mailing list