static void print_sandbox_log(char *sandbox_log) { int sandbox_log_file; size_t len; char buffer[8192]; sandbox_log_file = sb_open(sandbox_log, O_RDONLY, 0); if (-1 == sandbox_log_file) { sb_pwarn("could not open log file: %s", sandbox_log); return; } sb_eerror("--------------------------- ACCESS VIOLATION SUMMARY ---------------------------\n"); sb_eerror("LOG FILE: \"%s\"\n", sandbox_log); while (1) { len = sb_read(sandbox_log_file, buffer, sizeof(buffer)); if (len == -1) { sb_pwarn("sb_read(logfile) failed"); break; } else if (!len) break; sb_eerror("\n%s", buffer); } sb_close(sandbox_log_file); sb_eerror("--------------------------------------------------------------------------------\n"); }
static void command_handler (aeEventLoop * el, int fd, void *data, int mask) { int ret; workerState *ws = (workerState *) data; simpleBuf *sb = &ws->cin; char *cp; int is_quit = 0; int i; ret = sb_read (sb, fd); // master quits this fd instead assert (ret != -1); cp = sb->buf; while (!is_quit && sb->cp - cp >= sizeof (workerCmd *)) { workerCmd *cmd = NULL; memcpy ((char *) &cmd, cp, sizeof (workerCmd *)); switch (cmd->command) { case CMD_SIZE: ws->size = cmd->ival; cmd->ret = 0; break; case CMD_TPS: ws->tps = cmd->ival; cmd->ret = 0; break; case CMD_START: cmd->ret = command_start (ws, cmd->ebuf, sizeof (cmd->ebuf)); break; case CMD_STOP: free_connection (ws, 0); cmd->ret = 0; break; case CMD_STAT: cmd->num_rqst = ws->num_rqst; cmd->num_resp = ws->num_resp; cmd->num_reconn = ws->num_reconn; for (i = 0; i < MAX_HISTO; i++) { cmd->histo[i].count = ws->histo[i].count; cmd->histo[i].sum = ws->histo[i].sum; } cmd->ret = 0; break; case CMD_QUIT: free_connection (ws, 0); aeStop (ws->el); cmd->ret = 0; is_quit = 1; break; default: fprintf (stdout, "-ERR invalid command:%d\n", cmd->command); abort (); } write (ws->arg->wfd, "k", 1); cp += sizeof (workerCmd *); } memmove (sb->buf, cp, sb->cp - cp); sb->cp = sb->buf + (sb->cp - cp); }
static void response_handler (aeEventLoop * el, int fd, void *data, int mask) { workerState *ws = (workerState *) data; simpleBuf *sb = &ws->in; int tr; int ret; tr = sb_read (sb, fd); if (tr < 0) { fprintf (stderr, "[smr-client] failed to sb_read:%d\n", tr); free_connection (ws, 1); return; } if (sb->cp - sb->buf > 2 && *(sb->cp - 2) == '\r' && *(sb->cp - 1) == '\n') { int crc; if (sb->buf[0] != '+' || sb->buf[1] != 'O' || sb->buf[2] != 'K' || sb->buf[3] != ' ') { fprintf (stdout, "-ERR protocol error\n"); abort (); } crc = atoi (&sb->buf[4]); // update ks_crc ks_crc[ws->key] = crc; // check response if (ws->is_sync) { ks_crc_next[ws->key] = crc; ws->is_sync = 0; } else { if (crc != ks_crc_next[ws->key]) { fprintf (stdout, "-ERR inconsistency detected. expected:%d received:%d\n", ks_crc_next[ws->key], crc); abort (); } // update stat update_histo (ws); ws->num_resp++; } // reset response sb->cp = sb->buf; ws->key = -1; ret = emit_command (ws); assert (ret >= 0); } return; }