2 * $Id: zoom-benchmark.c,v 1.11 2005-09-20 11:29:03 marc Exp $
4 * Asynchronous multi-target client doing search and piggyback retrieval
13 #include <yaz/xmalloc.h>
14 #include <yaz/options.h>
19 static char* zoom_events[10];
21 /* re-sorting event numbers to progress numbers */
22 static int zoom_progress[10];
24 /* commando line parameters */
25 static struct parameters_t {
49 void print_event_line(struct event_line_t *pel)
51 printf ("%d\t%ld.%06ld\t%d\t%d\t%s\t%d\t%s\n",
52 pel->connection, pel->time_sec, pel->time_usec,
54 pel->event, pel->zoom_event,
55 pel->error, pel->errmsg);
58 void update_events(int *elc, struct event_line_t *els,
65 const char * eventmsg,
69 int ielc = repeat*parameters.concurrent + conn;
70 int iels = repeat*parameters.concurrent*10 + conn*10 + elc[ielc];
72 els[iels].connection = conn;
73 els[iels].time_sec = sec;
74 els[iels].time_usec = usec;
75 els[iels].progress = prog;
76 els[iels].event = event;
77 strcpy(els[iels].zoom_event, eventmsg);
78 els[iels].error = error;
79 strcpy(els[iels].errmsg, errmsg);
80 //print_event_line(&els[iels]);
84 void print_events(int *elc, struct event_line_t *els,
92 for (k=0; k < parameters.repeat; k++){
93 for (i=0; i < connections; i++){
94 ielc = k * parameters.concurrent + i;
95 for (j=0; j < elc[ielc]; j++){
96 iels = k * parameters.concurrent * 10 + i * 10 + j;
97 print_event_line(&els[iels]);
110 char nullstring[1] = "";
113 zoom_events[ZOOM_EVENT_NONE] = "ZOOM_EVENT_NONE";
114 zoom_events[ZOOM_EVENT_CONNECT] = "ZOOM_EVENT_CONNECT";
115 zoom_events[ZOOM_EVENT_SEND_DATA] = "ZOOM_EVENT_SEND_DATA";
116 zoom_events[ZOOM_EVENT_RECV_DATA] = "ZOOM_EVENT_RECV_DATA";
117 zoom_events[ZOOM_EVENT_TIMEOUT] = "ZOOM_EVENT_TIMEOUT";
118 zoom_events[ZOOM_EVENT_UNKNOWN] = "ZOOM_EVENT_UNKNOWN";
119 zoom_events[ZOOM_EVENT_SEND_APDU] = "ZOOM_EVENT_SEND_APDU";
120 zoom_events[ZOOM_EVENT_RECV_APDU] = "ZOOM_EVENT_RECV_APDU";
121 zoom_events[ZOOM_EVENT_RECV_RECORD] = "ZOOM_EVENT_RECV_RECORD";
122 zoom_events[ZOOM_EVENT_RECV_SEARCH] = "ZOOM_EVENT_RECV_SEARCH";
124 /* re-sorting event numbers to progress numbers */
125 zoom_progress[ZOOM_EVENT_NONE] = 0;
126 zoom_progress[ZOOM_EVENT_CONNECT] = 1;
127 zoom_progress[ZOOM_EVENT_SEND_DATA] = 3;
128 zoom_progress[ZOOM_EVENT_RECV_DATA] = 4;
129 zoom_progress[ZOOM_EVENT_TIMEOUT] = 8;
130 zoom_progress[ZOOM_EVENT_UNKNOWN] = 9;
131 zoom_progress[ZOOM_EVENT_SEND_APDU] = 2;
132 zoom_progress[ZOOM_EVENT_RECV_APDU] = 5;
133 zoom_progress[ZOOM_EVENT_RECV_RECORD] = 7;
134 zoom_progress[ZOOM_EVENT_RECV_SEARCH] = 6;
137 parameters.concurrent = 1;
138 parameters.timeout = 0;
139 parameters.repeat = 1;
140 strcpy(parameters.proxy, nullstring);
141 parameters.piggypack = 0;
143 /* progress initializing */
144 for (i = 0; i < 4096; i++){
145 parameters.progress[i] = 0;
158 void time_init(struct time_type *ptime)
160 gettimeofday(&(ptime->now), 0);
161 gettimeofday(&(ptime->then), 0);
166 void time_stamp(struct time_type *ptime)
168 gettimeofday(&(ptime->now), 0);
169 ptime->sec = ptime->now.tv_sec - ptime->then.tv_sec;
170 ptime->usec = ptime->now.tv_usec - ptime->then.tv_usec;
171 if (ptime->usec < 0){
173 ptime->usec += 1000000;
177 long time_sec(struct time_type *ptime)
182 long time_usec(struct time_type *ptime)
187 void print_option_error()
189 fprintf(stderr, "zoom-benchmark: Call error\n");
190 fprintf(stderr, "zoom-benchmark -h host:port -q pqf-query "
191 "[-c no_concurrent (max 4096)] "
195 //"[-t timeout] \n");
200 void read_params(int argc, char **argv, struct parameters_t *p_parameters){
203 while ((ret = options("h:q:c:t:p:bn:", argv, argc, &arg)) != -2)
208 strcpy(p_parameters->host, arg);
211 strcpy(p_parameters->query, arg);
214 strcpy(p_parameters->proxy, arg);
217 p_parameters->concurrent = atoi(arg);
220 //p_parameters->timeout = atoi(arg);
223 p_parameters->piggypack = 1;
226 p_parameters->repeat = atoi(arg);
229 print_option_error();
232 print_option_error();
237 printf("zoom-benchmark\n");
238 printf(" host: %s \n", p_parameters->host);
239 printf(" query: %s \n", p_parameters->query);
240 printf(" concurrent: %d \n", p_parameters->concurrent);
241 printf(" repeat: %d \n", p_parameters->repeat);
242 //printf(" timeout: %d \n", p_parameters->timeout);
243 printf(" proxy: %s \n", p_parameters->proxy);
244 printf(" piggypack: %d \n\n", p_parameters->piggypack);
247 if (! strlen(p_parameters->host))
248 print_option_error();
249 if (! strlen(p_parameters->query))
250 print_option_error();
251 if (! (p_parameters->concurrent > 0))
252 print_option_error();
253 if (! (p_parameters->repeat > 0))
254 print_option_error();
255 if (! (p_parameters->timeout >= 0))
256 print_option_error();
257 if (! ( p_parameters->concurrent <= 4096))
258 print_option_error();
261 void print_table_header()
263 printf ("target\tsecond.usec\tprogress\tevent\teventname\t");
264 printf("error\terrorname\n");
268 int main(int argc, char **argv)
270 struct time_type time;
274 struct event_line_t *els;
281 read_params(argc, argv, ¶meters);
283 z = xmalloc(sizeof(*z) * parameters.concurrent);
284 r = xmalloc(sizeof(*r) * parameters.concurrent);
285 elc = xmalloc(sizeof(*elc) * parameters.concurrent * parameters.repeat);
286 els = xmalloc(sizeof(*els)
287 * parameters.concurrent * parameters.repeat * 10);
288 o = ZOOM_options_create();
291 ZOOM_options_set (o, "async", "1");
293 /* get first record of result set (using piggypack) */
294 if (parameters.piggypack)
295 ZOOM_options_set (o, "count", "1");
298 if (strlen(parameters.proxy))
299 ZOOM_options_set (o, "proxy", parameters.proxy);
302 /* preferred record syntax */
304 ZOOM_options_set (o, "preferredRecordSyntax", "usmarc");
305 ZOOM_options_set (o, "elementSetName", "F");
310 for (k = 0; k < parameters.repeat; k++){
312 /* progress zeroing */
313 for (i = 0; i < 4096; i++){
314 parameters.progress[i] = k * 5 -1;
317 /* connect to all concurrent connections*/
318 for ( i = 0; i < parameters.concurrent; i++){
319 /* set event count to zero */
320 elc[k * parameters.concurrent + i] = 0;
322 /* create connection - pass options (they are the same for all) */
323 z[i] = ZOOM_connection_create(o);
325 /* connect and init */
326 ZOOM_connection_connect(z[i], parameters.host, 0);
329 for (i = 0; i < parameters.concurrent; i++)
330 r[i] = ZOOM_connection_search_pqf (z[i], parameters.query);
332 /* network I/O. pass number of connections and array of connections */
333 while ((i = ZOOM_event (parameters.concurrent, z))){
334 int event = ZOOM_connection_last_event(z[i-1]);
338 int progress = zoom_progress[event];
340 if (event == ZOOM_EVENT_SEND_DATA || event == ZOOM_EVENT_RECV_DATA)
345 /* updating events and event list */
346 error = ZOOM_connection_error(z[i-1] , &errmsg, &addinfo);
348 parameters.progress[i] = -progress;
350 parameters.progress[i] += 1;
352 update_events(elc, els,
354 time_sec(&time), time_usec(&time),
355 parameters.progress[i],
356 event, zoom_events[event],
360 /* destroy connections */
361 for (i = 0; i<parameters.concurrent; i++)
363 ZOOM_resultset_destroy (r[i]);
364 ZOOM_connection_destroy (z[i]);
369 } // for (k = 0; k < parameters.repeat; k++) repeat loop
372 print_table_header();
373 print_events(elc, els, parameters.concurrent);
376 /* destroy data structures and exit */
381 ZOOM_options_destroy(o);
387 * indent-tabs-mode: nil
389 * vim: shiftwidth=4 tabstop=8 expandtab