Beispiel #1
0
void*
snapWorker(void* arg) {
    /* WARNING void* arg (workerArgs) is on the stack of the function below and
     * doesn't exist forever. */
    WorkerArgs *workerArgs = (WorkerArgs*) arg;
    SnapArgs *snapArgs = workerArgs->snapArgs;
    tcp_stat_agent* agent = workerArgs->agent;
    CwndPeaks* peaks = workerArgs->peaks;
    int writeSnap = workerArgs->writeSnap;

    // snap log written into every "delay" milliseconds
    double delay = ((double) snapArgs->delay) / 1000.0;

    while (1) {
        pthread_mutex_lock(&mainmutex);
        if (workerLoop) {
            pthread_cond_broadcast(&maincond);
            pthread_mutex_unlock(&mainmutex);
            break;
        }
        pthread_mutex_unlock(&mainmutex);
        mysleep(0.01);
    }

    // Find Congestion window peaks from a web_100 snapshot, if enabled
    // Write snap log , if enabled, all in a synchronous manner.
    while (1) {
        pthread_mutex_lock(&mainmutex);
        if (!workerLoop) {
            pthread_mutex_unlock(&mainmutex);
            break;
        }
#if USE_WEB100
        web100_snap(snapArgs->snap);
        if (peaks) {
            findCwndPeaks(agent, peaks, snapArgs->snap);
        }
        if (writeSnap) {
            web100_log_write(snapArgs->log, snapArgs->snap);
        }
#elif USE_WEB10G
        estats_read_vars(snapArgs->snap, snapArgs->conn, agent);
        if (peaks) {
            findCwndPeaks(agent, peaks, snapArgs->snap);
        }
        if (writeSnap) {
            estats_record_write_data(snapArgs->log, snapArgs->snap);
        }
#endif
        pthread_mutex_unlock(&mainmutex);
        mysleep(delay);
    }

    return NULL;
}
int main(int argc, char **argv)
{

	estats_error* err = NULL;
	struct estats_nl_client* cl = NULL;
	estats_val_data* data = NULL;
	estats_record* record = NULL;
	estats_val val;
	char* str;
	int cid, i, j; 
	struct estats_connection_tuple_ascii tuple_ascii;

	if (argc < 2) {
                usage();
                exit(EXIT_FAILURE);
        }	

	cid = atoi(argv[1]);

	Chk(estats_nl_client_init(&cl));
	Chk(estats_val_data_new(&data));
	Chk(estats_record_open(&record, "./test-record", "w"));

	Chk(estats_read_vars(data, cid, cl));

	printf("Timestamp sec: %u, usec: %u\n", data->tv.sec, data->tv.usec);

	Chk(estats_connection_tuple_as_strings(&tuple_ascii, &data->tuple));

	printf("Address: %s %s %s %s\n", tuple_ascii.local_addr, tuple_ascii.local_port, tuple_ascii.rem_addr, tuple_ascii.rem_port);

	for (i = 0; i < data->length; i++) {
            Chk(estats_val_as_string(&str, &data->val[i], estats_var_array[i].valtype));

            printf("%s:  %s\n", estats_var_array[i].name, str);
	    free(str);
        }
	Chk(estats_record_write_data(record, data));

 Cleanup:
	estats_val_data_free(&data);
	estats_record_close(&record);
	estats_nl_client_destroy(&cl);

	if (err != NULL) {
		PRINT_AND_FREE(err);
		return EXIT_FAILURE;
	}

	return EXIT_SUCCESS;
}
Beispiel #3
0
/** Method to start snap worker thread that collects snap logs
 * @param snaparg object
 * @param tcp_stat_agent Agent
 * @param snaplogenabled Is snap logging enabled?
 * @param workerlooparg integer used to syncronize writing/reading from snaplog/tcp_stat snapshot
 * @param wrkrthreadidarg Thread Id of workera
 * @param metafilename	value of metafile name
 * @param tcp_stat_connection connection pointer
 * @param tcp_stat_group group web100_group pointer
 */
void start_snap_worker(SnapArgs *snaparg, tcp_stat_agent* agentarg,
                       CwndPeaks* peaks, char snaplogenabled,
                       pthread_t *wrkrthreadidarg, char *metafilename,
                       tcp_stat_connection conn, tcp_stat_group* group) {
    FILE *fplocal;

    WorkerArgs workerArgs;
    workerArgs.snapArgs = snaparg;
    workerArgs.agent = agentarg;
    workerArgs.peaks = peaks;
    workerArgs.writeSnap = snaplogenabled;

#if USE_WEB100
    group = web100_group_find(agentarg, "read");
    snaparg->snap = web100_snapshot_alloc(group, conn);
#elif USE_WEB10G
    snaparg->conn = conn;
    estats_val_data_new(&snaparg->snap);
#endif

    if (snaplogenabled) {
        // memcpy(metafilevariablename, metafilename, strlen(metafilename));
        // The above could have been here, except for a caveat: metafile stores
        // just the file name, but full filename is needed to open the log file

        fplocal = fopen(get_logfile(), "a");

#if USE_WEB100
        snaparg->log = web100_log_open_write(metafilename, conn, group);
#elif USE_WEB10G
        estats_record_open(&snaparg->log, metafilename, "w");
#endif
        if (fplocal == NULL) {
            log_println(
                0,
                "Unable to open log file '%s', continuing on without logging",
                get_logfile());
        } else {
            log_println(1, "Snaplog file: %s\n", metafilename);
            fprintf(fplocal, "Snaplog file: %s\n", metafilename);
            fclose(fplocal);
        }
    }

    if (pthread_create(wrkrthreadidarg, NULL, snapWorker,
                       (void*) &workerArgs)) {
        log_println(1, "Cannot create worker thread for writing snap log!");
        *wrkrthreadidarg = 0;
    }

    pthread_mutex_lock(&mainmutex);
    workerLoop= 1;
    // obtain web100 snap into "snaparg.snap"
#if USE_WEB100
    web100_snap(snaparg->snap);
    if (snaplogenabled) {
        web100_log_write(snaparg->log, snaparg->snap);
    }
#elif USE_WEB10G
    estats_read_vars(snaparg->snap, conn, agentarg);
    if (snaplogenabled) {
        estats_record_write_data(snaparg->log, snaparg->snap);
    }
#endif
    pthread_cond_wait(&maincond, &mainmutex);
    pthread_mutex_unlock(&mainmutex);
}