home *** CD-ROM | disk | FTP | other *** search
/ ftp.parl.clemson.edu / 2015-02-07.ftp.parl.clemson.edu.tar / ftp.parl.clemson.edu / pub / pvfs2 / orangefs-2.8.3-20110323.tar.gz / orangefs-2.8.3-20110323.tar / orangefs / src / client / sysint / sys-statfs.sm < prev    next >
Text File  |  2008-11-19  |  7KB  |  243 lines

  1. /* 
  2.  * (C) 2003 Clemson University and The University of Chicago 
  3.  *
  4.  * Changes by Acxiom Corporation to add support for nonblocking statfs
  5.  * Copyright ⌐ Acxiom Corporation, 2006.
  6.  *
  7.  * See COPYING in top-level directory.
  8.  */
  9.  
  10. /** \file
  11.  *  \ingroup sysint
  12.  *
  13.  *  PVFS2 system interface routines for statfs.
  14.  */
  15.  
  16. #include <string.h>
  17. #include <assert.h>
  18.  
  19. #include "client-state-machine.h"
  20. #include "pvfs2-debug.h"
  21. #include "job.h"
  22. #include "gossip.h"
  23. #include "str-utils.h"
  24. #include "pvfs2-mgmt.h"
  25. #include "pint-cached-config.h"
  26. #include "PINT-reqproto-encode.h"
  27.  
  28. extern job_context_id pint_client_sm_context;
  29.  
  30. %%
  31.  
  32. machine pvfs2_client_statfs_sm
  33. {
  34.     state run_nested
  35.     {
  36.         jump pvfs2_client_mgmt_statfs_list_nested_sm;
  37.         default => cleanup;
  38.     }
  39.  
  40.     state cleanup
  41.     {
  42.         run sys_statfs_cleanup;
  43.         default => terminate;
  44.     }
  45. }
  46.  
  47. %%
  48.  
  49. /** Initiate retrieval of file system statistics.
  50.  */
  51. PVFS_error PVFS_isys_statfs(
  52.     PVFS_fs_id fs_id,
  53.     const PVFS_credentials *credentials,
  54.     PVFS_sysresp_statfs *resp,
  55.     PVFS_sys_op_id *op_id,
  56.     PVFS_hint hints,
  57.     void *user_ptr)
  58. {
  59.     PINT_smcb *smcb = NULL;
  60.     PINT_client_sm *sm_p = NULL;
  61.     int ret = -1;
  62.  
  63.     gossip_debug(GOSSIP_CLIENT_DEBUG,
  64.                  "PVFS_isys_statfs entered\n");
  65.  
  66.     PINT_smcb_alloc(&smcb, PVFS_SYS_STATFS,
  67.              sizeof(struct PINT_client_sm),
  68.              client_op_state_get_machine,
  69.              client_state_machine_terminate,
  70.              pint_client_sm_context);
  71.     if (smcb == NULL)
  72.     {
  73.         return -PVFS_ENOMEM;
  74.     }
  75.     sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
  76.  
  77.     /* count the number of servers */
  78.     ret = PINT_cached_config_count_servers(
  79.         fs_id,  PVFS_MGMT_IO_SERVER|PVFS_MGMT_META_SERVER,
  80.         &sm_p->u.statfs_list.count);
  81.     if (ret < 0)
  82.     {
  83.         PINT_smcb_free(smcb);
  84.     return ret;
  85.     }
  86.  
  87.     /* allocate storage for addresses and statfs buffers */
  88.     sm_p->u.statfs_list.addr_array = (PVFS_BMI_addr_t *)malloc(
  89.         sm_p->u.statfs_list.count*sizeof(PVFS_BMI_addr_t));
  90.     if (sm_p->u.statfs_list.addr_array == NULL)
  91.     {
  92.         PINT_smcb_free(smcb);
  93.         return -PVFS_ENOMEM;
  94.     }
  95.  
  96.     sm_p->u.statfs_list.stat_array = (struct PVFS_mgmt_server_stat*)malloc(
  97.         sm_p->u.statfs_list.count*sizeof(struct PVFS_mgmt_server_stat));
  98.     if (!sm_p->u.statfs_list.stat_array)
  99.     {
  100.         free(sm_p->u.statfs_list.addr_array);
  101.         PINT_smcb_free(smcb);
  102.     return(-PVFS_ENOMEM);
  103.     }
  104.  
  105.     /* generate default list of servers */
  106.     ret = PINT_cached_config_get_server_array(
  107.         fs_id, PVFS_MGMT_IO_SERVER|PVFS_MGMT_META_SERVER,
  108.         sm_p->u.statfs_list.addr_array, &sm_p->u.statfs_list.count);
  109.     if (ret < 0)
  110.     {
  111.         free(sm_p->u.statfs_list.addr_array);
  112.         free(sm_p->u.statfs_list.stat_array);
  113.         PINT_smcb_free(smcb);
  114.     return ret;
  115.     }
  116.  
  117.     PINT_init_msgarray_params(sm_p, fs_id);
  118.     PINT_init_sysint_credentials(sm_p->cred_p, credentials);
  119.     sm_p->u.statfs_list.fs_id = fs_id;
  120.     sm_p->u.statfs_list.details = NULL;
  121.     sm_p->u.statfs_list.resp = resp;
  122.  
  123.     memset(sm_p->u.statfs_list.stat_array, 0,
  124.            (sm_p->u.statfs_list.count * sizeof(struct PVFS_mgmt_server_stat)));
  125.  
  126.     ret = PINT_msgpairarray_init(&sm_p->msgarray_op, sm_p->u.statfs_list.count);
  127.     if(ret != 0)
  128.     {
  129.         gossip_err("Failed to initialize %d msgpairs\n", sm_p->u.statfs_list.count);
  130.         return ret;
  131.     }
  132.     
  133.     PVFS_hint_copy(hints, &sm_p->hints);
  134.  
  135.     return PINT_client_state_machine_post(
  136.         smcb, op_id, user_ptr);
  137. }
  138.  
  139. /** Obtain file system statistics.
  140.  */
  141. PVFS_error PVFS_sys_statfs(
  142.     PVFS_fs_id fs_id,
  143.     const PVFS_credentials *credentials,
  144.     PVFS_sysresp_statfs* resp,
  145.     PVFS_hint hints)
  146. {
  147.     PVFS_error ret = -PVFS_EINVAL, error = 0;
  148.     PVFS_sys_op_id op_id;
  149.  
  150.     gossip_debug(GOSSIP_CLIENT_DEBUG, "PVFS_sys_statfs entered\n");
  151.  
  152.     ret = PVFS_isys_statfs(
  153.         fs_id, credentials, resp, &op_id, hints, NULL);
  154.  
  155.     if (ret)
  156.     {
  157.         PVFS_perror_gossip("PVFS_isys_statfs call", ret);
  158.         error = ret;
  159.     }
  160.     else
  161.     {
  162.         ret = PVFS_sys_wait(op_id, "statfs", &error);
  163.         if (ret)
  164.         {
  165.             PVFS_perror_gossip("PVFS_sys_wait call", ret);
  166.             error = ret;
  167.         }
  168.     }
  169.  
  170.     gossip_debug(GOSSIP_CLIENT_DEBUG,
  171.                  "PVFS_sys_statfs completed\n");
  172.  
  173.     PINT_sys_release(op_id);
  174.     return error;
  175. }
  176.  
  177. static PINT_sm_action sys_statfs_cleanup(
  178.     struct PINT_smcb *smcb, job_status_s *js_p)
  179. {
  180.     struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
  181.     int i;
  182.     int num_io_servers = 0;
  183.     PVFS_size min_bytes_available = 0;
  184.     PVFS_size min_bytes_total = 0;
  185.     
  186.     sm_p->error_code = js_p->error_code;
  187.  
  188.     /* aggregate statistics down into one statfs structure */
  189.     sm_p->u.statfs_list.resp->statfs_buf.fs_id = sm_p->u.statfs_list.fs_id;
  190.     sm_p->u.statfs_list.resp->statfs_buf.bytes_available = 0;
  191.     sm_p->u.statfs_list.resp->statfs_buf.bytes_total = 0;
  192.     sm_p->u.statfs_list.resp->statfs_buf.handles_available_count = 0;
  193.     sm_p->u.statfs_list.resp->statfs_buf.handles_total_count = 0;
  194.     for(i=0; i<sm_p->u.statfs_list.count; i++)
  195.     {
  196.     if(sm_p->u.statfs_list.stat_array[i].server_type & PVFS_MGMT_IO_SERVER)
  197.     {
  198.         num_io_servers++;
  199.         if(min_bytes_available == 0 || 
  200.         min_bytes_available > sm_p->u.statfs_list.stat_array[i].bytes_available)
  201.         {
  202.         min_bytes_available = sm_p->u.statfs_list.stat_array[i].bytes_available;
  203.         }
  204.         if(min_bytes_total == 0 || 
  205.         min_bytes_total > sm_p->u.statfs_list.stat_array[i].bytes_total)
  206.         {
  207.         min_bytes_total = sm_p->u.statfs_list.stat_array[i].bytes_total;
  208.         }
  209.     }
  210.     sm_p->u.statfs_list.resp->statfs_buf.handles_available_count 
  211.         += sm_p->u.statfs_list.stat_array[i].handles_available_count;
  212.     sm_p->u.statfs_list.resp->statfs_buf.handles_total_count 
  213.         += sm_p->u.statfs_list.stat_array[i].handles_total_count;
  214.     }
  215.     sm_p->u.statfs_list.resp->statfs_buf.bytes_available = 
  216.         min_bytes_available*num_io_servers;
  217.     sm_p->u.statfs_list.resp->statfs_buf.bytes_total = 
  218.         min_bytes_total*num_io_servers;
  219.     sm_p->u.statfs_list.resp->server_count = sm_p->u.statfs_list.count;
  220.  
  221.     if(sm_p->u.statfs_list.stat_array)
  222.     {
  223.         free(sm_p->u.statfs_list.stat_array);
  224.     }
  225.     if(sm_p->u.statfs_list.addr_array)
  226.     {
  227.         free(sm_p->u.statfs_list.addr_array);
  228.     }
  229.  
  230.     PINT_SET_OP_COMPLETE;
  231.     return SM_ACTION_TERMINATE;
  232. }
  233.  
  234. /*
  235.  * Local variables:
  236.  *  mode: c
  237.  *  c-indent-level: 4
  238.  *  c-basic-offset: 4
  239.  * End:
  240.  *
  241.  * vim: ft=c ts=8 sts=4 sw=4 expandtab
  242.  */
  243.