Changeset 8660

Show
Ignore:
Timestamp:
12/13/10 16:17:00 (2 years ago)
Author:
shuangy
Message:

1. sys-getattr only contact active dirdata servers. 2. cleanup mkdir. 3. fix a memory leak in PINT_free_object_attr.

Location:
branches/Orange-Elaine-Distr-Dir-Branch/src
Files:
7 modified

Legend:

Unmodified
Added
Removed
  • branches/Orange-Elaine-Distr-Dir-Branch/src/client/sysint/client-state-machine.h

    r8640 r8660  
    477477     * now only used with sys-readdir.sm */ 
    478478    int keep_size_array;  
     479    int *active_dirdata_index; 
    479480 
    480481    PVFS_size * size_array; 
  • branches/Orange-Elaine-Distr-Dir-Branch/src/client/sysint/sys-getattr.sm

    r8640 r8660  
    2525#include "pvfs2-internal.h" 
    2626#include "pvfs2-types-debug.h" 
     27#include "dist-dir-utils.h" 
    2728 
    2829/* pvfs2_client_getattr_sm 
     
    705706        { 
    706707            uint32_t dirent_file_count_i; 
     708            int tmp_i; 
     709            unsigned char *c; 
    707710 
    708711            /* dirent_count will be collected later */ 
     
    711714                "dfile_count = %d " 
    712715                "dist_name_len = %d " 
    713                 "dist_params_len = %d ", 
    714                 /* "dirent_count = %llu ", */ 
     716                "dist_params_len = %d\n ", 
    715717                attr, 
    716718                attr->u.dir.hint.dfile_count, 
    717719                attr->u.dir.hint.dist_name_len, 
    718720                attr->u.dir.hint.dist_params_len); 
    719                 /* llu(attr->u.dir.dirent_count) */ 
    720721 
    721722            if(attr->mask & PVFS_ATTR_DIR_DISTDIR_ATTR) 
    722723            { 
     724 
     725                gossip_debug(GOSSIP_CLIENT_DEBUG,  
     726                        "sys-getattr: dist-dir-attr " 
     727                        "with tree_height=%d, num_servers=%d, bitmap_size=%d, " 
     728                        "split_size=%d, server_no=%d and branch_level=%d\n", 
     729                        attr->u.dir.dist_dir_attr.tree_height, 
     730                        attr->u.dir.dist_dir_attr.num_servers, 
     731                        attr->u.dir.dist_dir_attr.bitmap_size, 
     732                        attr->u.dir.dist_dir_attr.split_size, 
     733                        attr->u.dir.dist_dir_attr.server_no, 
     734                        attr->u.dir.dist_dir_attr.branch_level); 
     735 
     736                /* gossip bitmap */ 
    723737                gossip_debug(GOSSIP_CLIENT_DEBUG, 
    724                         "dirdata_server_count = %d\n", 
    725                         attr->u.dir.dist_dir_attr.num_servers); 
    726  
    727                 /* !!! change more later */ 
     738                        "sys-getattr: dist_dir_bitmap as:\n"); 
     739                for(tmp_i = attr->u.dir.dist_dir_attr.bitmap_size - 1; 
     740                        tmp_i >= 0 ; tmp_i--) 
     741                { 
     742                    c = (unsigned char *)(attr->u.dir.dist_dir_bitmap + tmp_i); 
     743                    gossip_debug(GOSSIP_MKDIR_DEBUG, 
     744                            " i=%d : %02x %02x %02x %02x\n", 
     745                            tmp_i, c[3], c[2], c[1], c[0]); 
     746                } 
     747                gossip_debug(GOSSIP_CLIENT_DEBUG, "\n"); 
     748 
     749                /* gossip dirdata handles */ 
     750                gossip_debug(GOSSIP_CLIENT_DEBUG, 
     751                        "sys-getattr: dirdata_handles as:\n"); 
    728752                for (dirent_file_count_i = 0; 
    729753                        dirent_file_count_i <  
     
    12371261    PVFS_object_attr *attr = NULL; 
    12381262    PINT_sm_msgpair_state *msg_p = NULL; 
     1263    int tmp_index, cur_index; 
    12391264 
    12401265    js_p->error_code = 0; 
     
    12491274            attr->u.dir.dist_dir_attr.num_servers); 
    12501275 
     1276    sm_p->getattr.active_dirdata_index = (int *)malloc( 
     1277            sizeof(*sm_p->getattr.active_dirdata_index) * 
     1278            attr->u.dir.dist_dir_attr.num_servers); 
     1279 
     1280    if(!sm_p->getattr.active_dirdata_index) 
     1281    { 
     1282        js_p->error_code = -PVFS_ENOMEM; 
     1283        return SM_ACTION_COMPLETE; 
     1284    } 
     1285 
     1286 
     1287    /* find out active dirdata handles */ 
     1288    tmp_index = 0; 
     1289    for(i=0; i<attr->u.dir.dist_dir_attr.num_servers; i++) 
     1290    { 
     1291        if(PINT_is_dist_dir_bucket_active(&attr->u.dir.dist_dir_attr, 
     1292                    attr->u.dir.dist_dir_bitmap, i)) 
     1293        { 
     1294            sm_p->getattr.active_dirdata_index[tmp_index] = i; 
     1295            tmp_index++; 
     1296        } 
     1297    } 
     1298    assert(tmp_index > 0); 
     1299 
    12511300    /* initialize msgpair array */ 
    12521301    ret = PINT_msgpairarray_init(&sm_p->msgarray_op,  
    1253             attr->u.dir.dist_dir_attr.num_servers); 
     1302            tmp_index); 
    12541303    if(ret != 0) 
    12551304    { 
     
    12611310    foreach_msgpair(&sm_p->msgarray_op, msg_p, i) 
    12621311    { 
     1312        cur_index = sm_p->getattr.active_dirdata_index[i]; 
    12631313 
    12641314        gossip_debug(GOSSIP_CLIENT_DEBUG, 
    1265                      "getattr: posting dirdata getattr[%d] (%lld,%d)\n", 
    1266                      i, llu(attr->u.dir.dirdata_handles[i]), 
     1315                     "getattr: posting dirdata getattr[%d] ([%d]:%lld,%d)\n", 
     1316                     i, cur_index, 
     1317                     llu(attr->u.dir.dirdata_handles[cur_index]), 
    12671318                     sm_p->getattr.object_ref.fs_id); 
    12681319 
     
    12711322            *sm_p->cred_p, 
    12721323            sm_p->getattr.object_ref.fs_id, 
    1273             attr->u.dir.dirdata_handles[i], 
     1324            attr->u.dir.dirdata_handles[cur_index], 
    12741325            PVFS_ATTR_COMMON_ALL|PVFS_ATTR_DIR_DIRENT_COUNT, /* only interested in timestamp and dirent_count */ 
    12751326            sm_p->hints); 
     
    12771328        /* fill in msgpair structure components */ 
    12781329        msg_p->fs_id = sm_p->getattr.object_ref.fs_id; 
    1279         msg_p->handle = attr->u.dir.dirdata_handles[i]; 
     1330        msg_p->handle = attr->u.dir.dirdata_handles[cur_index]; 
    12801331        msg_p->retry_flag = PVFS_MSGPAIR_RETRY; 
    12811332        msg_p->comp_fn = getattr_dirdata_getattr_comp_fn; 
     
    13051356    PVFS_object_attr *attr_p = NULL; 
    13061357    PVFS_object_attr *resp_attr_p = NULL; 
     1358    int cur_index; 
    13071359 
    13081360    gossip_debug(GOSSIP_GETATTR_DEBUG, 
     
    13201372    attr_p = &sm_p->getattr.attr; 
    13211373    resp_attr_p = &resp_p->u.getattr.attr; 
     1374    cur_index = sm_p->getattr.active_dirdata_index[index]; 
    13221375 
    13231376    assert(resp_attr_p->objtype == PVFS_TYPE_DIRDATA); 
    13241377    /* also assert timestamp? */ 
    13251378    assert(resp_attr_p->mask & PVFS_ATTR_DIR_DIRENT_COUNT); 
    1326  
    1327     gossip_debug(GOSSIP_CLIENT_DEBUG, "dirdata getattr[%d] returns attrs: " 
     1379    assert( (cur_index >= 0) &&  
     1380            (cur_index < attr_p->u.dir.dist_dir_attr.num_servers)); 
     1381 
     1382    gossip_debug(GOSSIP_CLIENT_DEBUG, "dirdata getattr[%d] (#[%d]) returns attrs: " 
    13281383            "[dirent_count=%llu, atime = %llu, mtime = %llu, ctime = %llu]\n", 
    1329             index,  
     1384            index, cur_index, 
    13301385            llu(resp_attr_p->u.dir.dirent_count), 
    13311386            llu(resp_attr_p->atime), 
     
    13341389 
    13351390    /* update timestamp and dirent_count */ 
    1336     sm_p->getattr.size_array[index] = resp_attr_p->u.dir.dirent_count;  
     1391    sm_p->getattr.size_array[cur_index] = resp_attr_p->u.dir.dirent_count;  
    13371392    attr_p->u.dir.dirent_count += resp_attr_p->u.dir.dirent_count; 
    13381393    if(attr_p->atime < resp_attr_p->atime) 
     
    13671422    /* cleanup tree request */ 
    13681423    PINT_msgpairarray_destroy(&sm_p->msgarray_op); 
     1424 
     1425    if(sm_p->getattr.active_dirdata_index) 
     1426    { 
     1427        free(sm_p->getattr.active_dirdata_index); 
     1428    } 
    13691429 
    13701430    return SM_ACTION_COMPLETE; 
  • branches/Orange-Elaine-Distr-Dir-Branch/src/client/sysint/sys-readdir.sm

    r8656 r8660  
    297297    { 
    298298        readdir_reentry = 1; 
    299  
    300 #if 0 
    301         /* update dirdata_index, the comp_fn is not updating the dirdata_index */ 
    302         sm_p->u.readdir.dirdata_index +=  
    303             (sm_p->u.readdir.num_dirdata_needed - 1); 
    304         gossip_debug(GOSSIP_READDIR_DEBUG, "readdir: " 
    305                 "re-entering msg_array_setup! update dirdata_index to %d !\n",  
    306                 sm_p->u.readdir.dirdata_index); 
    307 #endif 
    308299    } 
    309300 
  • branches/Orange-Elaine-Distr-Dir-Branch/src/common/misc/dist-dir-utils.c

    r8480 r8660  
    137137} 
    138138 
     139/* functions to test whether a dirdata server is active or not.  
     140 * will return 0 if server_no is out of bound or server is inactive. 
     141 */ 
     142int PINT_is_dist_dir_bucket_active( 
     143                const PVFS_dist_dir_attr *dist_dir_attr_p,  
     144                const PVFS_dist_dir_bitmap bitmap, 
     145                const int server_no) 
     146{ 
     147    if((server_no < 0) || 
     148            (server_no >= dist_dir_attr_p->num_servers)) 
     149    { 
     150        return 0; 
     151    } 
     152 
     153    if(TST_BIT(bitmap, server_no)) 
     154    { 
     155        return 1; 
     156    } 
     157    else 
     158    { 
     159        return 0; 
     160    } 
     161 
     162} 
    139163 
    140164/* 
  • branches/Orange-Elaine-Distr-Dir-Branch/src/common/misc/dist-dir-utils.h

    r8480 r8660  
    4444                const int server_no,  
    4545                const int pre_dsg_num_server); 
     46int PINT_is_dist_dir_bucket_active( 
     47                const PVFS_dist_dir_attr *dist_dir_attr_p,  
     48                const PVFS_dist_dir_bitmap bitmap, 
     49                const int server_no);  
    4650int PINT_find_dist_dir_bucket( 
    4751                const PVFS_dist_dir_hash_type hash,  
  • branches/Orange-Elaine-Distr-Dir-Branch/src/common/misc/pint-util.c

    r8596 r8660  
    415415                attr->u.dir.hint.dist_params = NULL; 
    416416            } 
     417        } 
     418        if (attr->mask & PVFS_ATTR_DIR_DISTDIR_ATTR) 
     419        { 
    417420            if (attr->u.dir.dist_dir_bitmap) 
    418421            { 
  • branches/Orange-Elaine-Distr-Dir-Branch/src/server/mkdir.sm

    r8648 r8660  
    4242    { 
    4343        run mkdir_create_dist_dir_struct; 
    44         success => select_dirdata_servers; 
    45         default => err_msg; 
    46     } 
    47  
    48     state select_dirdata_servers 
    49     { 
    50         run mkdir_select_dirdata_servers; 
    5144        success => create_local_dirdata_dspace; 
    5245        default => err_msg; 
     
    251244        num_total_dirdata_servers; 
    252245 
    253     /* TODO: if received >0, use; else use config_file value,*/ 
     246    /* if received >0, use; else use config_file value,*/ 
    254247    if(s_op->req->u.mkdir.num_dirent_files_req > 0) 
    255248    { 
     
    323316    return SM_ACTION_COMPLETE;  
    324317} 
    325  
    326  
    327 static PINT_sm_action mkdir_select_dirdata_servers( 
    328         struct PINT_smcb *smcb, job_status_s *js_p) 
    329 { 
    330     /* 
    331     struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT); 
    332     PVFS_object_attr *attr; 
    333     */ 
    334  
    335 /* not selecting servers now, suppose has dirdata on every metadata server */ 
    336  
    337         /******** if use the function in create.sm to get server list: 
    338 * 
    339 int PINT_cached_config_get_server_list( 
    340     PVFS_fs_id fs_id, 
    341     PINT_dist *dist, 
    342     int num_dfiles_req, 
    343     PVFS_sys_layout *layout, 
    344     const char ***server_names, 
    345     int *server_count) 
    346  
    347 1. need to provide dist & layout 
    348 2. server_count might be different from num_dfiles_req, then better put create dist-dir-struct after the servers selection function. 
    349  
    350 ****************/ 
    351  
    352  
    353         return SM_ACTION_COMPLETE; 
    354  
    355 } 
    356  
    357318 
    358319