diff --git a/maestro/pool_client.c b/maestro/pool_client.c index 51f9c77a34b3fdfa65defad4269277eed810c9d1..2958786bf01be3191942aa06fd0d321fb0057a11 100644 --- a/maestro/pool_client.c +++ b/maestro/pool_client.c @@ -616,17 +616,17 @@ mstro_pc__init_transfer_send_ticket(mstro_pool_operation op) ticket.n_segments = init->n_segments; ticket.distributed_cdo = init->distributed_cdo; - if (init->methods->supported[0] == MSTRO__POOL__TRANSPORT_KIND__MIO + if (op->pc_transport.methods->supported[0] == MSTRO__POOL__TRANSPORT_KIND__MIO && (!g_mio_available || (realsize % getpagesize()) != 0 ) ){ WARN("Not issuing a ticket with MIO. Either not available or CDO size (%zu)" " is not a multiple of the page size (%d)." " Will use maestro-core default transport\n", realsize, getpagesize()); - init->methods->supported[0] = MSTRO__POOL__TRANSPORT_KIND__OFI; + op->pc_transport.methods->supported[0] = MSTRO__POOL__TRANSPORT_KIND__OFI; } - status = mstro_pc__select_transfer_method(op->pc_transport.target_cdo, init->methods, + status = mstro_pc__select_transfer_method(op->pc_transport.target_cdo, op->pc_transport.methods, &ticket); if(status!=MSTRO_OK) { ERR("Failed to select transport method\n"); @@ -812,7 +812,26 @@ mstro_pc__init_transfer_reg_app(mstro_pool_operation op) } assert(op->pc_transport.target_ep!=NULL); - + + if(op->pc_transport.methods==NULL) + { + /**FIXME In a transfer ticket we do not know the transfer methods, so fake one*/ + Mstro__Pool__TransportKind ofi_method[1] = { MSTRO__POOL__TRANSPORT_KIND__OFI }; + Mstro__Pool__TransportMethods m = MSTRO__POOL__TRANSPORT_METHODS__INIT; + m.n_supported = 1; + m.supported = &ofi_method[0]; + size_t len = mstro__pool__transport_methods__get_packed_size(&m); + uint8_t *buf = malloc(sizeof(uint8_t)*len); + mstro__pool__transport_methods__pack(&m,buf); + Mstro__Pool__TransportMethods *methods = mstro__pool__transport_methods__unpack(NULL, len, buf); + op->pc_transport.methods = methods; + free(buf); + } + if(op->kind == MSTRO_OP_PC_INIT_TRANSFER) + { + //we should consume the transport methods in msg here + op->msg->initiate_transfer->methods = NULL; + } /* pass into registry */ status = mstro_pc_app_register(op->pc_transport.target_ep, op->pc_transport.target_addr, @@ -1235,18 +1254,8 @@ mstro_pc__op_maker(Mstro__Pool__MstroMsg **msg) op->pc_transport.target_ep = NULL; op->pc_transport.request = NULL; op->pc_transport.target_appid = (*msg)->transfer_ticket->srcid->id; - /**FIXME we do not know the transfer methods, so fake one*/ - Mstro__Pool__TransportKind ofi_method[1] = { MSTRO__POOL__TRANSPORT_KIND__OFI }; - Mstro__Pool__TransportMethods m = MSTRO__POOL__TRANSPORT_METHODS__INIT; - m.n_supported = 1; - m.supported = &ofi_method[0]; - size_t len = mstro__pool__transport_methods__get_packed_size(&m); - uint8_t *buf = malloc(sizeof(uint8_t)*len); - mstro__pool__transport_methods__pack(&m,buf); - Mstro__Pool__TransportMethods *methods = mstro__pool__transport_methods__unpack(NULL, len, buf); - op->pc_transport.methods = methods; + op->pc_transport.methods = NULL; op->pc_transport.target_serialized_endpoint = (*msg)->transfer_ticket->src_serialized_endpoint; - free(buf); break; case MSTRO__POOL__MSTRO_MSG__MSG_DECLARE_ACK: op->kind = MSTRO_OP_PC_DECLARE_ACK; diff --git a/maestro/pool_manager_registry.c b/maestro/pool_manager_registry.c index 1b85223b120fc3ed38f0cdfb567fc6a799ecf028..6c53fc31c9e48831d7ecf023c5c33a2a2fe4ed37 100644 --- a/maestro/pool_manager_registry.c +++ b/maestro/pool_manager_registry.c @@ -292,20 +292,8 @@ mstro_pc_app_register(struct mstro_endpoint *ep, e->serialized_desc = serialized_desc; e->pending = false; - e->transport_methods=malloc(sizeof(Mstro__Pool__TransportMethods)); - if(e==NULL) { - return MSTRO_NOMEM; - } - mstro__pool__transport_methods__init(e->transport_methods); - e->transport_methods->n_supported = transport_methods->n_supported; - e->transport_methods->supported = malloc(sizeof(Mstro__Pool__TransportKind)*transport_methods->n_supported); - if(e->transport_methods->supported==NULL) { - return MSTRO_NOMEM; - } - memcpy(e->transport_methods->supported, - transport_methods->supported, - sizeof(Mstro__Pool__TransportKind)*transport_methods->n_supported); - + e->transport_methods=transport_methods; + /* FIXME: we should check that there is no previous entry and * document whether that's an error or a legal way of overriding * things */