diff --git a/attributes/maestro-schema.c b/attributes/maestro-schema.c index d08fe67b7095cf03bfb267215d1e911b40864504..ac87c0d3e79c38504f2614a78575c289afd29493 100644 --- a/attributes/maestro-schema.c +++ b/attributes/maestro-schema.c @@ -730,10 +730,12 @@ mstro_attribute_val__compute_size(enum mstro_stp_val_kind kind, *val_size = sizeof(double); break; case MSTRO_STP_STR: case MSTRO_STP_REGEX: - if(string) + if(string!=NULL) *val_size = strlen(string)+1; - else + else { + assert(val!=NULL); *val_size = strlen((char*)val)+1; + } break; case MSTRO_STP_TIMESTAMP: *val_size = sizeof(mstro_timestamp); diff --git a/configure.ac b/configure.ac index d0243cd30d83fc04733da09bc838fab245f6490c..5e9274d497216637c1f50b96a494a4ff08fef909 100644 --- a/configure.ac +++ b/configure.ac @@ -175,7 +175,8 @@ AC_ARG_ENABLE([tsan], if test "x$enable_tsan" = "xyes"; then BUILD_TSAN=yes AX_CHECK_COMPILE_FLAG([-fsanitize=thread -fno-omit-frame-pointer], - [CFLAGS="${CFLAGS} -O1 -g -fsanitize=thread -fno-omit-frame-pointer"], + [CFLAGS="${CFLAGS} -O1 -g -fsanitize=thread -fno-omit-frame-pointer" + LDFLAGS="${LDFLAGS} -fsanitize=thread"], AC_MSG_ERROR([compiler does not support -fsanitize=thread flag])) else BUILD_TSAN=no @@ -423,7 +424,9 @@ AS_IF([test "x$enable_ofi_pool_manager" = "xyes"], [ AS_IF([test ! -f $srcdir/deps/libfabric/configure], [(cd $srcdir/deps/libfabric; ./autogen.sh)]) #AX_SUBDIRS_CONFIGURE([deps/libfabric],[[--enable-embedded],[--disable-rxm],[--disable-rxd],[--disable-psm]],[],[],[]) - AX_SUBDIRS_CONFIGURE([deps/libfabric],[[--enable-embedded],[--disable-rxd],[--disable-shm],[--disable-tcp],[--enable-debug]],[],[],[]) + dnl Configuring without kdreg to fix issue https://gitlab.com/cerl/maestro/maestro-core/-/issues/117 which relates to https://github.com/ofiwg/libfabric/issues/5313 + dnl Whether doing so creates a performance problem or not is still to be determined + AX_SUBDIRS_CONFIGURE([deps/libfabric],[[--enable-embedded],[--disable-rxd],[--disable-shm],[--disable-tcp],[--with-kdreg=no],[--enable-debug]],[],[],[]) AC_MSG_NOTICE([================== done preconfiguring private libfabric library build]) ]) diff --git a/include/maestro/attributes.h b/include/maestro/attributes.h index 0788c5d2b6f124f4d313a6694c2971dda7dcc31f..5a66bafe6027b168b4c24c97da95f6e3327df601 100644 --- a/include/maestro/attributes.h +++ b/include/maestro/attributes.h @@ -314,18 +314,20 @@ typedef struct mstro_cdo_ *mstro_cdo; /** ** @brief Add (*key*, *val*) pair to attribute set of *cdo* ** - ** @param[in] cdo A CDO handle - ** @param[in] key Attribute key string - ** @param[in] val Pointer to the value to be set + ** @param[in] cdo A CDO handle + ** @param[in] key Attribute key string + ** @param[in] val Pointer to the value to be set + ** @param[in] copy_value Create an internal allocation for the value and + ** copy @arg val into it ** - ** BEWARE: The memory pointed to by val must remain valid for the - ** entire lifetime of the CDO. Stack-allocated variables passed in by - ** address are a source of ugly to trace bugs. + ** BEWARE: If copy_value is set to false, the memory pointed to by val must + ** remain valid for the entire lifetime of the CDO. Stack-allocated variables + ** passed in by address are a source of ugly to trace bugs. ** ** @returns A status code, ::MSTRO_OK on success. **/ mstro_status -mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val); +mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val, bool copy_value); /** ** @brief Retrieve value into *val_p* associated with *key* of *cdo*. diff --git a/maestro/attributes.c b/maestro/attributes.c index 8a3250ad128fbd37cab2f289edaf82a01de5ae32..501170a41d27247172d53cbff399ab8567562a55 100644 --- a/maestro/attributes.c +++ b/maestro/attributes.c @@ -127,7 +127,7 @@ mstro_cdo_attr_table__destroy(mstro_cdo_attr_table tab) } mstro_status -mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val) +mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val, bool copy_value) { if(cdo==NULL || key==NULL) return MSTRO_INVARG; @@ -163,7 +163,7 @@ mstro_cdo_attribute_set(mstro_cdo cdo, const char* key, void* val) mstro_status status = mstro_attribute_dict_set(cdo->attributes, fqkey, MSTRO_CDO_ATTR_VALUE_INVALID, /* we dont help in checking */ - val, false); + val, copy_value); if(tmpfqkey) free(tmpfqkey); return status; diff --git a/maestro/cdo.c b/maestro/cdo.c index 15c2d4990328c3a8ac3b9f27b54c24ba746d8971..4a340c8a7349e6658470ccf3194d4479ca9435a8 100644 --- a/maestro/cdo.c +++ b/maestro/cdo.c @@ -452,10 +452,10 @@ mstro_cdo__create_mamba_array(mstro_cdo cdo) int64_t* ndims, *patt, *localsz, *elsz; size_t* dimsz; - DEBUG("Sync'ing mamba_array and attributes (CDO `%s`)\n", cdo->name); - s = mstro_cdo_attribute_get(cdo, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, NULL, (const void**)&localsz); + DEBUG("Sync'ing mamba_array (size: %zu) and attributes (CDO `%s`)\n", (size_t)*localsz, cdo->name); + /* fetching minimal set of attributes for custom layout */ s |= mstro_cdo_attribute_get(cdo, MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, NULL, (const void**)&elsz); @@ -528,6 +528,7 @@ mstro_cdo__create_mamba_array(mstro_cdo cdo) } if(me != MMB_OK) { + status = MSTRO_FAIL; ERR("Failed to create mamba array\n"); goto BAILOUT; } @@ -746,8 +747,8 @@ mstro_cdo_declaration_seal(mstro_cdo cdo) idstr, &cdo->id, DEBUG("CDO %s (id %s) now sealed\n", cdo->name, idstr);); - - status = MSTRO_OK; + + status = MSTRO_OK; BAILOUT: return status; @@ -1850,7 +1851,7 @@ mstro_cdo_allocate_data(mstro_cdo cdo) MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, MSTRO_CDO_ATTR_VALUE_pointer, dimsz, true); if (s != MSTRO_OK) { - ERR("Can't sync mamba array because attribute_set failed\n"); + ERR("Can't sync mamba array because dict_set failed\n"); return MSTRO_FAIL; } } else { @@ -1874,6 +1875,7 @@ mstro_cdo_allocate_data(mstro_cdo cdo) } /* now we know a size */ int64_t size = *(const int64_t*)valp; + DEBUG("size (%" PRIi64 ")\n", size); if(size<0 && cdo->raw_ptr!=NULL) { ERR("CDO |%s| has negative local-size but non-NULL raw-ptr, unsupported\n", @@ -1886,6 +1888,8 @@ mstro_cdo_allocate_data(mstro_cdo cdo) ERR("Failed to create mmbArray wrapper for raw-ptr\n"); return s; } + DEBUG("size (%" PRIi64 ")\n", size); + } return MSTRO_OK; diff --git a/maestro/groups.c b/maestro/groups.c index 16d4862aa5903f7652d2d8d555690fa7142267fa..6a7f7cdd65437d85217eec66d871351138520aa1 100644 --- a/maestro/groups.c +++ b/maestro/groups.c @@ -204,7 +204,7 @@ mstro_group_declare(const char *name, mstro_group* group) if(s==MSTRO_OK) { bool trueval = true; s = mstro_cdo_attribute_set((*group)->group_cdo, - MSTRO_ATTR_CORE_CDO_ISGROUP, &trueval); + MSTRO_ATTR_CORE_CDO_ISGROUP, &trueval, true); if(s==MSTRO_OK) { DEBUG("Declared CDO group |%s|\n", name); (*group)->state = MSTRO_GROUP_STATE_DECLARED; @@ -312,20 +312,21 @@ mstro_group_seal(mstro_group g) HASH_ITER(hh, g->members, el, tmp) { m->declared_members[i] = malloc(sizeof(Mstro__Pool__UUID)); /* need to ensure the GID is ready */ - mstro_status s = mstro_cdo_seal(el->entry); - if(s!=MSTRO_OK) { - ERR("Failed to seal declared group member: %d\n", s); - } - if(s!=MSTRO_OK || m->declared_members[i]==NULL) { - for(size_t j=i; j>0; j--) { - free(m->declared_members[j-1]); - }; - free(m->declared_members); - m->declared_members=NULL; - goto BAILOUT_FREE; - + if(!mstro_cdo_state_check(el->entry, MSTRO_CDO_STATE_SEALED)) { + mstro_status s = mstro_cdo_seal(el->entry); + if(s!=MSTRO_OK) { + ERR("Failed to seal declared group member: %d\n", s); + } + if(s!=MSTRO_OK || m->declared_members[i]==NULL) { + for(size_t j=i; j>0; j--) { + free(m->declared_members[j-1]); + }; + free(m->declared_members); + m->declared_members=NULL; + goto BAILOUT_FREE; + + } } - mstro__pool__uuid__init(m->declared_members[i]); m->declared_members[i]->qw0 = el->entry->gid.qw[0]; m->declared_members[i]->qw1 = el->entry->gid.qw[1]; @@ -374,7 +375,7 @@ mstro_group_seal(mstro_group g) s = mstro_cdo_attribute_set(g->group_cdo, MSTRO_ATTR_CORE_CDO_GROUP_MEMBERS, - blob); + blob, false); if(s!=MSTRO_OK) goto BAILOUT_FREE; diff --git a/maestro/pool_client.c b/maestro/pool_client.c index 87a15d014032296c3db66ad2f5bfbe5eb0c8681b..a2e169e20fac4c28f7447de9c442290a02e02338 100644 --- a/maestro/pool_client.c +++ b/maestro/pool_client.c @@ -386,22 +386,28 @@ mstro_pc__handle_initiate_transfer(const Mstro__Pool__InitiateTransfer* init) Mstro__Pool__TransferTicket ticket = MSTRO__POOL__TRANSFER_TICKET__INIT; ticket.cdoid = &id; - const int64_t *size; - enum mstro_cdo_attr_value_type type; - if (! (MSTRO_OK == mstro_cdo_attribute_get(src_cdo, - MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - &type, (const void**)&size))) { - ERR("Couldn't retrieve CDO %s local_size needed for transport\n", src_cdo->name); + mstro_status s=MSTRO_UNIMPL; + const void *size=NULL; + enum mstro_cdo_attr_value_type vt; + s = mstro_attribute_dict_get(src_cdo->attributes, + MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, + &vt, &size, NULL, false); + if(s==MSTRO_NOENT && vt==MSTRO_CDO_ATTR_VALUE_INVALID) { + ERR("CDO has mamba-array but no local-size\n"); return MSTRO_FAIL; } - int64_t realsize = *size; + if(s!=MSTRO_OK) { + ERR("Failed to retrieve local-size on CDO\n"); + return MSTRO_FAIL; + } + + int64_t realsize = *(int64_t*)size; if(realsize==-1) { DEBUG("Source CDO empty, doing NULL transfer\n"); realsize = 0; } - if (!g_mio_available - || (( realsize % getpagesize()) != 0 - && init->methods->supported[0] == MSTRO__POOL__TRANSPORT_KIND__MIO) + if ( init->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)." @@ -433,7 +439,7 @@ mstro_pc__handle_initiate_transfer(const Mstro__Pool__InitiateTransfer* init) status, mstro_status_description(status)); return status; } - gfs.keep_file = 0; // Arbitrarily rm the transport file on dst + gfs.keep_file = 1; // don't arbitrarily rm the transport file on dst break; case MSTRO__POOL__TRANSFER_TICKET__TICKET_MIO: INFO("TICKET CASE MIO\n"); @@ -507,7 +513,7 @@ mstro_pc__handle_initiate_transfer(const Mstro__Pool__InitiateTransfer* init) INFO("Issued ticket for CDO %s, and starting execute process\n", src_cdo->name); //INFO("TransferTicket using path %s\n", ticket.gfs->path); - INFO("TransferTicket cdo size %zu\n", ticket.data_size); + INFO("TransferTicket cdo size %" PRIi64 "\n", ticket.data_size); /* Execute transport (non-blocking) */ status = mstro_transport_execute(src_cdo, &ticket); diff --git a/tests/Makefile.am b/tests/Makefile.am index 698b3d4b199d2c7f1aa54917096cd0f30fc58263..e9c51d30a780227fa2412cc8763e3f7702d661a2 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -183,6 +183,11 @@ clean-local-check: -rm -f $(top_builddir)/tests/consumer_CDO\ [0-9]* -rm -f $(top_builddir)/tests/mio-config*.yaml -rm -f $(top_builddir)/tests/m0trace.* + -rm -f $(top_builddir)/tests/C-handle\ [0-9]* + -rm -f $(top_builddir)/tests/C-name\ [0-9]* + -rm -f $(top_builddir)/tests/{Consumer,Producer}-done-CDO + -rm -f $(top_builddir)/tests/Test\ group + -rm -f $(top_builddir)/tests/cdo[0-9]* .PHONY: all diff --git a/tests/check_declaration_seal.c b/tests/check_declaration_seal.c index d6002797ca56e2ab10d39f6e725a2345e997c2b4..8648bf5735c6081dff718dc86d52e6b64bd12169 100644 --- a/tests/check_declaration_seal.c +++ b/tests/check_declaration_seal.c @@ -97,12 +97,12 @@ CHEAT_TEST(cdo_declaration_seal_works, cheat_assert(!(MSTRO_OK == mstro_cdo_attribute_set( cdo, "maestro.core.cdo.scope.local-size", - &size))); // not an absolute path, not a valid relative path + &size, true))); // not an absolute path, not a valid relative path cheat_assert(MSTRO_OK == mstro_cdo_attribute_set( cdo, ".maestro.core.cdo.scope.local-size", - &size)); + &size, true)); cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo)); diff --git a/tests/check_layout.c b/tests/check_layout.c index e3d4f4190fefa72a2b88e4415d8a81ebf60d2033..3570ff2ac0c3ac7957d2ef37b17d780902f822fa 100644 --- a/tests/check_layout.c +++ b/tests/check_layout.c @@ -130,32 +130,32 @@ CHEAT_TEST(layout_attribute_works, cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_src)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, MSTRO_ATTR_CORE_CDO_RAW_PTR, - src_data)); + src_data, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - (void**)&bytes)); + (void**)&bytes, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, - MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, - MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims)); + MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, - MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src)); + MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, - MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src, true)); cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_src)); cheat_assert(MSTRO_OK == mstro_cdo_offer(cdo_src)); /* Consumer side */ cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_dst)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst, - MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst, - MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims)); + MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst, - MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst)); + MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst, - MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst, true)); cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_dst)); cheat_assert(MSTRO_OK == mstro_cdo_require(cdo_dst)); @@ -167,18 +167,18 @@ CHEAT_TEST(layout_attribute_works, cheat_assert(MSTRO_OK == mstro_cdo_declare(name_unpooled, MSTRO_ATTR_DEFAULT, &cdo_unpooled)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - (void**)&bytes)); + (void**)&bytes, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled, MSTRO_ATTR_CORE_CDO_RAW_PTR, - unpooled_data)); + unpooled_data, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled, - MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled, - MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims)); + MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled, - MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst)); + MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_dst, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled, - MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_dst, true)); cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_unpooled)); /* at this point cdo_unpooled has a mamba array (raw-ptr wrapper) */ @@ -200,18 +200,18 @@ CHEAT_TEST(layout_attribute_works, cheat_assert(MSTRO_OK == mstro_cdo_declare(name_unpooled, MSTRO_ATTR_DEFAULT, &cdo_unpooled_t)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - (void**)&bytes)); + (void**)&bytes, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, MSTRO_ATTR_CORE_CDO_RAW_PTR, - unpooled_data_t)); + unpooled_data_t, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, - MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ELEMENT_SIZE, &elsz, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, - MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims)); + MSTRO_ATTR_CORE_CDO_LAYOUT_NDIMS, &ndims, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, - MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src)); + MSTRO_ATTR_CORE_CDO_LAYOUT_DIMS_SIZE, dimsz_src, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_unpooled_t, - MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src)); + MSTRO_ATTR_CORE_CDO_LAYOUT_ORDER, &patt_src, true)); cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_unpooled_t)); cheat_assert(MSTRO_OK == mstro_transform_layout(cdo_unpooled, cdo_unpooled_t, diff --git a/tests/check_pool_local_rawptr.c b/tests/check_pool_local_rawptr.c index 24ff530aefd8ebecff4fe83465599e23c7d69381..55ba01edf81f3bbf7444eab08b5b507890222438 100644 --- a/tests/check_pool_local_rawptr.c +++ b/tests/check_pool_local_rawptr.c @@ -77,10 +77,10 @@ CHEAT_TEST(cdo_local_pool_works, cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(src_cdo, MSTRO_ATTR_CORE_CDO_RAW_PTR, - src_data)); + src_data, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(dst_cdo, MSTRO_ATTR_CORE_CDO_RAW_PTR, - dst_data)); + dst_data, false)); cheat_yield(); cheat_assert(MSTRO_OK == mstro_cdo_require(dst_cdo)); cheat_yield(); diff --git a/tests/check_pool_mamba.c b/tests/check_pool_mamba.c index d543c6d4fa7be15d08316e46f5bc5a5132935dd8..76e959ecdfbc74d303c35739f44049e9d247ba1d 100644 --- a/tests/check_pool_mamba.c +++ b/tests/check_pool_mamba.c @@ -63,10 +63,10 @@ CHEAT_TEST(cdo_local_pool_mamba_works, // TODO associate (cdo, mmb_array_ptr) cheat_assert(MSTRO_OK == mstro_cdo_attribute_set( - cdo, ".maestro.core.cdo.raw-ptr", (void*)buf)); + cdo, ".maestro.core.cdo.raw-ptr", (void*)buf, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set( - cdo, ".maestro.core.cdo.scope.local-size", &size)); + cdo, ".maestro.core.cdo.scope.local-size", &size, true)); mmbArray *mamba_ptr=NULL; /* mamba array not automatically available */ diff --git a/tests/check_transport_gfs.c b/tests/check_transport_gfs.c index 749a03415b7de2c3596240b5b1c03850fe4875e7..05e651307c9f482b65c9d59ec8f5840ce54595d5 100644 --- a/tests/check_transport_gfs.c +++ b/tests/check_transport_gfs.c @@ -87,10 +87,10 @@ CHEAT_TEST(transport_gfs_works, cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_src)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, MSTRO_ATTR_CORE_CDO_RAW_PTR, - src_data)); + src_data, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - (void**)&bytes)); + (void**)&bytes, true)); cheat_yield(); enum mstro_cdo_attr_value_type ttype; @@ -141,7 +141,7 @@ CHEAT_TEST(transport_gfs_works, cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_dst, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - (void**)&bytes)); + (void**)&bytes, true)); cheat_assert(MSTRO_OK == mstro_cdo_declaration_seal(cdo_dst)); cheat_assert(MSTRO_OK == mstro_transport_gfs_dst_execute(cdo_dst, &ticket)); diff --git a/tests/check_transport_mio.c b/tests/check_transport_mio.c index a2e8a0a187da9cc750ceb891bab4bee0bddbb3f7..f2eb2e065639efb06aea6d09bab708bfe5d6d08f 100644 --- a/tests/check_transport_mio.c +++ b/tests/check_transport_mio.c @@ -89,13 +89,13 @@ CHEAT_DECLARE ( cheat_assert(MSTRO_OK == mstro_cdo_declare(name, MSTRO_ATTR_DEFAULT, &cdo_src)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, MSTRO_ATTR_CORE_CDO_RAW_PTR, - src_data)); + src_data, false)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, ".maestro.core.cdo.scope.local-size", - &bytes)); + &bytes, true)); cheat_assert(MSTRO_OK == mstro_cdo_attribute_set(cdo_src, ".maestro.core.cdo.layout.pre-pad", - &pad)); + &pad, true)); const int64_t* tval; diff --git a/tests/demo_mvp_d3_2.c b/tests/demo_mvp_d3_2.c index fa324de78108876c79bda5aab810270351dfd1fe..0855944df6759324aa0314465b09192a4558d073 100644 --- a/tests/demo_mvp_d3_2.c +++ b/tests/demo_mvp_d3_2.c @@ -237,7 +237,7 @@ wait_for_announcement(struct cdo_announcement *announcement) } s = mstro_cdo_attribute_set(announcement_cdo, MSTRO_ATTR_CORE_CDO_RAW_PTR, - announcement); + announcement, false); if(s!=MSTRO_OK) { ERR("Failed to set raw-ptr attribute on announcement CDO\n"); abort(); @@ -286,7 +286,7 @@ do_announce(struct cdo_announcement *announcement, mstro_cdo *result) } s = mstro_cdo_attribute_set(announcement_cdo, MSTRO_ATTR_CORE_CDO_RAW_PTR, - announcement); + announcement, false); if(s!=MSTRO_OK) { ERR("Failed to set raw-ptr attribute on announcement CDO\n"); @@ -550,10 +550,10 @@ archiver_thread_fun(void *closure) } s = mstro_cdo_attribute_set(incoming[i], MSTRO_ATTR_CORE_CDO_RAW_PTR, - incoming_buffers[i]); + incoming_buffers[i], false); s |= mstro_cdo_attribute_set(incoming[i], MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - &announcement->cdo_size); + &announcement->cdo_size, true); // INFO("archiver cdo %d incoming buffer %p\n", i, incoming_buffers[i]); if(s!=MSTRO_OK) { @@ -671,10 +671,10 @@ producer_thread_fun(void *closure) s = mstro_cdo_attribute_set(outgoing[i], MSTRO_ATTR_CORE_CDO_RAW_PTR, - outgoing_buffers[i]); + outgoing_buffers[i], false); s |= mstro_cdo_attribute_set(outgoing[i], MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - &announcement->cdo_size); + &announcement->cdo_size, true); if(s!=MSTRO_OK) { ERR("Failed to add outgoing buffer to CDO %s\n", @@ -803,10 +803,10 @@ consumer_thread_fun(void *closure) } s = mstro_cdo_attribute_set(incoming[i], MSTRO_ATTR_CORE_CDO_RAW_PTR, - incoming_buffers[i]); + incoming_buffers[i], false); s |= mstro_cdo_attribute_set(incoming[i], MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - &announcement->cdo_size); + &announcement->cdo_size, true); // INFO("consumer cdo %d incoming buffer %p\n", i, incoming_buffers[i]); if(s!=MSTRO_OK) { diff --git a/tests/simple_interlock_client.c b/tests/simple_interlock_client.c index c71f47a64a6b97c969e1795fb7a923d7aae7ac03..5b4e4fde9a66581505adde34535c116bd54f8e95 100644 --- a/tests/simple_interlock_client.c +++ b/tests/simple_interlock_client.c @@ -194,11 +194,11 @@ CHEAT_DECLARE( cheat_assert(MSTRO_OK==mstro_cdo_attribute_set( e->cdo, MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, - &s->size)); + &s->size, true)); cheat_assert(MSTRO_OK==mstro_cdo_attribute_set( e->cdo, MSTRO_ATTR_CORE_CDO_RAW_PTR, - e->buf)); + e->buf, false)); fprintf(stderr, "declared %s, handle %x\n", e->name, e->cdo); break; diff --git a/transport/gfs.c b/transport/gfs.c index a8844e5d345b9fc50130e45281a3c97888f74e87..c3b12490ba3e9d800654b5902b664bc273ab8f70 100644 --- a/transport/gfs.c +++ b/transport/gfs.c @@ -82,10 +82,14 @@ mstro_transport_gfs_src_execute(mstro_cdo src, Mstro__Pool__TransferTicket* tick return MSTRO_FAIL; } - if (fwrite(dl.data, sizeof(char), dl.len/sizeof(char), f) != dl.len) { - ERR("Partial write on %s (buf: %p) for GFS transport (errno: %d -- %s)\n", +RETRY_GFS_TRANSPORT_WRITE: ; + size_t bytes_written = fwrite(dl.data, sizeof(char), dl.len, f); + if (bytes_written != dl.len) { + if (errno == EAGAIN) + goto RETRY_GFS_TRANSPORT_WRITE; + ERR("Partial write on %s (buf: %p) for GFS transport (errno: %d -- %s)\n", path, dl.data, errno, strerror(errno)); - return MSTRO_FAIL; + return MSTRO_FAIL; } if (fclose(f) != 0) { @@ -113,10 +117,10 @@ mstro_transport_gfs_dst_execute(mstro_cdo dst, INFO("Executing gfs transport dst side for CDO %s\n", dst->name); mstro_status status; - int64_t len = ticket->data_size; + size_t len = (size_t)ticket->data_size; char* data; - DEBUG("Incoming CDO, size %" PRIi64 "\n", len); + DEBUG("Incoming CDO, size %zu\n", len); status = mstro_transport_get_dst_buffer(dst, (void*)&data); if(status!=MSTRO_OK) { @@ -140,10 +144,13 @@ mstro_transport_gfs_dst_execute(mstro_cdo dst, path, errno, strerror(errno)); return MSTRO_FAIL; } - - if (fread(data, sizeof(char), len, f) != (size_t)len) { - ERR("Partial read on %s for GFS transport (errno: %d -- %s)\n", - path, errno, strerror(errno)); +RETRY_GFS_TRANSPORT_READ: ; + size_t bytes_read = fread(data, sizeof(char), len, f); + if (bytes_read != (size_t)len) { + if (errno == EAGAIN) + goto RETRY_GFS_TRANSPORT_READ; + ERR("Partial read (%d out of %d bytes) on %s for GFS transport (errno: %d -- %s)\n", + bytes_read, len, path, errno, strerror(errno)); return MSTRO_FAIL; } diff --git a/transport/transport.c b/transport/transport.c index 4c3f6d73c038e50792a953809daa591e908582ca..0690af7edff5ead202d06172de6cb67b7c0c930f 100644 --- a/transport/transport.c +++ b/transport/transport.c @@ -371,9 +371,32 @@ mstro_transport_execute( if (cdo->state & MSTRO_CDO_STATE_OFFERED) { /* we are called on the source side of transport */ { - /* FIXME: should check this for robustness: */ - DEBUG("Not checking that SRC cdo has expected size (%" PRIi64 ")\n", - ticket->data_size); + /* let's check ticket size matches local CDO size */ + enum mstro_cdo_attr_value_type type; + const void *sizep=NULL; + int64_t src_size; + mstro_status s = mstro_attribute_dict_get(cdo->attributes, + MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, + &type, &sizep, NULL, false); + if(s==MSTRO_OK) { + src_size=*(int64_t*)sizep; + } else if(s==MSTRO_NOENT && type==MSTRO_CDO_ATTR_VALUE_INVALID) { + ERR("Attribute not found or value invalid\n"); + src_size=-1; + } else { + ERR("Failed to look up %s (%d: %s)\n", + MSTRO_ATTR_CORE_CDO_SCOPE_LOCAL_SIZE, s, mstro_status_description(s)); + return MSTRO_FAIL; + } + + if (ticket->data_size == 0) { + DEBUG("0-transport\n"); + } + else if (src_size != ticket->data_size) { + ERR("SRC cdo has a size (%" PRIi64 ") that doesn't match ticket-specified size (%" PRIi64 ")\n", + src_size, ticket->data_size); + return MSTRO_FAIL; + } } mstro_status (*f)(mstro_cdo src, Mstro__Pool__TransferTicket *t) = g_transport_registry[ticket->method].src_func;