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 <[email protected]> > # 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: [email protected] > http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev > Home Page: http://linux-ha.org/ _______________________________________________________ Linux-HA-Dev: [email protected] http://lists.linux-ha.org/mailman/listinfo/linux-ha-dev Home Page: http://linux-ha.org/
