apphbtest.c
来自「linux集群服务器软件代码包」· C语言 代码 · 共 407 行
C
407 行
/* $Id: apphbtest.c,v 1.24 2005/02/17 09:46:24 sunjd Exp $ *//* * apphbtest: application heartbeat test program * * This program tests apphbd. It registers with the application heartbeat * server and issues heartbeats from time to time... * * Copyright(c) 2002 Alan Robertson <alanr@unix.sh> * ********************************************************************* * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <portability.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <unistd.h>#include <errno.h>#include <time.h>#include <syslog.h>#include <sys/types.h>#include <sys/wait.h>#include <sys/time.h>#include <clplumbing/cl_log.h>#include <apphb.h>int debug = 0;void doafailtest(void);void multi_hb_test(int child_proc_num, int hb_intvl_ms, int hb_num, int delaysecs, int dofailuretests);void hb_normal(int hb_intvl_ms, int delaysecs, int hb_num);void apphb_setwarn_test(int warnhb_ms, int hb_ms);void dup_reg_test(void);#define APPNAME_LEN 256#define OPTARGS "n:p:i:l:dFh"#define USAGE_STR "Usage: [-n heartbeat number] \[-p process number] \[-l delay seconds] \[-i heartbeat interval(ms)] \[-d](debug information) \[-F](enable failure cases) \[-h](print help message)"intmain(int argc,char ** argv){ int flag; int hb_num = 10; int child_proc_num = 1; int hb_intvl_ms = 1000; int dofailuretests = FALSE; int delaysecs = -1; while (( flag = getopt(argc, argv, OPTARGS)) != EOF) { switch(flag) { case 'n': /* Number of heartbeat */ hb_num = atoi(optarg); break; case 'p': /* Number of heartbeat processes */ child_proc_num = atoi(optarg); break; case 'i': /* Heartbeat interval */ hb_intvl_ms = atoi(optarg); break; case 'l': /* Delay before starting multiple clients */ delaysecs = atoi(optarg); break; case 'd': /* Debug */ debug += 1; break; case 'F': /* Enable failure cases */ dofailuretests = TRUE; break; case 'h': default: fprintf(stderr , "%s "USAGE_STR"\n", argv[0]); return(1); } } cl_log_set_entity(argv[0]); cl_log_enable_stderr(TRUE); cl_log_set_facility(LOG_USER); if (delaysecs < 0) delaysecs = child_proc_num; multi_hb_test(child_proc_num, hb_intvl_ms, hb_num, delaysecs , dofailuretests); if (dofailuretests) { /* run these fail cases if you want */ /* apphb_setwarn_test(2000, 1000); apphb_setwarn_test(1000, 2000); dup_reg_test(); */ } return(0);}voiddoafailtest(void){ int j; int rc; char app_name[] = "failtest"; char app_instance[APPNAME_LEN]; snprintf(app_instance, sizeof(app_instance) , "%s_%ld", app_name, (long)getpid()); cl_log(LOG_INFO, "Client %s registering", app_instance); rc = apphb_register(app_name, app_instance); if (rc < 0) { cl_perror("%s registration failure", app_instance); exit(1); } if (debug) { cl_log(LOG_INFO, "Client %s registered", app_instance); } cl_log(LOG_INFO, "Client %s setting 2 second heartbeat period" , app_instance); rc = apphb_setinterval(2000); if (rc < 0) { cl_perror("%s setinterval failure", app_instance); exit(2); } for (j=0; j < 10; ++j) { sleep(1); if (debug) fprintf(stderr, "+"); if (j == 8) { apphb_setwarn(500); } rc = apphb_hb(); if (rc < 0) { cl_perror("%s apphb_hb failure", app_instance); exit(3); } } if (debug) { fprintf(stderr, "\n"); } sleep(3); if (debug) fprintf(stderr, "!"); rc = apphb_hb(); if (rc < 0) { cl_perror("%s late apphb_hb failure", app_instance); exit(4); } cl_log(LOG_INFO, "Client %s unregistering", app_instance); rc = apphb_unregister(); if (rc < 0) { cl_perror("%s apphb_unregister failure", app_instance); exit(5); } rc = apphb_register(app_instance, "HANGUP"); if (rc < 0) { cl_perror("%s second registration failure", app_instance); exit(1); } /* Now we leave without further adieu -- HANGUP */ cl_log(LOG_INFO, "Client %s HANGUP!", app_instance);}void hb_normal(int hb_intvl_ms, int delaysecs, int hb_num){ int j; int rc; struct timespec time_spec; char app_name[] = "apphb_normal"; char app_instance[APPNAME_LEN]; struct timeval tmp; snprintf(app_instance, sizeof(app_instance) , "%s_%ld", app_name, (long)getpid()); if (delaysecs) { /* sleep randomly for a while */ gettimeofday(&tmp, NULL); srandom((unsigned int)tmp.tv_usec); delaysecs = random() % delaysecs; if (delaysecs) { cl_log(LOG_INFO, "%s sleep randomly for %d secs" , app_instance, delaysecs); time_spec.tv_sec = delaysecs; time_spec.tv_nsec = 0; nanosleep(&time_spec, NULL); } } cl_log(LOG_INFO, "Client %s registering", app_instance); rc = apphb_register(app_name, app_instance); if (rc < 0) { cl_perror("%s registration failure", app_instance); exit(1); } if (debug) { cl_log(LOG_INFO, "Client %s registered", app_instance); } cl_log(LOG_INFO, "Client %s setting %d ms heartbeat interval" , app_instance, hb_intvl_ms); rc = apphb_setinterval(hb_intvl_ms); if (rc < 0) { cl_perror("%s setinterval failure", app_instance); exit(2); } /* Sleep for half of the heartbeat interval */ time_spec.tv_sec = hb_intvl_ms / 2000; time_spec.tv_nsec = (hb_intvl_ms % 2000) * 500000; for (j=0; j < hb_num; ++j) { nanosleep(&time_spec, NULL); if(debug >= 1) fprintf(stderr, "%ld:+\n", (long)getpid()); rc = apphb_hb(); if (rc < 0) { cl_perror("%s apphb_hb failure", app_instance); exit(3); } } cl_log(LOG_INFO, "Client %s unregistering", app_instance); rc = apphb_unregister(); if (rc < 0) { cl_perror("%s apphb_unregister failure", app_instance); exit(4); } if (debug) { cl_log(LOG_INFO, "Client %s unregistered", app_instance); }}void multi_hb_test(int child_proc_num, int hb_intvl_ms, int hb_num, int delaysecs, int dofailuretests){ int j; cl_log(LOG_INFO, "----Start %d client(s) with hb interval %d ms----" , child_proc_num, hb_intvl_ms); for (j=0; j < child_proc_num; ++j) { switch(fork()){ case 0: hb_normal(hb_intvl_ms, delaysecs ,hb_num); exit(0); break; case -1: cl_perror("Can't fork!"); exit(1); break; default: /* In the parent. */ break; } } /* Wait for all our child processes to exit*/ while(wait(NULL) > 0); errno = 0; if (dofailuretests) { cl_log(LOG_INFO, "----Start %d client(s) doing fail test----" , child_proc_num); for (j = 0; j < child_proc_num; ++j) { switch(fork()){ case 0: doafailtest(); exit(0); break; case -1: cl_perror("Can't fork!"); exit(1); break; default: break; } } /* Wait for all our child processes to exit*/ while(wait(NULL) > 0); errno = 0; }}voidapphb_setwarn_test(int warnhb_ms, int hb_ms){ /* apphb_setwarn() sets the warning period. * if interval between two heartbeats is longer than the * warning period, apphbd will warn: 'late heartbeat' */ int rc; struct timespec time_spec; char app_name[] = "apphb_setwarn_test"; char app_instance[APPNAME_LEN]; snprintf(app_instance, sizeof(app_instance) , "%s_%ld", app_name, (long)getpid()); cl_log(LOG_INFO, "----Start test apphb_setwarn----"); cl_log(LOG_INFO, "Client %s registering", app_instance); rc = apphb_register(app_name, app_instance); if (rc < 0) { cl_perror("%s register failure", app_instance); exit(1); } cl_log(LOG_INFO, "Client %s setwarn for %d ms", app_instance, warnhb_ms); rc = apphb_setwarn(warnhb_ms); if (rc < 0) { cl_perror("%s setwarn failure", app_instance); exit(3); } cl_log(LOG_INFO, "Client %s setinterval for %d ms", app_instance, hb_ms); rc = apphb_setinterval(hb_ms); if (rc < 0) { cl_perror("%s setinterval failure", app_instance); exit(2); } rc = apphb_hb(); if (rc < 0) { cl_perror("%s first apphb_hb failure", app_instance); exit(4); } time_spec.tv_sec = hb_ms/1000; time_spec.tv_nsec = (hb_ms % 1000) * 1000000; nanosleep(&time_spec, NULL); rc = apphb_hb(); if (rc < 0) { cl_perror("%s second apphb_hb failure", app_instance); exit(4); } cl_log(LOG_INFO, "Client %s unregistering", app_instance); rc = apphb_unregister(); if (rc < 0) { cl_perror("%s apphb_unregister failure", app_instance); exit(5); } errno = 0;}void dup_reg_test(){ /* apphbd should not allow a process register two times */ int rc; char app_instance[APPNAME_LEN]; char app_name[] = "dup_reg_test"; snprintf(app_instance, sizeof(app_instance) , "%s_%ld", app_name, (long)getpid()); cl_log(LOG_INFO, "----Client %s trying to register twice----" , app_instance); cl_log(LOG_INFO, "Client %s registering", app_instance); rc = apphb_register(app_name, app_instance); if (rc < 0) { cl_perror("%s first register fail", app_instance); exit(1); } sleep(3); cl_log(LOG_INFO, "Client %s registering again", app_instance); rc = apphb_register(app_name, app_instance); if (rc < 0) { cl_perror("%s second register fail", app_instance); exit(1); } errno = 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?