void *batch(void* arg) {
	int execution = (int)arg;
	Linked_list *threads, *node;
	int ret, matches, req_count=0;
	unsigned long delay;
	pthread_t *t1;

	threads = createList(NULL, NULL);
	do {
		req_count++;
		//fprintf(stderr, "will scanf\n");
		matches = fscanf(fd, "%lu\n", &delay);
		fprintf(stderr, "%lu waiting %ld\n", time_millis(), delay);
		usleep(delay);
		t1 = malloc(sizeof(pthread_t));
		ret = pthread_create(t1, NULL, request, (void *) &delay);
		if (ret != 0)
			fprintf(stderr, "ERROR creating request thread %i\n", ret);
		else
			insertAfter(t1, threads);
	} while (matches != EOF && req_count < MAX_REQ);
	hasnext = matches != EOF;
	sem_post(sem);
	for(node = threads->next; node != NULL; node = node->next) {
		fprintf(stderr, "%lu join request %d ", time_millis(), execution);
		t1 = (pthread_t*)(node->value);
		fprintf(stderr, "%ld\n", t1);
		pthread_join(*t1, NULL);
	}
	return (void*)&matches;
}
void *request(void* arg) {
	unsigned long delay = *((unsigned*)arg);
	long st, duration;
	int sock, reply;

	counter++;
	st = time_millis();
	sock = connectTo(load_balancer, PORT_LB);
	write(sock, &counter, sizeof(int));
	read(sock, &reply, sizeof(int));
	close(sock);
	duration = time_millis() - st;
	printf("%ld %lu %ld %d\n", st, delay, duration, reply);
}
Exemplo n.º 3
0
/**
 * Pause the program for some specified amount of time.
 * SLEEP <milliseconds>
 */
