Hi Dejan,

Thank you for reviewing and applying patches.

> Not invoked by the sfex RA, but by a user on the command line,
> right?
That's right. The sfex RA and sfex_daemon are not invoke
the sfex_stat command.

The sfex_stat command is executed directly by the system administrator.

Best Regards,

NAKAHIRA Kazutomo

(2010/12/03 20:13), Dejan Muhamedagic wrote:
> Hi Kazutomo-san,
>
> On Wed, Dec 01, 2010 at 01:15:55PM +0900, NAKAHIRA Kazutomo wrote:
>> Hi, all
>>
>> I rewrite sfex_stat command for current version
>> that was originally included in the sfex-1.3.
>>
>> The sfex_stat command is useful for confirms the lock status
>> when the trouble occurred.
>
> Not invoked by the sfex RA, but by a user on the command line,
> right?
>
>> Please see attached patch and let me know if you have any comments.
>
> None here. I just pushed it to the repository.
>
> Cheers,
>
> Dejan
>
>> Best Regards,
>>
>> --
>> NAKAHIRA Kazutomo
>> Infrastructure Software Technology Unit
>> NTT Open Source Software Center
>
>> exporting patch:
>> # HG changeset patch
>> # User NAKAHIRA Kazutomo<nakahira.kazut...@oss.ntt.co.jp>
>> # Date 1291166215 -32400
>> # Node ID 6a8d6fcc32cc4f21830e304b06aef543525b618b
>> # Parent  282d7683ffee5918ae5ca3b2fc08441888c7c43e
>> sfex: add the sfex_stat command
>>
>> diff -r 282d7683ffee -r 6a8d6fcc32cc resource-agents.spec
>> --- a/resource-agents.spec   Tue Nov 30 15:48:21 2010 +0900
>> +++ b/resource-agents.spec   Wed Dec 01 10:16:55 2010 +0900
>> @@ -186,6 +186,7 @@
>>   %{_sbindir}/ocf-tester
>>   %{_sbindir}/ocft
>>   %{_sbindir}/sfex_init
>> +%{_sbindir}/sfex_stat
>>   %{_includedir}/heartbeat
>>   %dir %attr (1755, root, root)      %{_var}/run/resource-agents
>>
>> diff -r 282d7683ffee -r 6a8d6fcc32cc tools/Makefile.am
>> --- a/tools/Makefile.am      Tue Nov 30 15:48:21 2010 +0900
>> +++ b/tools/Makefile.am      Wed Dec 01 10:16:55 2010 +0900
>> @@ -31,7 +31,7 @@
>>
>>   if BUILD_SFEX
>>   halib_PROGRAMS             += sfex_daemon
>> -sbin_PROGRAMS               += sfex_init
>> +sbin_PROGRAMS               += sfex_init sfex_stat
>>   endif
>>
>>   if USE_LIBNET
>> @@ -56,6 +56,10 @@
>>   sfex_init_CFLAGS   = -D_GNU_SOURCE
>>   sfex_init_LDADD            = $(GLIBLIB) -lplumb -lplumbgpl
>>
>> +sfex_stat_SOURCES   = sfex_stat.c sfex.h sfex_lib.c sfex_lib.h
>> +sfex_stat_CFLAGS    = -D_GNU_SOURCE
>> +sfex_stat_LDADD             = $(GLIBLIB) -lplumb -lplumbgpl
>> +
>>   findif_SOURCES             = findif.c
>>
>>   if BUILD_TICKLE
>> diff -r 282d7683ffee -r 6a8d6fcc32cc tools/sfex_daemon.c
>> --- a/tools/sfex_daemon.c    Tue Nov 30 15:48:21 2010 +0900
>> +++ b/tools/sfex_daemon.c    Wed Dec 01 10:16:55 2010 +0900
>> @@ -39,33 +39,6 @@
>>        fprintf(dist, "usage: %s [-i<index>] [-c<collision_timeout>] 
>> [-t<lock_timeout>]<device>\n", progname);
>>   }
>>
>> -static int lock_index_check(void)
>> -{
>> -    if (read_controldata(&cdata) == -1) {
>> -            cl_log(LOG_ERR, "%s\n", "read_controldata failed in 
>> lock_index_check");
>> -            return -1;
>> -    }
>> -#ifdef SFEX_DEBUG
>> -    cl_log(LOG_INFO, "version: %d\n", cdata.version);
>> -    cl_log(LOG_INFO, "revision: %d\n", cdata.revision);
>> -    cl_log(LOG_INFO, "blocksize: %d\n", cdata.blocksize);
>> -    cl_log(LOG_INFO, "numlocks: %d\n", cdata.numlocks);
>> -#endif
>> -
>> -    if (lock_index>  cdata.numlocks) {
>> -            cl_log(LOG_ERR, "index %d is too large. %d locks are stored.\n",
>> -                            lock_index, cdata.numlocks);
>> -            return -1;
>> -            /*exit(EXIT_FAILURE);*/
>> -    }
>> -
>> -    if (cdata.blocksize != sector_size) {
>> -            cl_log(LOG_ERR, "sector_size is not the same as the 
>> blocksize.\n");
>> -            return -1;
>> -    }
>> -    return 0;
>> -}
>> -
>>   static void acquire_lock(void)
>>   {
>>      if (read_lockdata(&cdata,&ldata, lock_index) == -1) {
>> @@ -334,7 +307,7 @@
>>      }
>>   #endif
>>
>> -    ret = lock_index_check();
>> +    ret = lock_index_check(&cdata, lock_index);
>>      if (ret == -1)
>>              exit(EXIT_FAILURE);
>>
>> diff -r 282d7683ffee -r 6a8d6fcc32cc tools/sfex_lib.c
>> --- a/tools/sfex_lib.c       Tue Nov 30 15:48:21 2010 +0900
>> +++ b/tools/sfex_lib.c       Wed Dec 01 10:16:55 2010 +0900
>> @@ -2,7 +2,7 @@
>>    *
>>    * Shared Disk File EXclusiveness Control Program(SF-EX)
>>    *
>> - * lib.c --- Libraries for other SF-EX modules.
>> + * sfex_lib.c --- Libraries for other SF-EX modules.
>>    *
>>    * This program is free software; you can redistribute it and/or
>>    * modify it under the terms of the GNU General Public License
>> @@ -168,7 +168,7 @@
>>    *
>>    * cdata --- pointer of control data
>>    *
>> - * device --- name of target file.
>> + * device --- name of target file
>>    */
>>   void
>>   write_controldata (const sfex_controldata * cdata)
>> @@ -288,7 +288,7 @@
>>    *
>>    * read sfex_controldata structure from file.
>>    *
>> - * cdata --- pointer for control data.
>> + * cdata --- pointer for control data
>>    *
>>    * device --- file name for reading
>>    */
>> @@ -432,3 +432,40 @@
>>   #endif
>>     return 0;
>>   }
>> +
>> +/*
>> + * lock_index_check --- check the value of index
>> + *
>> + * The lock_index_check function checks whether the value of index exceeds
>> + * the number of lock data on the shared disk.
>> + *
>> + * cdata --- pointer for control data
>> + *
>> + * index --- index number
>> + */
>> +int
>> +lock_index_check(sfex_controldata * cdata, int index)
>> +{
>> +        if (read_controldata(cdata) == -1) {
>> +                cl_log(LOG_ERR, "%s\n", "read_controldata failed in 
>> lock_index_check");
>> +                return -1;
>> +        }
>> +#ifdef SFEX_DEBUG
>> +        cl_log(LOG_INFO, "version: %d\n", cdata->version);
>> +        cl_log(LOG_INFO, "revision: %d\n", cdata->revision);
>> +        cl_log(LOG_INFO, "blocksize: %d\n", cdata->blocksize);
>> +        cl_log(LOG_INFO, "numlocks: %d\n", cdata->numlocks);
>> +#endif
>> +
>> +        if (index>  cdata->numlocks) {
>> +                cl_log(LOG_ERR, "index %d is too large. %d locks are 
>> stored.\n",
>> +                                index, cdata->numlocks);
>> +                return -1;
>> +        }
>> +
>> +        if (cdata->blocksize != sector_size) {
>> +                cl_log(LOG_ERR, "sector_size is not the same as the 
>> blocksize.\n");
>> +                return -1;
>> +        }
>> +        return 0;
>> +}
>> diff -r 282d7683ffee -r 6a8d6fcc32cc tools/sfex_lib.h
>> --- a/tools/sfex_lib.h       Tue Nov 30 15:48:21 2010 +0900
>> +++ b/tools/sfex_lib.h       Wed Dec 01 10:16:55 2010 +0900
>> @@ -2,7 +2,7 @@
>>    *
>>    * Shared Disk File EXclusiveness Control Program(SF-EX)
>>    *
>> - * lib.h --- Prototypes for lib.c.
>> + * sfex_lib.h --- Prototypes for lib.c.
>>    *
>>    * Copyright (c) 2007 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
>>    *
>> @@ -37,5 +37,6 @@
>>   int read_controldata(sfex_controldata *cdata);
>>   int read_lockdata(const sfex_controldata *cdata, sfex_lockdata *ldata, int 
>> index);
>>   int prepare_lock(const char *device);
>> +int lock_index_check(sfex_controldata * cdata, int index);
>>
>>   #endif /* LIB_H */
>> diff -r 282d7683ffee -r 6a8d6fcc32cc tools/sfex_stat.c
>> --- /dev/null        Thu Jan 01 00:00:00 1970 +0000
>> +++ b/tools/sfex_stat.c      Wed Dec 01 10:16:55 2010 +0900
>> @@ -0,0 +1,218 @@
>> +/*-------------------------------------------------------------------------
>> + *
>> + * Shared Disk File EXclusiveness Control Program(SF-EX)
>> + *
>> + * sfex_stat.c --- Display lock status. This is a part of the SF-EX.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License
>> + * as published by the Free Software Foundation; either version 2
>> + * of the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> + * 02110-1301, USA.
>> + *
>> + * Copyright (c) 2007 NIPPON TELEGRAPH AND TELEPHONE CORPORATION
>> + *
>> + * $Id$
>> + *
>> + *-------------------------------------------------------------------------
>> + *
>> + * sfex_stat [-i<index>]<device>
>> + *
>> + * -i<index>  --- The index is number of the resource that display the lock.
>> + * This number is specified by the integer of one or more. When two or more
>> + * resources are exclusively controlled by one meta-data, this option is 
>> used.
>> + * Default is 1.
>> + *
>> + *<device>  --- This is file path which stored meta-data. It is usually
>> + * expressed in "/dev/...", because it is partition on the shared disk.
>> + *
>> + * exit code --- 0 - Normal end. Own node is holding lock. 2 - Normal
>> + * end. Own node does not hold a lock. 3 - Error occurs while processing
>> + * it. The content of the error is displayed into stderr. 4 - The mistake
>> + * is found in the command line parameter.
>> + *
>> + 
>> *-------------------------------------------------------------------------*/
>> +
>> +#include<config.h>
>> +#include<stdio.h>
>> +#include<stdlib.h>
>> +#include<sys/types.h>
>> +#include<errno.h>
>> +#include<string.h>
>> +#include<limits.h>
>> +#if HAVE_UNISTD_H
>> +#  include<unistd.h>
>> +#endif
>> +
>> +#include "sfex.h"
>> +#include "sfex_lib.h"
>> +
>> +const char *progname;
>> +char *nodename;
>> +
>> +void print_controldata(const sfex_controldata *cdata);
>> +void print_lockdata(const sfex_lockdata *ldata, int index);
>> +
>> +/*
>> + * print_controldata --- print sfex control data to the display
>> + *
>> + * print sfex_controldata to the display.
>> + *
>> + * cdata --- pointer for control data
>> + */
>> +void
>> +print_controldata(const sfex_controldata *cdata)
>> +{
>> +  printf("control data:\n");
>> +  printf("  magic: 0x%02x, 0x%02x, 0x%02x, 0x%02x\n",
>> +         cdata->magic[0], cdata->magic[1], cdata->magic[2], 
>> cdata->magic[3]);
>> +  printf("  version: %d\n", cdata->version);
>> +  printf("  revision: %d\n", cdata->revision);
>> +  printf("  blocksize: %d\n", (int)cdata->blocksize);
>> +  printf("  numlocks: %d\n", cdata->numlocks);
>> +}
>> +
>> +/*
>> + * print_lockdata --- print sfex lock data to the display
>> + *
>> + * print sfex_lockdata to the display.
>> + *
>> + * ldata --- pointer for lock data
>> + *
>> + * index --- index number
>> + */
>> +void
>> +print_lockdata(const sfex_lockdata *ldata, int index)
>> +{
>> +  printf("lock data #%d:\n", index);
>> +  printf("  status: %s\n", ldata->status == SFEX_STATUS_UNLOCK ? "unlock" : 
>> "lock");
>> +  printf("  count: %d\n", ldata->count);
>> +  printf("  nodename: %s\n",ldata->nodename);
>> +}
>> +
>> +/*
>> + * usage --- display command line syntax
>> + *
>> + * display command line syntax. By the purpose, it can specify destination
>> + * stream. stdout or stderr is set usually.
>> + *
>> + * dist --- destination stream of the command line syntax, such as stderr.
>> + *
>> + * retrun value --- void
>> + */
>> +static void usage(FILE *dist) {
>> +  fprintf(dist, "usage: %s [-i<index>]<device>\n", progname);
>> +}
>> +
>> +/*
>> + * main --- main function
>> + *
>> + * entry point of sfex_stat command.
>> + *
>> + * exit code --- 0 - Normal end. Own node is holding lock. 2 - Normal
>> + * end. Own node dose not hold a lock. 3 - Error occurs while processing
>> + * it. The content of the error is displayed into stderr. 4 - The mistake
>> + * is found in the command line parameter.
>> + */
>> +int
>> +main(int argc, char *argv[]) {
>> +  sfex_controldata cdata;
>> +  sfex_lockdata ldata;
>> +  int ret = 0;
>> +
>> +  /* command line parameter */
>> +  int index = 1;            /* default 1st lock */
>> +  const char *device;
>> +
>> +  /*
>> +   * startup process
>> +   */
>> +
>> +  /* get a program name */
>> +  progname = get_progname(argv[0]);
>> +
>> +  /* enable the cl_log output from the sfex library */
>> +  cl_log_set_entity(progname);
>> +  /* The cl_log is output only to the standard error output */
>> +  cl_log_enable_stderr(TRUE);
>> +
>> +  /* read command line option */
>> +  opterr = 0;
>> +  while (1) {
>> +    int c = getopt(argc, argv, "hi:");
>> +    if (c == -1)
>> +      break;
>> +    switch (c) {
>> +    case 'h':                       /* help */
>> +      usage(stdout);
>> +      exit(0);
>> +    case 'i':                       /* -i<index>  */
>> +      {
>> +    unsigned long l = strtoul(optarg, NULL, 10);
>> +    if (l<  SFEX_MIN_NUMLOCKS || l>  SFEX_MAX_NUMLOCKS) {
>> +      fprintf(stderr,
>> +              "%s: ERROR: index %s is out of range or invalid. it must be 
>> integer value between %lu and %lu.\n",
>> +              progname, optarg,
>> +              (unsigned long)SFEX_MIN_NUMLOCKS,
>> +              (unsigned long)SFEX_MAX_NUMLOCKS);
>> +      exit(4);
>> +    }
>> +    index = l;
>> +      }
>> +      break;
>> +    case '?':                       /* error */
>> +      usage(stderr);
>> +      exit(4);
>> +    }
>> +  }
>> +
>> +  /* check parameter except the option */
>> +  if (optind>= argc) {
>> +    fprintf(stderr, "%s: ERROR: no device specified.\n", progname);
>> +    usage(stderr);
>> +    exit(4);
>> +  } else if (optind + 1<  argc) {
>> +    fprintf(stderr, "%s: ERROR: too many arguments.\n", progname);
>> +    usage(stderr);
>> +    exit(4);
>> +  }
>> +  device = argv[optind];
>> +
>> +  /*
>> +   * main processes start
>> +   */
>> +
>> +  /* get a node name */
>> +  nodename = get_nodename();
>> +
>> +  prepare_lock(device);
>> +
>> +  ret = lock_index_check(&cdata, index);
>> +  if (ret == -1)
>> +    exit(EXIT_FAILURE);
>> +
>> +  /* read lock data */
>> +  read_lockdata(&cdata,&ldata, index);
>> +
>> +  /* display status */
>> +  print_controldata(&cdata);
>> +  print_lockdata(&ldata, index);
>> +
>> +  /* check current lock status */
>> +  if (ldata.status != SFEX_STATUS_LOCK || strcmp(ldata.nodename, nodename)) 
>> {
>> +    fprintf(stdout, "status is UNLOCKED.\n");
>> +    exit(2);
>> +  } else {
>> +    fprintf(stdout, "status is LOCKED.\n");
>> +    exit(0);
>> +  }
>> +}
>
>> _______________________________________________________
>> Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
>> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
>> Home Page: http://linux-ha.org/
>
> _______________________________________________________
> Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
> http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
> Home Page: http://linux-ha.org/
>
>


-- 
NAKAHIRA Kazutomo
Infrastructure Software Technology Unit
NTT Open Source Software Center
_______________________________________________________
Linux-HA-Dev: Linux-HA-Dev@lists.linux-ha.org
http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev
Home Page: http://linux-ha.org/

Reply via email to