static int check_test_sweeper(eventer_t e, int mask, void *closure, struct timeval *now) { int left = 0; noit_skiplist_node *iter = NULL; sweeper_event = NULL; iter = noit_skiplist_getlist(&in_progress); while(iter) { struct check_test_closure *cl = iter->data; /* advance here, we might delete */ noit_skiplist_next(&in_progress,&iter); if(NOIT_CHECK_DISABLED(cl->check)) { if(NOIT_CHECK_SHOULD_RESOLVE(cl->check)) noit_check_resolve(cl->check); if(NOIT_CHECK_RESOLVED(cl->check)) { noit_module_t *m = noit_module_lookup(cl->check->module); cl->check->flags &= ~NP_DISABLED; if(NOIT_CHECK_SHOULD_RESOLVE(cl->check)) noitL(nldeb, "translated to %s\n", cl->check->target_ip); if(m) m->initiate_check(m, cl->check, 1, NULL); } left++; } else if(NOIT_CHECK_RUNNING(cl->check)) left++; else noit_skiplist_remove(&in_progress, cl->restc, (noit_freefunc_t)rest_test_check_result); } if(left) check_test_schedule_sweeper(); return 0; }
static int rest_test_check(mtev_http_rest_closure_t *restc, int npats, char **pats) { noit_check_t *tcheck; mtev_http_session_ctx *ctx = restc->http_ctx; int mask, complete = 0; int error_code = 500; const char *error = "internal error"; xmlDocPtr indoc, doc = NULL; xmlNodePtr attr, config, root; indoc = rest_get_xml_upload(restc, &mask, &complete); if(!complete) return mask; if(indoc == NULL) { error = "xml parse error"; goto error; } if(!noit_validate_check_rest_post(indoc, &attr, &config, &error)) goto error; tcheck = noit_fire_check(attr, config, &error); if(tcheck) { /* push the check and the context into a queue to complete on */ struct check_test_closure *cl; cl = calloc(1, sizeof(*cl)); if(npats == 1 && !strcmp(pats[0], ".json")) cl->output = WANTS_JSON; cl->check = tcheck; cl->restc = restc; mtev_skiplist_insert(&in_progress, cl); check_test_schedule_sweeper(); if(restc->call_closure_free) restc->call_closure_free(restc->call_closure); restc->call_closure_free = NULL; restc->call_closure = NULL; restc->fastpath = rest_test_check_err; goto cleanup; } error: mtev_http_response_standard(ctx, error_code, "ERROR", "text/xml"); doc = xmlNewDoc((xmlChar *)"1.0"); root = xmlNewDocNode(doc, NULL, (xmlChar *)"error", NULL); xmlDocSetRootElement(doc, root); xmlNodeAddContent(root, (xmlChar *)error); mtev_http_response_xml(ctx, doc); mtev_http_response_end(ctx); goto cleanup; cleanup: if(doc) xmlFreeDoc(doc); return 0; }