void cmd_sleep(char *args) {
  static unsigned long delay;
  static unsigned long sleep_end_millis;
  if (isdigit(args[0])) {
    sscanf(args, "%ul", &delay);
    sleep_end_millis = time_millis() + delay;
    while (time_millis() < sleep_end_millis) {
      if (is_interrupted()) {
        break;
      }
    }
  } else {
    syntax_error();
  }
}
int main(int argc, char *argv[]) {
	int workers_n = atoi(argv[1]);  //number of workers
	char *hostnames = argv[2];  //comma separated list of workers' hostnames
	int iteration = atoi(argv[3]); // iteration counter.

	char *token;  //for hosts tokenization
	char* hosts[workers_n], *host_name; //workers' socket names
	int sock; //socket descriptor
	int data;
	pid_t pid;
	int listenfd = 0, connfd = 0, counter = 0;
	struct sockaddr_in serv_addr;
	long st, et;

	data = 0;
	token = strtok(hostnames, ",");
	while (token != NULL ) {
		hosts[data++] = token;
		token = strtok(NULL, ",");
	}

	socketlisten(&listenfd, atoi(PORT_LB));

	fflush(stdout);
	while (1) {
		host_name = hosts[counter];
		counter = counter == workers_n - 1 ? 0 : counter + 1;
		fprintf(stderr, "next worker: %s\n", host_name);
		connfd = accept(listenfd, (struct sockaddr*) NULL, NULL );
		if (!(pid = fork())) {
			fprintf(stderr, "connection at %ld\n", time_millis());
			st = time_millis();
			read(connfd, &data, sizeof(data));
			sock = connectTo(host_name, PORT, "to worker");
			write(sock, &data, sizeof(data));
			read(sock, &data, sizeof(data));
			write(connfd, &data, sizeof(data));
			et = time_millis();
			fprintf(stdout, "%d %ld %ld %s\n", iteration, st, et, host_name);
			return 0;
		} else {
			if (pid == -1)
				fprintf(stderr, "ERROR creating process: %d\n", errno);
		}
	}
}
void verify_num_workers() {

	double requests_per_worker = (double)load/num_workers;
	fprintf(stderr, "%ld requests per worker %f\n", time_millis(), requests_per_worker);
	if (requests_per_worker >= limit_max)
		request_workers(pool_manager, 1);
	else if (requests_per_worker <= limit_min && num_workers > 1)
		release_workers(pool_manager, -1);

}
int main(int argc, char* argv[]) {
	load_balancer = argv[1];
	char* file_name = argv[2];
	int ret, counter=0;
	pthread_t *t1;
	Linked_list *threads, *node;

	sem = createsemaphore("/sem_trace", 0);
	threads = createList(NULL, NULL);

	fd = fopen(file_name,"r");
	if (fd == NULL) {
		fprintf(stdout, "Error opening file %s\n", file_name);
		exit(1);
	}
	fprintf(stderr, "opened file %d\n", fd);
	do {
		counter++;
		fprintf(stderr, "%lu new batch\n", time_millis());
		t1 = malloc(sizeof(pthread_t));
		ret = pthread_create(t1, NULL, batch, (void*)counter);
		if (ret != 0)
			fprintf(stderr, "ERROR creating batch thread %i\n", ret);
		else
			insertAfter(t1, threads);
		sem_wait(sem);
	} while (hasnext);
	fclose(fd);
	fprintf(stderr, "%lu workload finished\n", time_millis());
	for(node = threads->next; node != NULL; node = node->next) {
		fprintf(stderr, "%lu join batch", time_millis());
		t1 = (pthread_t*)(node->value);
		fprintf(stderr, "%ld\n", t1);
		pthread_join(*t1, NULL);
	}
}
Exemplo n.º 7
0
bool MulticastSender::SendUDPMessage(const std::string& msg, std::vector<std::string>* responses, unsigned int timeout, unsigned int max_response_count, CheckResponseCallback check_response_callback/* = NULL*/, void* check_response_callback_arg/* = NULL*/)
{
    int mcast_receive_socket=-1;

    bool retval=false;
	int cnt;
	struct sockaddr_in sa_mcast_server;
	struct sockaddr_in sa_mcast_group;
	struct sockaddr_in sa_broadcast;

    unsigned long abs_rx_timeout;

    memset(&sa_mcast_server, 0, sizeof(struct sockaddr_in));
    memset(&sa_mcast_group, 0, sizeof(struct sockaddr_in));
    memset(&sa_broadcast, 0, sizeof(struct sockaddr_in));
        
    sa_mcast_server.sin_family = AF_INET;
    sa_mcast_server.sin_port = htons(port);
    sa_mcast_server.sin_addr.s_addr = htonl(INADDR_ANY);

    sa_mcast_group.sin_family = AF_INET;
    sa_mcast_group.sin_port = htons(port);
    sa_mcast_group.sin_addr.s_addr = inet_addr(group.c_str());
    
    sa_broadcast.sin_family = AF_INET;
    sa_broadcast.sin_port = htons(port);
    sa_broadcast.sin_addr.s_addr = INADDR_BROADCAST;

	std::vector<in_addr> own_addresses = GetOwnAddresses();

    mcast_receive_socket = socket(PF_INET, SOCK_DGRAM, 0);

    int yes=1;
    setsockopt(mcast_receive_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&yes, sizeof(yes));

    if (bind(mcast_receive_socket, (struct sockaddr *)&sa_mcast_server, sizeof(struct sockaddr_in)) < 0)
	{
        perror("bind");
        goto cleanup;
    }

    if( use_broadcast || sa_mcast_group.sin_addr.s_addr == INADDR_BROADCAST ){
	    if (setsockopt(mcast_receive_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&yes, sizeof(yes)) < 0)
	    {
            perror("setsockopt - SO_BROADCAST");
            goto cleanup;
        }
    }

    if(  sa_mcast_group.sin_addr.s_addr != INADDR_BROADCAST ){
        struct ip_mreq imr;
        imr.imr_multiaddr.s_addr = inet_addr(group.c_str());

		for(unsigned int i=0; i<own_addresses.size(); i++)
		{
			imr.imr_interface.s_addr = own_addresses[i].s_addr;
			if (setsockopt(mcast_receive_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char *) &imr, sizeof(struct ip_mreq)) < 0)
			{
				printf("Add multicast membership failed for interface %s", inet_ntoa(own_addresses[i]));
			}
		}
    }

	for(unsigned int i=0; i<own_addresses.size(); i++)
	{
		int send_socket = socket(PF_INET, SOCK_DGRAM, 0);
		setsockopt(send_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&yes, sizeof(yes));

		if( use_broadcast )setsockopt(send_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&yes, sizeof(yes));

		sa_mcast_server.sin_addr.s_addr = own_addresses[i].s_addr;
	    if (bind(send_socket, (struct sockaddr *)&sa_mcast_server, sizeof(struct sockaddr_in)) < 0)
		{
			perror("bind");
			closesocket(send_socket);
			goto cleanup;
		}

        struct sockaddr* so_addr=(struct sockaddr *)(use_broadcast?&sa_broadcast:&sa_mcast_group);
        int n = sendto(send_socket, msg.c_str(), msg.size(), 0, so_addr, sizeof(struct sockaddr_in) );
        if (n < 0) {
            perror("sendto");
			closesocket(send_socket);
            goto cleanup;
        }
		closesocket(send_socket);
    }
    
    responses->clear();

    abs_rx_timeout=time_millis()+timeout;

    while ( responses->size() < max_response_count) {
        unsigned long now=time_millis();
        if((long)(now-abs_rx_timeout) >= 0)break;

        struct timeval wait_time;
        wait_time.tv_sec=(abs_rx_timeout-now)/1000;
        wait_time.tv_usec=((abs_rx_timeout-now)%1000)*1000;

	    fd_set inFd, outFd, excFd;
	    FD_ZERO(&inFd);
	    FD_ZERO(&outFd);
	    FD_ZERO(&excFd);
	
	    int maxFd = mcast_receive_socket;
        FD_SET(mcast_receive_socket, &inFd);

        int n_events=select(maxFd+1, &inFd, &outFd, &excFd, &wait_time);
        if(n_events < 0)
        {
            perror("select");
            goto cleanup;
        }
        if(n_events>0){
            char* rx_buffer=new char[UDP_RX_BUFFER_SIZE];

    		socklen_t len_r;
	    	len_r = sizeof(struct sockaddr_in);
            cnt = recv(mcast_receive_socket, rx_buffer, UDP_RX_BUFFER_SIZE, 0);
            if (cnt < 0) {
                perror("recvfrom");
                delete[] rx_buffer;
                goto cleanup;
            }
            std::string response(rx_buffer, cnt);
            if((response.size() != msg.size()) || (response.compare(msg)!=0)){
				if( check_response_callback )
				{
					if( check_response_callback(check_response_callback_arg, response))responses->push_back(response);
				}else{
					responses->push_back(response);
				}
            }
            delete[] rx_buffer;
        }
    }
    retval=true;
