Commit ef9ae7a5 authored by Philip Carns's avatar Philip Carns

stub client-side benchmark

parent 30ce0aa1
noinst_PROGRAMS += examples/composition/svc-daemon
noinst_PROGRAMS += examples/composition/composed-svc-daemon examples/composition/composed-benchmark
examples_composition_svc_daemon_SOURCES = \
examples/composition/svc-daemon.c \
examples_composition_composed_svc_daemon_SOURCES = \
examples/composition/composed-svc-daemon.c \
examples/composition/data-xfer-service.c \
examples/composition/delegator-service.c
examples_composition_composed_benchmark_SOURCES = \
examples/composition/composed-benchmark.c \
examples/composition/composed-client-lib.c
/*
* (C) 2015 The University of Chicago
*
* See COPYRIGHT in top-level directory.
*/
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <abt.h>
#include <abt-snoozer.h>
#include <margo.h>
#include "composed-client-lib.h"
static hg_id_t my_rpc_shutdown_id;
static void* buffer;
static hg_size_t buffer_sz = 8*1024*1024;
int main(int argc, char **argv)
{
int i;
int ret;
margo_instance_id mid;
hg_context_t *hg_context;
hg_class_t *hg_class;
hg_addr_t svr_addr = HG_ADDR_NULL;
hg_handle_t handle;
char proto[12] = {0};
if(argc != 2)
{
fprintf(stderr, "Usage: ./client <server_addr>\n");
return(-1);
}
/* boilerplate HG initialization steps */
/***************************************/
/* initialize Mercury using the transport portion of the destination
* address (i.e., the part before the first : character if present)
*/
for(i=0; i<11 && argv[1][i] != '\0' && argv[1][i] != ':'; i++)
proto[i] = argv[1][i];
hg_class = HG_Init(proto, HG_FALSE);
if(!hg_class)
{
fprintf(stderr, "Error: HG_Init()\n");
return(-1);
}
hg_context = HG_Context_create(hg_class);
if(!hg_context)
{
fprintf(stderr, "Error: HG_Context_create()\n");
HG_Finalize(hg_class);
return(-1);
}
/* set up argobots */
/***************************************/
ret = ABT_init(argc, argv);
if(ret != 0)
{
fprintf(stderr, "Error: ABT_init()\n");
return(-1);
}
/* set primary ES to idle without polling */
ret = ABT_snoozer_xstream_self_set();
if(ret != 0)
{
fprintf(stderr, "Error: ABT_snoozer_xstream_self_set()\n");
return(-1);
}
/* actually start margo */
/***************************************/
mid = margo_init(0, 0, hg_context);
/* register core RPC */
my_rpc_shutdown_id = MERCURY_REGISTER(hg_class, "my_shutdown_rpc", void, void,
NULL);
/* register service APIs */
data_xfer_register_client(mid);
/* find addr for server */
ret = margo_addr_lookup(mid, argv[1], &svr_addr);
assert(ret == 0);
buffer = calloc(1, buffer_sz);
assert(buffer);
data_xfer_read(mid, svr_addr, buffer, buffer_sz);
/* send one rpc to server to shut it down */
/* create handle */
ret = HG_Create(hg_context, svr_addr, my_rpc_shutdown_id, &handle);
assert(ret == 0);
margo_forward(mid, handle, NULL);
HG_Addr_free(hg_class, svr_addr);
/* shut down everything */
margo_finalize(mid);
ABT_finalize();
HG_Context_destroy(hg_context);
HG_Finalize(hg_class);
free(buffer);
return(0);
}
/*
* (C) 2015 The University of Chicago
*
* See COPYRIGHT in top-level directory.
*/
#include <stdio.h>
#include <assert.h>
#include <unistd.h>
#include <abt.h>
#include "composed-client-lib.h"
#include "delegator-proto.h"
#include "data-xfer-proto.h"
/* NOTE: just making these global for test example, would be cleaner if there
* were an instance pointer for the client.
*/
static hg_id_t delegator_read_id = -1;
static hg_id_t data_xfer_read_id = -1;
int composed_register_client(margo_instance_id mid)
{
delegator_read_id = MERCURY_REGISTER(margo_get_class(mid), "delegator_read",
delegator_read_in_t, delegator_read_out_t, NULL);
return(0);
}
int data_xfer_register_client(margo_instance_id mid)
{
data_xfer_read_id = MERCURY_REGISTER(margo_get_class(mid), "data_xfer_read",
data_xfer_read_in_t, data_xfer_read_out_t, NULL);
return(0);
}
void data_xfer_read(margo_instance_id mid, hg_addr_t svr_addr, void *buffer, hg_size_t buffer_sz)
{
hg_handle_t handle;
data_xfer_read_in_t in;
data_xfer_read_out_t out;
int ret;
const struct hg_info *hgi;
/* create handle */
ret = HG_Create(margo_get_context(mid), svr_addr, data_xfer_read_id, &handle);
assert(ret == 0);
/* register buffer for rdma/bulk access by server */
hgi = HG_Get_info(handle);
assert(hgi);
ret = HG_Bulk_create(hgi->hg_class, 1, &buffer, &buffer_sz,
HG_BULK_WRITE_ONLY, &in.bulk_handle);
assert(ret == 0);
#if 0
HG_Set_target_id(handle, mplex_id);
#endif
/* Send rpc. Note that we are also transmitting the bulk handle in the
* input struct. It was set above.
*/
margo_forward(mid, handle, &in);
/* decode response */
ret = HG_Get_output(handle, &out);
assert(ret == 0);
/* clean up resources consumed by this rpc */
HG_Bulk_free(in.bulk_handle);
HG_Free_output(handle, &out);
HG_Destroy(handle);
return;
}
/*
* (C) 2015 The University of Chicago
*
* See COPYRIGHT in top-level directory.
*/
#ifndef __COMPOSED_CLIENT_LIB
#define __COMPOSED_CLIENT_LIB
#include <margo.h>
int composed_register_client(margo_instance_id mid);
void composed_read(margo_instance_id mid, hg_addr_t svr_addr, void* buffer, hg_size_t buffer_sz);
int data_xfer_register_client(margo_instance_id mid);
void data_xfer_read(margo_instance_id mid, hg_addr_t svr_addr, void* buffer, hg_size_t buffer_sz);
#endif /* __COMPOSED_CLIENT_LIB */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment