コード例 #1
0
main() {

	char * id;
	int fd = client_socket("127.0.0.1",2233);

	while(getchar() != EOF) {

		t_msg *msg = argv_message(REQUEST_MEMORY, 3, 74, 127, 30);
		
		enviar_mensaje(fd,msg);

		puts("Mensaje enviado");

		msg = recibir_mensaje(fd);

		printf("%s\n%s",id = id_string(msg->header.id),msg->stream);

		free(msg);
	
	}

}
コード例 #2
0
void handshakeMarta() {
	char* str_mensaje = string_new();
	int ret;
	string_append(&str_mensaje, configuracion->resultado);
	string_append(&str_mensaje, "|");
	string_append(&str_mensaje, configuracion->archivos);
	t_msg* mensaje = string_message(CONEXION_JOB, str_mensaje, 1, configuracion->combiner);

	log_debug_interno("Enviando mensaje de solicitud de inicio de Job a MaRTA. Header.ID: %s - Archivos: %s - Resultado: %s", id_string(CONEXION_JOB),
			configuracion->archivos, configuracion->resultado);

	ret = enviar_mensaje(marta_sock, mensaje);

	if (ret < 0) {
		log_error_consola("Fallo el envio de mensaje de solicitud de inicio de Job");
		exit(1);
	}

	destroy_message(mensaje);
}
コード例 #3
0
void esperarTareas() {
	log_debug_consola("Se comienza a recibir solicitudes de tareas de map o reduce de MaRTA");

	fd_set read_fds;    // master file descriptor list
	int socket_actual;
	int fdmax;

	FD_ZERO(&read_fds);
	FD_SET(marta_sock, &read_fds);
	fdmax = marta_sock;

	while (true) {

		if (select(fdmax + 1, &read_fds, NULL, NULL, NULL) == -1) {
			log_error_consola("Fallo el select");
			perror("Fallo el select. Error");
		}

		for (socket_actual = 0; socket_actual <= fdmax; socket_actual++) {
			if (FD_ISSET(socket_actual, &read_fds)) {
				if (socket_actual == marta_sock) {

					t_msg* mensaje_actual = recibir_mensaje(marta_sock);

					if (!mensaje_actual) {
						log_error_consola("Se perdio la conexion con MaRTA IP: %s - Puerto: %d", configuracion->ip_marta, configuracion->puerto_marta);
						exit(1);
					}

					log_debug_interno("Se recibio mensaje de MaRTA. Header.Id: %s - Argc: %d - Largo Stream: %d", id_string(mensaje_actual->header.id),
							mensaje_actual->header.argc, mensaje_actual->header.length);

					if (mensaje_actual->header.id == EJECUTAR_REDUCE) {
						t_params_hiloReduce* paramsR = (t_params_hiloReduce*) malloc(sizeof(t_params_hiloMap));
						char** argumentos;
						argumentos = string_split(mensaje_actual->stream, "|");
						paramsR->archivos_tmp = queue_create();
						strcpy(paramsR->ip, argumentos[0]);
						paramsR->nombre_nodo = string_duplicate(argumentos[1]);
						paramsR->puerto = mensaje_actual->argv[0];
						paramsR->id_operacion = mensaje_actual->argv[1];
						paramsR->id_job = mensaje_actual->argv[2];
						paramsR->archivo_final = argumentos[2];
						mensaje_actual = recibir_mensaje(marta_sock);

						if (!mensaje_actual) {
							log_error_consola("Se perdio la conexion con MaRTA IP: %s - Puerto: %d", configuracion->ip_marta, configuracion->puerto_marta);
							exit(1);
						}

						while (mensaje_actual->header.id != FIN_ENVIO_MENSAJE) {

							log_debug_interno("Se recibio mensaje de MaRTA. Header.Id: %s - Argc: %d - Largo Stream: %d", id_string(mensaje_actual->header.id),
									mensaje_actual->header.argc, mensaje_actual->header.length);

							queue_push(paramsR->archivos_tmp, (void*) mensaje_actual);
							mensaje_actual = recibir_mensaje(marta_sock);

							if (!mensaje_actual) {
								log_error_consola("Se perdio la conexion con MaRTA IP: %s - Puerto: %d", configuracion->ip_marta, configuracion->puerto_marta);
								exit(1);
							}
						}
						levantarHiloReduce(paramsR);
					} else if (mensaje_actual->header.id == EJECUTAR_MAP) {
						t_params_hiloMap* params = (t_params_hiloMap*) malloc(sizeof(t_params_hiloMap));
						char** argumentos = string_split(mensaje_actual->stream, "|");
						strcpy(params->ip, argumentos[0]);
						params->nombre_nodo = string_duplicate(argumentos[1]);
						params->archivo_final = string_duplicate(argumentos[2]);
						params->puerto = mensaje_actual->argv[0];
						params->id_operacion = mensaje_actual->argv[1];
						params->id_job = mensaje_actual->argv[2];
						params->bloque = mensaje_actual->argv[3];
						levantarHiloMapper(params);
					} else if (mensaje_actual->header.id == GET_ARCHIVO_TMP_OK) {
						log_info_consola("El Job finalizo con exito");
						exit(EXIT_SUCCESS);
					} else if (mensaje_actual->header.id == MDFS_NO_OPERATIVO) {
						log_info_consola("ERROR - El MDFS no esta operativo. Reintente mas tarde.");
						exit(EXIT_FAILURE);
					} else if (mensaje_actual->header.id == INFO_ARCHIVO_ERROR) {
						log_info_consola("ERROR - No se encontro la informacion del archivo %s.Compruebe la existencia del archivo y vuelva a intentarlo.",
								mensaje_actual->stream);
						exit(EXIT_FAILURE);
					} else if (mensaje_actual->header.id == FIN_MAP_ERROR) {
						log_info_consola("ERROR - No se pudo ejecutar map. Revise disponibilidad de los archivos y vuelva a ejecutar.");
						exit(EXIT_FAILURE);
					} else if (mensaje_actual->header.id == FIN_REDUCE_ERROR) {
						log_info_consola("ERROR - No se pudo ejecutar reduce. Revise estado del MDFS y vuelva a ejecutar.");
						exit(EXIT_FAILURE);
					} else if (mensaje_actual->header.id == GET_ARCHIVO_TMP_ERROR) {
						log_info_consola("ERROR - No se pudo copiar el archivo final en el MDFS. Revise estado del MDFS y vuelva a ejecutar.");
						exit(EXIT_FAILURE);
					}
				}
			}
		}
	}
}
コード例 #4
0
int hiloMap(void* dato) {
	//sumar_hilo();
	t_msg* mensaje;
	t_msg* mensaje_respuesta;
	t_params_hiloMap* args = (t_params_hiloMap*) dato;
	int nodo_sock = client_socket(args->ip, args->puerto);
	int res = 0;

	if (nodo_sock < 0) {
		log_error_consola("No se pudo conectar al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto);
		mensaje_respuesta = argv_message(FIN_MAP_ERROR, 2, args->id_operacion, args->id_job);
	} else {

		mensaje = string_message(EJECUTAR_MAP, args->archivo_final, 2, args->id_operacion, args->bloque);

		log_debug_interno("Enviando mensaje de solicitud de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id),
				mensaje->header.argc, mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje EJECUTAR_MAP");
			shutdown(nodo_sock, 2);
		}
		mensaje = rutina_message(RUTINA, configuracion->mapper, configuracion->tamanio_mapper);

		log_debug_interno("Enviando mensaje de rutina. Header.ID: %s - Argc: %d - Largo Stream: %d Al nodo: %s", id_string(mensaje->header.id),
				mensaje->header.argc, mensaje->header.length, args->nombre_nodo);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje RUTINA");
			shutdown(nodo_sock, 2);
		}
		log_info_consola("Se envio SOLICITUD DE MAP correctamente. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo);
		mensaje = recibir_mensaje_sin_mutex(nodo_sock);
		if (!mensaje) { //Significa que recibir_mensaje devolvio NULL o sea que hubo un error en el recv o el nodo se desconecto
			log_info_consola("El MAP id_op: %d en el nodo: %s fallo, enviando a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(FIN_MAP_ERROR, 2, args->id_operacion, args->id_job);
		} else {
			log_info_consola("El MAP id_op: %d, en el nodo: %s finalizo bien. enviando a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(mensaje->header.id, 2, args->id_operacion, args->id_job);
			log_debug_interno("Se recibio mensaje de %s. Header.Id: %s - Argc: %d - Largo Stream: %d", args->nombre_nodo, id_string(mensaje->header.id),
					mensaje->header.argc, mensaje->header.length);
			destroy_message(mensaje);
		}
	}
//Se envia el resultado del map a marta
	log_debug_interno("Enviando mensaje respuesta a MaRTA. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje_respuesta->header.id),
			mensaje_respuesta->header.argc, mensaje_respuesta->header.length);

	res = enviar_mensaje(marta_sock, mensaje_respuesta);
	if (res == -1) {
		log_error_consola("Fallo envio de Mensaje a MaRTA.");
		shutdown(nodo_sock, 2);
		return res;
	}
	log_info_consola("Respuesta MAP enviada a MaRTA. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo);
	destroy_message(mensaje_respuesta);

//CERRAR CONEXIoN CON EL NODO//
	shutdown(nodo_sock, 2);
	//restar_hilo();
	return res;
}
コード例 #5
0
int hiloReduce(void* dato) {
	//sumar_hilo();
	t_msg* mensaje;
	t_msg* mensaje_respuesta;
	int res = 0;
	int i;
	t_params_hiloReduce* args = (t_params_hiloReduce*) dato;
	int nodo_sock = client_socket(args->ip, args->puerto);

	if (nodo_sock < 0) {
		log_error_consola("No se pudo conectar al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto);
		mensaje_respuesta = argv_message(FIN_REDUCE_ERROR, 1, args->id_operacion);
	} else {

		log_debug_consola("Se conecto al proceso %s - IP: %s - Puerto: %d", args->nombre_nodo, args->ip, args->puerto);

		mensaje = string_message(EJECUTAR_REDUCE, args->archivo_final, 1, args->id_operacion);
		log_debug_interno("Enviando mensaje de solicitud de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id),
				mensaje->header.argc, mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje EJECUTAR_REDUCE");
			shutdown(nodo_sock, 2);
			return res;

		}

		mensaje = rutina_message(RUTINA, configuracion->reduce, configuracion->tamanio_reduce);

		log_debug_interno("Enviando mensaje rutina. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc,
				mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje RUTINA");
			shutdown(nodo_sock, 2);
			return res;
		}

		int cant_elementos = queue_size(args->archivos_tmp);
		for (i = 0; i < cant_elementos; i++) {
			mensaje = queue_pop(args->archivos_tmp);
			log_debug_interno("Enviando mensaje archivos de reduce. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id),
					mensaje->header.argc, mensaje->header.length);

			res = enviar_mensaje(nodo_sock, mensaje);
			if (res == -1) {
				log_error_consola("Fallo envio mensaje ARCHIVOS_NODOS_REDUCE");
				shutdown(nodo_sock, 2);
				return res;
			}
		}

		mensaje = id_message(FIN_ENVIO_MENSAJE);

		log_debug_interno("Enviando mensaje fin de Mensaje. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje->header.id), mensaje->header.argc,
				mensaje->header.length);

		res = enviar_mensaje(nodo_sock, mensaje);
		if (res == -1) {
			log_error_consola("Fallo envio mensaje FIN_ENVIO_MENSAJE");
			shutdown(nodo_sock, 2);
			return res;
		}
		log_info_consola("Envio REDUCE a Job OK. id_op:%d , nodo: %s ", args->id_operacion, args->nombre_nodo);
		mensaje = recibir_mensaje_sin_mutex(nodo_sock);

		if (!mensaje) { //Significa que recibir_mensaje devolvio NULL o sea que hubo un error en el recv o el nodo se desconecto
			log_info_consola("Respuesta REDUCE Error. id_op: %d, nodo: %s, enviando mensaje a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(FIN_REDUCE_ERROR, 2, args->id_operacion, args->id_job);
		} else {
			log_info_consola("Respuesta REDUCE OK. id_op: %d, nodo: %s, enviando mensaje a MaRTA", args->id_operacion, args->nombre_nodo);
			mensaje_respuesta = argv_message(mensaje->header.id, 2, args->id_operacion, args->id_job);
			log_debug_interno("Se recibio mensaje de %s. Header.Id: %s - Argc: %d - Largo Stream: %d", args->nombre_nodo, id_string(mensaje->header.id),
					mensaje->header.argc, mensaje->header.length);
		}
	}

//Se reenvia el resultado del reduce a marta
	log_debug_interno("Enviando mensaje respuesta a MaRTA. Header.ID: %s - Argc: %d - Largo Stream: %d", id_string(mensaje_respuesta->header.id),
			mensaje_respuesta->header.argc, mensaje_respuesta->header.length);

	res = enviar_mensaje(marta_sock, mensaje_respuesta);
	if (res == -1) {
		log_error_consola("fallo mensaje respuesta a MaRTA");
		shutdown(nodo_sock, 2);
		return res;
	}
	log_info_consola("Respuesta REDUCE enviada. id_op: %d, nodo: %s", args->id_operacion, args->nombre_nodo);
	destroy_message(mensaje_respuesta);

	shutdown(nodo_sock, 2);
	//restar_hilo();
	return res;
}
コード例 #6
0
ファイル: MCNPInput.cpp プロジェクト: Pshriwise/mcnp2cad
void InputDeck::parseDataCards( LineExtractor& lines ){

  std::string line;
  token_list_t token_buffer;

  while( lines.hasLine() && !isblank(line = lines.takeLine()) ){

    tokenizeLine(line, token_buffer );
    
    if( do_line_continuation( lines, token_buffer ) ){
      continue;
    }
    else if( token_buffer.at(0) == "#" ){
      std::cerr << "Vertical data card format not supported" << std::endl;
      std::cerr << "Data written in this format will be ignored." << std::endl;
    }

    DataCard* d = NULL;
    DataCard::kind t = DataCard::OTHER;
    int ident = 0;

    std::string cardname = token_buffer.at(0);
    token_buffer.erase( token_buffer.begin() );

    if( cardname.find("tr") == 0 || cardname.find("*tr") == 0 ){

      t = DataCard::TR;
      bool degree_format = false;
      if( cardname[0] == '*' ){
        degree_format = true;
        cardname = cardname.substr( 1 ); // remove leading * 
      }
      else if( cardname.find("*") == cardname.length()-1 ){
        // although it's undocumented, apparently TRn* is a synonym for *TRn
        // (the manual uses this undocumented form in chapter 4)
        degree_format = true;
        cardname.resize( cardname.length() -1 ); // remove trailing *
      }

      std::string id_string( cardname, 2 );

      // the id_string may be empty, indicating that n is missing from TRn.  
      // examples from the manual indicate it should be assumed to be 1
      if( id_string == "" ){
        ident = 1;
      }
      else{
        ident = makeint( id_string );
      }

      d = new TransformCard( *this, ident, degree_format, token_buffer);
    }
    
    if(d){
      if( OPT_VERBOSE ){ d->print( std::cout ); }
      this->datacards.push_back(d);
      this->datacard_map.insert( std::make_pair( std::make_pair(t,ident), d) );
    }

    token_buffer.clear();

  }

}