Skip to content
Snippets Groups Projects
Commit c204fc30 authored by Alberto Miranda's avatar Alberto Miranda :hotsprings:
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
No related branches found
No related tags found
1 merge request!42Resolve "The C++ API should not rely on `unique_ptr`"
Pipeline #3209 passed
Showing
with 225 additions and 99 deletions
......@@ -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/
......
......@@ -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 "
......
......@@ -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 "
......
......@@ -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 "
......
......@@ -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;
......
......@@ -65,18 +65,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 "
......
......@@ -68,14 +68,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 "
......
......@@ -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 "
......
......@@ -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 "
......
......@@ -68,14 +68,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 "
......
......@@ -65,18 +65,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 "
......
......@@ -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;
......
......@@ -68,14 +68,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 "
......@@ -96,7 +107,7 @@ cleanup:
ADM_dataset_destroy(outputs[i]);
}
ADM_storage_destroy(st);
ADM_storage_destroy(adhoc_storage);
ADM_adhoc_context_destroy(ctx);
......
......@@ -57,9 +57,6 @@ main(int argc, char* argv[]) {
ADM_pfs_context_t ctx = ADM_pfs_context_create("/gpfs");
assert(ctx);
ADM_storage_t st = ADM_storage_create("barbaz", ADM_STORAGE_GPFS, ctx);
assert(st);
ADM_return_t ret = ADM_register_pfs_storage(server, ctx, &pfs_storage);
if(ret != ADM_SUCCESS) {
......
......@@ -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;
......
......@@ -68,14 +68,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 "
......
......@@ -42,9 +42,6 @@ main(int argc, char* argv[]) {
ADM_pfs_context_t ctx = ADM_pfs_context_create("/gpfs");
assert(ctx);
ADM_storage_t st = ADM_storage_create("barbaz", ADM_STORAGE_GPFS, ctx);
assert(st);
ADM_storage_t pfs_storage;
ADM_return_t ret = ADM_register_pfs_storage(server, ctx, &pfs_storage);
......
......@@ -65,18 +65,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 "
......
......@@ -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 "
......
......@@ -68,14 +68,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% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment