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); } }
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); }
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); } } } } } }
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; }
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; }
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(); } }