Home | History | Annotate | Line # | Download | only in h_client
h_stresscli.c revision 1.7
      1  1.7  pooka /*	$NetBSD: h_stresscli.c,v 1.7 2011/01/12 11:37:45 pooka Exp $	*/
      2  1.1  pooka 
      3  1.1  pooka #include <sys/types.h>
      4  1.1  pooka #include <sys/atomic.h>
      5  1.1  pooka #include <sys/sysctl.h>
      6  1.1  pooka #include <sys/wait.h>
      7  1.1  pooka 
      8  1.1  pooka #include <err.h>
      9  1.1  pooka #include <pthread.h>
     10  1.1  pooka #include <stdio.h>
     11  1.1  pooka #include <stdlib.h>
     12  1.1  pooka #include <string.h>
     13  1.1  pooka #include <unistd.h>
     14  1.1  pooka 
     15  1.1  pooka #include <rump/rump_syscalls.h>
     16  1.1  pooka #include <rump/rumpclient.h>
     17  1.1  pooka 
     18  1.1  pooka static unsigned int syscalls;
     19  1.1  pooka static pid_t mypid;
     20  1.4  pooka static volatile sig_atomic_t doquit;
     21  1.1  pooka 
     22  1.1  pooka static void
     23  1.1  pooka signaali(int sig)
     24  1.1  pooka {
     25  1.1  pooka 
     26  1.4  pooka 	doquit = 1;
     27  1.1  pooka }
     28  1.1  pooka 
     29  1.1  pooka static const int hostnamemib[] = { CTL_KERN, KERN_HOSTNAME };
     30  1.1  pooka static char hostnamebuf[128];
     31  1.1  pooka #define HOSTNAMEBASE "rumpclient"
     32  1.1  pooka 
     33  1.1  pooka static void *
     34  1.1  pooka client(void *arg)
     35  1.1  pooka {
     36  1.1  pooka 	char buf[256];
     37  1.1  pooka 	size_t blen;
     38  1.1  pooka 
     39  1.4  pooka 	while (!doquit) {
     40  1.1  pooka 		pid_t pidi;
     41  1.1  pooka 		blen = sizeof(buf);
     42  1.1  pooka 		if (rump_sys___sysctl(hostnamemib, __arraycount(hostnamemib),
     43  1.1  pooka 		    buf, &blen, NULL, 0) == -1)
     44  1.1  pooka 			err(1, "sysctl");
     45  1.1  pooka 		if (strncmp(buf, hostnamebuf, sizeof(HOSTNAMEBASE)-1) != 0)
     46  1.1  pooka 			errx(1, "hostname (%s/%s) mismatch", buf, hostnamebuf);
     47  1.1  pooka 		atomic_inc_uint(&syscalls);
     48  1.1  pooka 
     49  1.1  pooka 		pidi = rump_sys_getpid();
     50  1.1  pooka 		if (pidi == -1)
     51  1.1  pooka 			err(1, "getpid");
     52  1.1  pooka 		if (pidi != mypid)
     53  1.1  pooka 			errx(1, "mypid mismatch");
     54  1.1  pooka 		atomic_inc_uint(&syscalls);
     55  1.1  pooka 	}
     56  1.1  pooka 
     57  1.1  pooka 	return NULL;
     58  1.1  pooka }
     59  1.1  pooka 
     60  1.1  pooka /* Stress with max 32 clients, 8 threads each (256 concurrent threads) */
     61  1.1  pooka #define NCLI 32
     62  1.1  pooka #define NTHR 8
     63  1.1  pooka 
     64  1.1  pooka int
     65  1.1  pooka main(int argc, char *argv[])
     66  1.1  pooka {
     67  1.4  pooka 	pthread_t pt[NTHR-1];
     68  1.1  pooka 	pid_t clis[NCLI];
     69  1.1  pooka 	pid_t apid;
     70  1.1  pooka 	int ncli = 0;
     71  1.1  pooka 	int i = 0, j;
     72  1.7  pooka 	int status, thesig;
     73  1.1  pooka 	int rounds;
     74  1.1  pooka 
     75  1.7  pooka 	if (argc != 2 && argc != 3)
     76  1.1  pooka 		errx(1, "need roundcount");
     77  1.1  pooka 
     78  1.7  pooka 	if (argc == 3) {
     79  1.7  pooka 		if (strcmp(argv[2], "kill") != 0)
     80  1.7  pooka 			errx(1, "optional 3rd param must be kill");
     81  1.7  pooka 		thesig = SIGKILL;
     82  1.7  pooka 	} else {
     83  1.7  pooka 		thesig = SIGUSR1;
     84  1.7  pooka 	}
     85  1.7  pooka 
     86  1.6  pooka 	signal(SIGUSR1, signaali);
     87  1.6  pooka 
     88  1.1  pooka 	memset(clis, 0, sizeof(clis));
     89  1.1  pooka 	for (rounds = 1; rounds < atoi(argv[1])*10; rounds++) {
     90  1.1  pooka 		while (ncli < NCLI) {
     91  1.1  pooka 			switch ((apid = fork())) {
     92  1.1  pooka 			case -1:
     93  1.1  pooka 				err(1, "fork failed");
     94  1.1  pooka 			case 0:
     95  1.1  pooka 				if (rumpclient_init() == -1)
     96  1.1  pooka 					err(1, "rumpclient init");
     97  1.1  pooka 
     98  1.1  pooka 				mypid = rump_sys_getpid();
     99  1.1  pooka 				sprintf(hostnamebuf, HOSTNAMEBASE "%d", mypid);
    100  1.1  pooka 				if (rump_sys___sysctl(hostnamemib,
    101  1.1  pooka 				    __arraycount(hostnamemib), NULL, NULL,
    102  1.1  pooka 				    hostnamebuf, strlen(hostnamebuf)+1) == -1)
    103  1.1  pooka 					err(1, "sethostname");
    104  1.1  pooka 
    105  1.1  pooka 				for (j = 0; j < NTHR-1; j++)
    106  1.4  pooka 					if (pthread_create(&pt[j], NULL,
    107  1.1  pooka 					    client, NULL) != 0)
    108  1.1  pooka 						err(1, "pthread create");
    109  1.1  pooka 				client(NULL);
    110  1.4  pooka 				for (j = 0; j < NTHR-1; j++)
    111  1.4  pooka 					pthread_join(pt[j], NULL);
    112  1.4  pooka 				membar_consumer();
    113  1.4  pooka 				fprintf(stderr, "done %d\n", syscalls);
    114  1.4  pooka 				exit(0);
    115  1.1  pooka 				/* NOTREACHED */
    116  1.1  pooka 			default:
    117  1.1  pooka 				ncli++;
    118  1.1  pooka 				clis[i] = apid;
    119  1.1  pooka 				break;
    120  1.1  pooka 			}
    121  1.1  pooka 
    122  1.1  pooka 			i = (i + 1) % NCLI;
    123  1.1  pooka 		}
    124  1.1  pooka 
    125  1.1  pooka 		usleep(100000);
    126  1.7  pooka 		kill(clis[i], thesig);
    127  1.1  pooka 
    128  1.1  pooka 		apid = wait(&status);
    129  1.1  pooka 		if (apid != clis[i])
    130  1.1  pooka 			errx(1, "wanted pid %d, got %d\n", clis[i], apid);
    131  1.1  pooka 		clis[i] = 0;
    132  1.1  pooka 		ncli--;
    133  1.7  pooka 		if (thesig == SIGUSR1) {
    134  1.7  pooka 			if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) {
    135  1.7  pooka 				fprintf(stderr, "child died with 0x%x\n",
    136  1.7  pooka 				    status);
    137  1.7  pooka 				exit(1);
    138  1.7  pooka 			}
    139  1.7  pooka 		} else {
    140  1.7  pooka 			if (!WIFSIGNALED(status) || WTERMSIG(status) != thesig){
    141  1.7  pooka 				fprintf(stderr, "child died with 0x%x\n",
    142  1.7  pooka 				    status);
    143  1.7  pooka 				exit(1);
    144  1.7  pooka 			}
    145  1.5  pooka 		}
    146  1.1  pooka 	}
    147  1.1  pooka 
    148  1.1  pooka 	for (i = 0; i < NCLI; i++)
    149  1.1  pooka 		if (clis[i])
    150  1.1  pooka 			kill(clis[i], SIGKILL);
    151  1.1  pooka }
    152