[Mochi-devel] Error in the bulk transfer example in Mochi documentation

Sim, Hyogi simh at ornl.gov
Thu Apr 9 15:18:10 CDT 2020


Hello,

I think the bulk transfer example program in the Mochi documentation (https://mochi.readthedocs.io/en/latest/margo/04_bulk.html) is wrong. Specifically, in the client code:

---
int32_t values[10] = { 1,4,2,5,6,3,5,3,2,5 };
hg_size_t size = 10*sizeof(int32_t);

hg_bulk_t local_bulk;
margo_bulk_create(mid, 1, (void**)&values, &size, HG_BULK_READ_ONLY, &local_bulk);
---

The second parameter of `margo_bulk_create` is expected to be an array of segment addresses (void * type). But, since `values` is an array (instead of a pointer), `&values` becomes the address of the first element in the array (instead of the address of the pointer as intended). This results in a segmentation fault when serializing the data (`hg_bulk_serialize_memcpy`), because it tries to access address '1' (the first integer element in the `values` array), instead of the address of the `values`:

---
Breakpoint 3 at 0x7ffff77aac2c: file /home/hyogi/workspace/mochi/mercury/src/mercury_bulk.c, line 405.
(gdb) c
Continuing.

Breakpoint 3, hg_bulk_create (hg_class=0xa04450, count=1, buf_ptrs=0x7fffffffd2a0, buf_sizes=0x7fffffffd2e8,
	flags=1 '\001', hg_bulk_ptr=0x7fffffffd230) at /home/hyogi/workspace/mochi/mercury/src/mercury_bulk.c:405
405         	hg_bulk->segments[i].size = buf_sizes[i];
(gdb) n
406         	hg_bulk->total_size += hg_bulk->segments[i].size;
(gdb)
408         	if (buf_ptrs)
(gdb)
409             	hg_bulk->segments[i].address = (hg_ptr_t) buf_ptrs[i];
(gdb) p buf_ptrs[i]
$5 = (void *) 0x400000001
(gdb) p (int)buf_ptrs[i]
$6 = 1

...

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6e1fb90 in __memcpy_sse2 () from /lib64/libc.so.6
(gdb) bt
#0  0x00007ffff6e1fb90 in __memcpy_sse2 () from /lib64/libc.so.6
#1  0x00007ffff77aa931 in hg_bulk_serialize_memcpy (dest=0x7fffffffced0, dest_left=0x7fffffffcec8,
	src=0x400000001, n=40) at /home/hyogi/workspace/mochi/mercury/src/mercury_bulk.c:332
#2  0x00007ffff77adedd in HG_Bulk_serialize (buf=0xa8c024, buf_size=107, request_eager=1 '\001', handle=0xa294c0)
	at /home/hyogi/workspace/mochi/mercury/src/mercury_bulk.c:1445
#3  0x000000000040118e in hg_proc_hg_bulk_t (proc=0xa290d0, data=0x7fffffffd2f8)
	at /home/hyogi/workspace/mochi/__prefix/include/mercury_proc_bulk.h:67
#4  0x000000000040134f in hg_proc_sum_in_t (proc=0xa290d0, data=0x7fffffffd2f0) at bulk-types.h:7
#5  0x00007ffff77a6076 in hg_set_struct (hg_handle=0xa29010, hg_proc_info=0xa19fc0, op=HG_INPUT,
	struct_ptr=0x7fffffffd2f0, payload_size=0x7fffffffd060, more_data=0x7fffffffd05f "")
	at /home/hyogi/workspace/mochi/mercury/src/mercury.c:642
#6  0x00007ffff77a9daf in HG_Forward (handle=0xa29010, callback=0x7ffff7bcf781 <margo_cb>, arg=0x7fffffffd210,
	in_struct=0x7fffffffd2f0) at /home/hyogi/workspace/mochi/mercury/src/mercury.c:1900
#7  0x00007ffff7bd0387 in margo_provider_iforward_internal (provider_id=0, handle=0xa29010, timeout_ms=0,
	in_struct=0x7fffffffd2f0, req=0x7fffffffd210) at ../src/margo.c:1264
#8  0x00007ffff7bd043b in margo_provider_forward_timed (provider_id=0, handle=0xa29010, in_struct=0x7fffffffd2f0,
	timeout_ms=0) at ../src/margo.c:1292
#9  0x00007ffff7bd03c3 in margo_provider_forward (provider_id=0, handle=0xa29010, in_struct=0x7fffffffd2f0)
	at ../src/margo.c:1272
#10 0x0000000000401630 in main (argc=2, argv=0x7fffffffd418) at bulk-client.c:57
(gdb) f 1
#1  0x00007ffff77aa931 in hg_bulk_serialize_memcpy (dest=0x7fffffffced0, dest_left=0x7fffffffcec8,
	src=0x400000001, n=40) at /home/hyogi/workspace/mochi/mercury/src/mercury_bulk.c:332
332     	memcpy(*dest, src, n);
(gdb) p src
$7 = (const void *) 0x400000001
(gdb)

---

So, the `values` array should be dynamically allocated as in the server code, or another pointer variable should be used before passing to `margo_bulk_create`:

--
void *pvalues = values;
margo_bulk_create(mid, 1, &pvalues, ...);
--

Thanks,
Hyogi



More information about the mochi-devel mailing list