Example #1
0
void* conectarseConWorkerRedGlobal(void* params){
	parametrosReduccionGlobal* parametrosConexion= malloc(sizeof(parametrosReduccionGlobal));
	respuestaReduccionGlobal* infoRedGlobal =(respuestaReduccionGlobal*) params;
	respuesta confirmacionWorker;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(infoRedGlobal->ip.cadena,infoRedGlobal->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarFalloEnReduccion();
		return 0;
	}

	log_trace(loggerMaster, "Inicio Red. Global con Worker %d para Job %d", infoRedGlobal->numero, infoRedGlobal->job);

	struct stat fileStat;
	if(stat(miJob->rutaReductor.cadena,&fileStat) < 0){
		printf("No se pudo abrir el archivo\n");
		return 0;
	}

	int fd = open(miJob->rutaReductor.cadena,O_RDWR);
	int size = fileStat.st_size;

	parametrosConexion->contenidoScript.cadena = mmap(NULL,size,PROT_READ,MAP_SHARED,fd,0);
	parametrosConexion->contenidoScript.longitud = size;
	parametrosConexion->archivoTemporal.cadena = strdup(infoRedGlobal->archivoTemporal.cadena);
	parametrosConexion->archivoTemporal.longitud = infoRedGlobal->archivoTemporal.longitud;
	parametrosConexion->infoWorkers = list_create();
	list_add_all(parametrosConexion->infoWorkers,infoRedGlobal->parametros->infoWorkers);

	empaquetar(socketWorker, mensajeProcesarRedGlobal, 0, parametrosConexion);

	confirmacionWorker = desempaquetar(socketWorker);

	if (munmap(parametrosConexion->contenidoScript.cadena, parametrosConexion->contenidoScript.longitud) == -1){
		perror("Error un-mmapping the file");
		exit(EXIT_FAILURE);
	}
	close(fd);

	switch(confirmacionWorker.idMensaje){
		case mensajeOk:
		case mensajeRedGlobalCompleta:
			log_trace(loggerMaster, "Informo YAMA fin de Reduccion Global en nodo %i",infoRedGlobal->numero);
			empaquetar(socketYama, mensajeRedGlobalCompleta, 0 , 0);
			estadisticas->cantTareas[RED_GLOBAL]++;
			finalizarTiempo(estadisticas->tiempoFinRedGlobal,infoRedGlobal->numero);
			break;

		case mensajeDesconexion:
		case mensajeFalloRedGlobal:
			log_trace(loggerMaster, "Informo a  YAMA fallo en Reduccion Global del nodo %d.",infoRedGlobal->numero);
			estadisticas->cantFallos++;
			mandarFalloEnReduccion();
			break;
	}

	return 0;
}
Example #2
0
void* conectarseConWorkersTransformacion(void* params) {
	parametrosTransformacion* infoTransformacion= (parametrosTransformacion*)params;
	respuesta confirmacionWorker;
	bloqueYNodo* bloqueOK;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(infoTransformacion->ip.cadena,infoTransformacion->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarAReplanificar(infoTransformacion);
		return 0;

	}

	log_trace(loggerMaster, "Conexion con Worker %d para bloque %d", infoTransformacion->numero, infoTransformacion->bloquesConSusArchivos.numBloque);

	struct stat fileStat;
	if(stat(miJob->rutaTransformador.cadena,&fileStat) < 0){
		printf("No se pudo abrir el archivo\n");
		return 0;
	}

	int fd = open(miJob->rutaTransformador.cadena,O_RDWR);
	int size = fileStat.st_size;

	infoTransformacion->contenidoScript.cadena = mmap(NULL,size,PROT_READ,MAP_SHARED,fd,0);
	infoTransformacion->contenidoScript.longitud = size;

	empaquetar(socketWorker, mensajeProcesarTransformacion, 0, infoTransformacion);

	confirmacionWorker = desempaquetar(socketWorker);

	if (munmap(infoTransformacion->contenidoScript.cadena, infoTransformacion->contenidoScript.longitud) == -1){
		perror("Error un-mmapping the file");
		exit(EXIT_FAILURE);
	}
	close(fd);

	switch(confirmacionWorker.idMensaje){

		case mensajeTransformacionCompleta:
			log_trace(loggerMaster, "Informo a YAMA fin Transformacion para bloque %d en nodo %d.",infoTransformacion->bloquesConSusArchivos.numBloque,infoTransformacion->numero);
			bloqueOK = malloc(sizeof(bloqueYNodo));
			bloqueOK->workerId = infoTransformacion->numero;
			bloqueOK->bloque = infoTransformacion->bloquesConSusArchivos.numBloque;
			empaquetar(socketYama, mensajeTransformacionCompleta, 0 , bloqueOK);
			finalizarTiempo(estadisticas->tiempoFinTrans,bloqueOK->bloque);
			estadisticas->cantTareas[TRANSFORMACION]++;
			free(bloqueOK);
			break;

		case mensajeDesconexion:
			mandarAReplanificar(infoTransformacion);
			break;


	}
	return 0;
}
Example #3
0
void esperarInstruccionesDeYama() {
	respuesta instruccionesYama;
	respuestaSolicitudTransformacion* infoTransformacion ;
	nodosRedLocal* infoRedLocal;
	respuestaReduccionGlobal* infoRedGlobal;
	workerDesdeYama* worker;
	respuestaAlmacenamiento* almacenamiento;
	int fallo;

	while (1) {
		instruccionesYama = desempaquetar(socketYama);
		switch (instruccionesYama.idMensaje) {

			case mensajeRespuestaTransformacion:
				infoTransformacion = (respuestaSolicitudTransformacion*)instruccionesYama.envio;
				log_trace(loggerMaster, "Recibo Transformacion de YAMA.");
				inicializarTiemposTransformacion(infoTransformacion);
				crearHilosConexionTransformacion(infoTransformacion);
				break;

			case mensajeRespuestaRedLocal:
				infoRedLocal = (nodosRedLocal*)instruccionesYama.envio;
				log_trace(loggerMaster, "Recibo Reduccion Local en nodo %d de YAMA.",infoRedLocal->numeroNodo);
				crearHilosConexionRedLocal(infoRedLocal);
				break;

			case mensajeDesconexion:
				log_error(loggerMaster, "Error inesperado al recibir instrucciones de YAMA.");
				exit(1);
				break;

			case mensajeReplanificacion:
				worker= instruccionesYama.envio;
				log_trace(loggerMaster, "Recibo Replanificacion para bloque en nodo %d de YAMA.",worker->numeroWorker);
				crearHilosPorBloqueTransformacion(worker);
				break;

			case mensajeFinJob:
				fallo = *(int*)instruccionesYama.envio;
				log_trace(loggerMaster, "Finaliza job.");
				finalizarJob(fallo);
				break;

			case mensajeRespuestaRedGlobal:
				infoRedGlobal = (respuestaReduccionGlobal*)instruccionesYama.envio;
				log_trace(loggerMaster, "Recibo Reduccion Global en nodo %d de YAMA.",infoRedGlobal->numero);
				enviarAEncargadoRedGlobal(infoRedGlobal);
				break;

			case mensajeRespuestaAlmacenamiento:
				almacenamiento = (respuestaAlmacenamiento*)instruccionesYama.envio;
				log_trace(loggerMaster, "Recibo Almacenamiento Final en nodo %d de YAMA.",almacenamiento->nodo);
				enviarAlmacenamientoFinal(almacenamiento);
				break;
		}
	}
}
Example #4
0
void* conectarseConWorkersRedLocal(void* params){
	parametrosReduccionLocal* infoRedLocal= (parametrosReduccionLocal*)params;
	respuesta confirmacionWorker;
	int numeroNodo;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(infoRedLocal->ip.cadena,infoRedLocal->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarFalloEnReduccion();
		return 0;

	}

	log_trace(loggerMaster, "Conexion con Worker %d para estos tmp %d", infoRedLocal->numero, list_size(infoRedLocal->archivosTemporales));

	struct stat fileStat;
	if(stat(miJob->rutaReductor.cadena,&fileStat) < 0){
		printf("No se pudo abrir el archivo\n");
		return 0;
	}

	int fd = open(miJob->rutaReductor.cadena,O_RDWR);
	int size = fileStat.st_size;

	infoRedLocal->contenidoScript.cadena = mmap(NULL,size,PROT_READ,MAP_SHARED,fd,0);
	infoRedLocal->contenidoScript.longitud = size;

	empaquetar(socketWorker, mensajeProcesarRedLocal, 0, infoRedLocal);

	confirmacionWorker = desempaquetar(socketWorker);

	if (munmap(infoRedLocal->contenidoScript.cadena, infoRedLocal->contenidoScript.longitud) == -1){
		perror("Error un-mmapping the file");
		exit(EXIT_FAILURE);
	}
	close(fd);

	switch(confirmacionWorker.idMensaje){

	case mensajeRedLocalCompleta:
		log_trace(loggerMaster, "Informo a  YAMA fin Reduccion Local en nodo %d.",infoRedLocal->numero);
		numeroNodo = *(int*)confirmacionWorker.envio;
		empaquetar(socketYama, mensajeRedLocalCompleta, 0 , &numeroNodo);
		finalizarTiempo(estadisticas->tiempoFinRedLocal,numeroNodo);
		estadisticas->cantTareas[RED_LOCAL]++;
		break;

	case mensajeDesconexion:
	case mensajeFalloRedLocal:
		log_trace(loggerMaster, "Informo a  YAMA fallo en Reduccion Local en nodo %d.",infoRedLocal->numero);
		estadisticas->cantFallos++;
		mandarFalloEnReduccion();
		break;
	}
	return 0;
}
Example #5
0
void conectarseConYama(char* ip, int port) {
	socketYama = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(ip, port);
	conectarCon(direccion, socketYama, 2); //2 id master
	respuesta respuestaHandShake = desempaquetar(socketYama);

	if(respuestaHandShake.idMensaje != mensajeOk){
		log_error(loggerMaster, "Conexion fallida con YAMA");
		perror("Conexion fallida con YAMA");
		log_destroy(loggerMaster);
		exit(1);
	}
	log_trace(loggerMaster, "Conexion con Yama establecida");
}
Example #6
0
void enviarJobAYama(job* miJob) {
	empaquetar(socketYama,mensajeSolicitudTransformacion, 0 ,miJob);
	log_trace(loggerMaster,"Enviando solicitud de etapa Transformacion a YAMA");

	respuesta respuestaYama = desempaquetar(socketYama);

	if(respuestaYama.idMensaje != mensajeOk){
		log_error(loggerMaster,"No se pudo iniciar correctamente el job");
		exit(1);
	}

	log_trace(loggerMaster, "Envio correcto de datos a Yama.");

}
Example #7
0
int main (int argc, char* argv[])
{
	int bitsPorMuestreo;
	
	if ( argc != 4 ){
		printf( "Faltan argumentos - Deben ser 3 archivos:\n" );
		printf( "  - archivo de entrada 1 (monofonico)\n" );
        printf( "  - archivo de entrada 2 (monofonico)\n" );
        printf( "  - archivo de salida (esfonico)\n" );
		system( "pause" );
		return -1;
	}
	
	printf( "Archivo fuente 1 %s\n", argv[1] );	
	printf( "Archivo fuente  2 %s\n", argv[2] );
	printf( "Archivo Destino %s\n", argv[3] );
	system( "pause" );

	cargarWAVE( &Header, &pistaEntrada1, argv[1] );
	cargarWAVE( &Header, &pistaEntrada2, argv[2] );

	bitsPorMuestreo = detectarBitsPorMuestreo( &pistaEntrada1 );
  if ( bitsPorMuestreo != detectarBitsPorMuestreo( &pistaEntrada2 ) ){
    printf( "Los archivos tienen diferente numero de bits por muestreo\n" );
  }
	empaquetar( &pistaEntrada1, bitsPorMuestreo );
	empaquetar( &pistaEntrada2, bitsPorMuestreo );

	pistaSalida.bitsPerSample = bitsPorMuestreo;
	pistaSalida.numSamples = pistaEntrada1.numSamples;
	pistaSalida.SoundLength = 2*pistaEntrada1.SoundLength;
	pistaSalida.Sample = (unsigned short*)malloc( pistaSalida.SoundLength );

	unirArchivosWAVE( pistaEntrada1.numSamples, pistaEntrada1.Sample, pistaEntrada2.Sample, pistaSalida.Sample, bitsPorMuestreo );
	corregirHeader( &Header );
	desempaquetar( &pistaSalida, bitsPorMuestreo );
	escribirWAVE( &Header, &pistaSalida, argv[3] );

	printf ("Concluy� exitosamente.\n");
	system("pause");
	return 0;
}
Example #8
0
void* conectarseConWorkerAlmacenamiento(void* params){
	parametrosAlmacenamiento* parametrosConexion= malloc(sizeof(parametrosAlmacenamiento));
	respuestaAlmacenamiento* almacenamiento =(respuestaAlmacenamiento*) params;
	respuesta confirmacionWorker ;

	int socketWorker = crearSocket();
	struct sockaddr_in direccion = cargarDireccion(almacenamiento->ip.cadena,almacenamiento->puerto);
	if(!conectarCon(direccion, socketWorker, 2)){//2 id master
		mandarFalloEnReduccion();
		return 0;
	}

	log_trace(loggerMaster, "Inicio Almacenamiento Final con Worker %d", almacenamiento->nodo);

	parametrosConexion->rutaAlmacenamiento.longitud = miJob->rutaResultado.longitud;
	parametrosConexion->rutaAlmacenamiento.cadena= strdup(miJob->rutaResultado.cadena);
	parametrosConexion->archivoTemporal.cadena = strdup(almacenamiento->archivo.cadena);
	parametrosConexion->archivoTemporal.longitud = almacenamiento->archivo.longitud;

	empaquetar(socketWorker, mensajeProcesarAlmacenamiento, 0, parametrosConexion);

	confirmacionWorker = desempaquetar(socketWorker);

	switch(confirmacionWorker.idMensaje){
		case mensajeAlmacenamientoCompleto:
			log_trace(loggerMaster, "Informo YAMA fin de Almacenamiento Final en nodo.",almacenamiento->nodo);
			empaquetar(socketYama, mensajeAlmacenamientoCompleto, 0 , 0);
			break;
		case mensajeFalloAlmacenamiento:
		case mensajeDesconexion:
			log_trace(loggerMaster, "Informo a YAMA fallo en Almacenamiento Final del nodo %d.",almacenamiento->nodo);
			estadisticas->cantFallos++;
			empaquetar(socketYama, mensajeFalloAlmacenamiento, 0 , 0);
			break;
	}

	return 0;
}