Commit c204fc30 authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Merge branch 'amiranda/47-the-c-api-should-not-rely-on-unique_ptr' into 'main'

Resolve "The C++ API should not rely on `unique_ptr`"

This MR removes the need to pass a `std::unique_ptr<admire::storage>` argument 
to `register_adhoc_storage` in the C++ API.

Tests are also updated to reflect this change and to remove dependencies with 
`ADM_storage_create()`, which in the future will become an internal function.

Finally, we fix some use-after-free memory management errors due to 
shortcomings in `managed_ctype`s and the creation function of C API types 
themselves. The errors are "fixed" by not deleting the data, which means that
we are now effectively leaking. So that tests pass, we set `detect_leaks=0` in
`ASAN_OPTIONS`.

Closes #47

See merge request !42
parents a4355a10 644f6d59
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ rpc:
  stage: test
  needs: [build]
  script:
    - export ASAN_OPTIONS=detect_odr_violation=0
    - export ASAN_OPTIONS=detect_odr_violation=0:detect_leaks=0
    - export LSAN_OPTIONS=verbosity=1:log_threads=1:suppressions=${CI_PROJECT_DIR}/tests/LSanSuppress.supp
    - export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib64:${CI_PROJECT_DIR}/compiled/lib
    - cd build/examples/
+15 −5
Original line number Diff line number Diff line
@@ -68,14 +68,24 @@ main(int argc, char* argv[]) {
            100, false);
    assert(ctx);

    ADM_storage_t st = ADM_storage_create("foobar", ADM_STORAGE_GEKKOFS, ctx);
    assert(st);
    const char* user_id = "adhoc_storage_42";

    ADM_job_requirements_t reqs =
            ADM_job_requirements_create(inputs, NINPUTS, outputs, NOUTPUTS, st);
    ADM_storage_t adhoc_storage;
    ADM_return_t ret =
            ADM_register_adhoc_storage(server, user_id, ctx, &adhoc_storage);

    if(ret != ADM_SUCCESS) {
        fprintf(stdout, "ADM_register_adhoc_storage() remote procedure not "
                        "completed successfully\n");
        exit_status = EXIT_FAILURE;
        goto cleanup;
    }

    ADM_job_requirements_t reqs = ADM_job_requirements_create(
            inputs, NINPUTS, outputs, NOUTPUTS, adhoc_storage);
    assert(reqs);

    ADM_return_t ret = ADM_register_job(server, job_resources, reqs, &job);
    ret = ADM_register_job(server, job_resources, reqs, &job);

    if(ret != ADM_SUCCESS) {
        fprintf(stdout, "ADM_register_job() remote procedure not completed "
+16 −5
Original line number Diff line number Diff line
@@ -64,18 +64,29 @@ main(int argc, char* argv[]) {
            100, false);
    assert(ctx);

    ADM_storage_t st = ADM_storage_create("foobar", ADM_STORAGE_GEKKOFS, ctx);
    assert(st);
    const char* user_id = "adhoc_storage_42";

    ADM_storage_t adhoc_storage;
    ADM_return_t ret =
            ADM_register_adhoc_storage(server, user_id, ctx, &adhoc_storage);

    if(ret != ADM_SUCCESS) {
        fprintf(stdout,
                "ADM_register_adhoc_storage() remote procedure not completed "
                "successfully\n");
        exit_status = EXIT_FAILURE;
        goto cleanup;
    }

    ADM_job_resources_t job_resources =
            ADM_job_resources_create(job_nodes, NJOB_NODES);
    assert(job_resources);

    ADM_job_requirements_t reqs =
            ADM_job_requirements_create(inputs, NINPUTS, outputs, NOUTPUTS, st);
    ADM_job_requirements_t reqs = ADM_job_requirements_create(
            inputs, NINPUTS, outputs, NOUTPUTS, adhoc_storage);
    assert(reqs);

    ADM_return_t ret = ADM_register_job(server, job_resources, reqs, &job);
    ret = ADM_register_job(server, job_resources, reqs, &job);

    if(ret != ADM_SUCCESS) {
        fprintf(stdout, "ADM_register_job() remote procedure not completed "
+16 −5
Original line number Diff line number Diff line
@@ -69,14 +69,25 @@ main(int argc, char* argv[]) {
            100, false);
    assert(ctx);

    ADM_storage_t st = ADM_storage_create("foobar", ADM_STORAGE_GEKKOFS, ctx);
    assert(st);
    const char* user_id = "adhoc_storage_42";

    ADM_job_requirements_t reqs =
            ADM_job_requirements_create(inputs, NINPUTS, outputs, NOUTPUTS, st);
    ADM_storage_t adhoc_storage;
    ADM_return_t ret =
            ADM_register_adhoc_storage(server, user_id, ctx, &adhoc_storage);

    if(ret != ADM_SUCCESS) {
        fprintf(stdout,
                "ADM_register_adhoc_storage() remote procedure not completed "
                "successfully\n");
        exit_status = EXIT_FAILURE;
        goto cleanup;
    }

    ADM_job_requirements_t reqs = ADM_job_requirements_create(
            inputs, NINPUTS, outputs, NOUTPUTS, adhoc_storage);
    assert(reqs);

    ADM_return_t ret = ADM_register_job(server, job_resources, reqs, &job);
    ret = ADM_register_job(server, job_resources, reqs, &job);

    if(ret != ADM_SUCCESS) {
        fprintf(stdout, "ADM_register_job() remote procedure not completed "
+0 −7
Original line number Diff line number Diff line
@@ -60,13 +60,6 @@ main(int argc, char* argv[]) {
            100, false);
    assert(ctx);

    ADM_storage_t st = ADM_storage_create("foobar", ADM_STORAGE_GEKKOFS, ctx);
    assert(st);

    ADM_job_requirements_t reqs =
            ADM_job_requirements_create(inputs, NINPUTS, outputs, NOUTPUTS, st);
    assert(reqs);

    const char* user_id = "adhoc_storage_42";

    ADM_storage_t adhoc_storage;
Loading