cleanup:
    if(mcast_receive_socket>=0)closesocket(mcast_receive_socket);
    return retval;
}
Exemplo n.º 8
0
int main(int argc, char *argv[]) {
	int clients = atoi(argv[1]); //simultaneous clients
	int requests = atoi(argv[2]); // requests per client
	char* st = argv[3];   //workload per request. just to print
	char* load_balancer = argv[4]; //name of the node that must receive the requests
	char* workers_n = argv[5];  //number of workers. not used. just to print
	char* workers_p = argv[6]; //not user. just to print
	char* contention = argv[7]; //not user. just to print
	char* coherency = argv[8];
	char* counter = argv[9];
	int sock; //socket descriptor
	int msg, reply; //reply from load balancer
	int i, j; //loop iterators
	long start_time, elapsed_time;
	float throughput;
	pid_t pid;

	fprintf(stderr,"%ld starting warmup\n", time_millis());
	for (i = 0; i < clients; i++) {
		usleep(100);
		if (!(pid = fork())) {
			//for (j = 0; j < requests; j++) {
				//start_time = time_millis();
				//fprintf(stderr, "connecting to %s\n", load_balancer);
				sock = connectTo(load_balancer, PORT_LB, "warmup");
				//send request
				msg = i*100+j;
				//fprintf(stderr,"sending request %d %d\n", i, j);
				write(sock, &msg, sizeof(int));
				//fprintf(stderr,"sent request %d %d\n", i, j);
				//wait for completion
				read(sock, &reply, sizeof(int));
				close(sock);
				//elapsed_time = time_millis() - start_time;
				//printf("%d %d %d %s %s %s %s %s %ld %ld %s\n", i + 1, j + 1,
				//		requests, st, workers_n, workers_p, contention, coherency, elapsed_time, start_time, counter);
			//}
			return 0;
		}/* else {
			if (pid == -1)
				fprintf(stderr, "ERROR creating process: %d\n", errno);

		}*/
	}
	for (i = 0; i < clients; i++)
		wait(NULL );
	fprintf(stderr, "%ld starting requests\n", time_millis());

	for (i = 0; i < clients; i++) {
		usleep(100);
		if (!(pid = fork())) {
			for (j = 0; j < requests; j++) {
				start_time = time_millis();
				fprintf(stderr, "connecting to %s\n", load_balancer);
				sock = connectTo(load_balancer, PORT_LB, "trace");
				//send request
				msg = i*100+j;
				fprintf(stderr,"sending request %d %d\n", i, j);
				write(sock, &msg, sizeof(int));
				fprintf(stderr,"sent request %d %d\n", i, j);
				//wait for completion
				read(sock, &reply, sizeof(int));
				close(sock);
				elapsed_time = time_millis() - start_time;
				printf("%d %d %d %s %s %s %s %s %ld %ld %s\n", i + 1, j + 1,
						requests, st, workers_n, workers_p, contention, coherency, elapsed_time, start_time, counter);
			}
			return 0;
		} else {
			if (pid == -1)
				fprintf(stderr, "ERROR creating process: %d\n", errno);

		}
	}
	for (i = 0; i < clients; i++)
		wait(NULL );

}