branch, master, updated. 6dd1bc027610d634f593c684bbbb889442e9d7ce
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "". The branch, master has been updated via 6dd1bc027610d634f593c684bbbb889442e9d7ce (commit) via 3eba25b7d105cb1f1d95d1aaeca624680b7724a9 (commit) from e776d4c22179adcf7e6c6741efc397aa0d24e629 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6dd1bc027610d634f593c684bbbb889442e9d7ce Author: Kevin Harms <[email protected]> Date: Mon Jun 23 20:29:09 2014 -0500 fix debug mask setting in launch script commit 3eba25b7d105cb1f1d95d1aaeca624680b7724a9 Author: Kevin Harms <[email protected]> Date: Mon Jun 23 20:27:02 2014 -0500 Initial asg/rosd/tosd reset functionality ----------------------------------------------------------------------- Summary of changes: code/scripts/launch_servers.sh | 2 +- code/src/asg/asg-internal.ae | 46 +++++++- code/src/replicated-osd/Makefile.subdir | 2 + code/src/replicated-osd/rosd-internal.hae | 1 + code/src/replicated-osd/rosd-reset.ae | 152 ++++++++++++++++++++++ code/src/replicated-osd/rosd.ae | 1 + code/src/replicated-osd/rosd.hae | 10 ++ code/src/transactional-osd/transactional-osd.ae | 120 +++++++++++++++-- code/src/transactional-osd/transactional-osd.hae | 11 ++ 9 files changed, 330 insertions(+), 15 deletions(-) create mode 100644 code/src/replicated-osd/rosd-reset.ae Diff of changes: diff --git a/code/scripts/launch_servers.sh b/code/scripts/launch_servers.sh index e74622e..83ae3bd 100755 --- a/code/scripts/launch_servers.sh +++ b/code/scripts/launch_servers.sh @@ -63,7 +63,7 @@ cat >${CONFFILE} <<EOF hosts = { $hosts } -triton_debug_masks = none +triton_debug_masks = $g_mask triton_debug_file = /dev/stderr triton_tosd_db_path = /tmp/triton-server-%TRITON_SERVER_NAME%-meta triton_tosd_data_path = /tmp/triton-server-%TRITON_SERVER_NAME%-data diff --git a/code/src/asg/asg-internal.ae b/code/src/asg/asg-internal.ae index 160ad7b..26b030c 100644 --- a/code/src/asg/asg-internal.ae +++ b/code/src/asg/asg-internal.ae @@ -226,7 +226,50 @@ __blocking int asg_i_reset ( asg_update_id_t update_id_condition, asg_size_t * reset_count) { - return(ASG_SUCCESS); + triton_ret_t tret; + uint128_t oid; + uint64_t count; + int rc; + + assert(!(flags & ~(ASG_COND_NONE|ASG_COND_ALL))); + + if (location != ASG_LOCATION_AUTO) + { + return ASG_ERR_LOCATION; + } + + if ((container == ASG_CONTAINER_NULL) || + (object == ASG_OBJECT_NULL) || + (fork == ASG_FORK_NULL)) + { + return ASG_ERR_OTHER; + } + + oid.u = object; + oid.l = container; + + tret = remote_triton_rpc_rosd_reset( + oid, + fork, + start_record, + recordcount, + recordlen, + flags, + update_id_condition, + &count); + if (triton_is_error(tret)) + { + triton_error_print(tret, "remote_triton_rpc_rosd_reset"); + rc = ASG_ERR_OTHER; + } + else + { + *reset_count = count; + rc = ASG_SUCCESS; + } + triton_error_destroy(tret); + + return(rc); } __blocking int asg_i_finalize(asg_instance_t instance) @@ -401,6 +444,7 @@ __blocking int asg_i_probe_fork ( *next = r_next; *transferred = r_count; + rc = ASG_SUCCESS; } triton_error_destroy(tret); diff --git a/code/src/replicated-osd/Makefile.subdir b/code/src/replicated-osd/Makefile.subdir index da4ee24..8895b66 100644 --- a/code/src/replicated-osd/Makefile.subdir +++ b/code/src/replicated-osd/Makefile.subdir @@ -8,6 +8,7 @@ src_libtriton_a_SOURCES += \ src/replicated-osd/rosd-read.ae \ src/replicated-osd/rosd-probe-fork.ae \ src/replicated-osd/rosd-probe-object.ae \ + src/replicated-osd/rosd-reset.ae \ src/replicated-osd/buffer-mgmt.ae AE_SRC += \ @@ -20,6 +21,7 @@ AE_SRC += \ src/replicated-osd/rosd-read.ae \ src/replicated-osd/rosd-probe-fork.ae \ src/replicated-osd/rosd-probe-object.ae \ + src/replicated-osd/rosd-reset.ae \ src/replicated-osd/buffer-mgmt.ae AE_HDR += \ diff --git a/code/src/replicated-osd/rosd-internal.hae b/code/src/replicated-osd/rosd-internal.hae index 10e19a6..07726aa 100644 --- a/code/src/replicated-osd/rosd-internal.hae +++ b/code/src/replicated-osd/rosd-internal.hae @@ -39,6 +39,7 @@ void triton_rpc_rosd_write_register(void); void triton_rpc_rosd_read_register(void); void triton_rpc_rosd_probe_fork_register(void); void triton_rpc_rosd_probe_object_register(void); +void triton_rpc_rosd_reset_register(void); #endif /* __ROSD_INTERNAL_HAE */ diff --git a/code/src/replicated-osd/rosd-reset.ae b/code/src/replicated-osd/rosd-reset.ae new file mode 100644 index 0000000..4659dd5 --- /dev/null +++ b/code/src/replicated-osd/rosd-reset.ae @@ -0,0 +1,152 @@ +#include <aesop/aesop.h> +#include <mercury_macros.h> +#include <mercury_proc.h> + +#include "src/common/triton-error.h" +#include "src/replicated-osd/rosd.hae" +#include "src/replicated-osd/rosd-internal.hae" +#include "src/transactional-osd/transactional-osd.hae" + +#include "src/remote/mercury-engine.hae" +#include "src/remote/mercury-encode.h" + +MERCURY_GEN_PROC(triton_rpc_rosd_reset_in_t, + ((uint128_t)(oid)) \ + ((uint64_t)(fork)) \ + ((uint64_t)(record)) \ + ((uint64_t)(rcount)) \ + ((uint64_t)(rlen)) \ + ((int64_t)(flags)) \ + ((uint64_t)(condition))) + +MERCURY_GEN_PROC(triton_rpc_rosd_reset_out_t, + ((triton_ret_t)(tret)) \ + ((uint64_t)(reset_count))) + +static int triton_rpc_rosd_reset_handler(hg_handle_t handle); + +static hg_id_t rpc_rosd_reset_id; + +static __blocking triton_ret_t triton_rpc_rosd_reset(hg_handle_t handle) +{ + triton_rpc_rosd_reset_out_t out; + triton_rpc_rosd_reset_in_t in; + triton_ret_t tret; + uint64_t niid; + + /* generate NIID */ + niid = 1; + + triton_mercury_get_input(handle, &in, &out); + + tret = tosd_reset(in.oid, + in.fork, + in.record, + in.rcount, + in.rlen, + in.flags, + in.condition, + &out.reset_count, + niid); + + out.tret = triton_error_dup(tret); + + triton_mercury_start_output(handle, &out); + + triton_error_destroy(tret); + + return(TRITON_SUCCESS); +} +TRITON_DEFINE_RPC_HANDLER(triton_rpc_rosd_reset) + +__blocking triton_ret_t remote_triton_rpc_rosd_reset( + uint128_t oid, + uint64_t fork, + uint64_t record, + uint64_t rcount, + uint64_t rlen, + int flags, + uint64_t condition, + uint64_t *reset_count) +{ + na_addr_t addr; + triton_ret_t tret; + hg_request_t request; + int position; + int ret; + triton_rpc_rosd_reset_out_t out; + triton_rpc_rosd_reset_in_t in; + + in.oid = oid; + in.fork = fork; + in.record = record; + in.rcount = rcount; + in.rlen = rlen; + in.flags = flags; + in.condition = condition; + + tret = triton_oid_to_addrs(oid, 1, &position, &addr); + if(triton_is_error(tret)) + { + return(tret); + } + + ret = HG_Forward(addr, + rpc_rosd_reset_id, + &in, + &out, + &request); + if (ret != HG_SUCCESS) + { + triton_error_msg("HG_Forward failure.\n"); + return(TRITON_ERR_UNKNOWN); + } + + tret = triton_mercury_wait(request); + if (triton_is_error(tret)) + { + HG_Request_free(request); + return(tret); + } + + *reset_count = out.reset_count; + + HG_Request_free(request); + + return out.tret; +} + +void triton_rpc_rosd_reset_register (void) +{ + int mflags; + + mflags = triton_mercury_engine_get_flags(); + + assert(mflags); + + if (mflags & TRITON_MERCURY_SVR) + { + MERCURY_HANDLER_REGISTER("triton_rpc_rosd_reset", + triton_rpc_rosd_reset_handler, + triton_rpc_rosd_reset_in_t, + triton_rpc_rosd_reset_out_t); + } + + if (mflags & TRITON_MERCURY_CLIENT) + { + rpc_rosd_reset_id = + MERCURY_REGISTER("triton_rpc_rosd_reset", + triton_rpc_rosd_reset_in_t, + triton_rpc_rosd_reset_out_t); + } + + return; +} + +/* + * Local Variables: + * c-basic-offset: 4 + * End: + * + * vim: ft=c ts=8 sts=4 sw=4 expandtab + */ diff --git a/code/src/replicated-osd/rosd.ae b/code/src/replicated-osd/rosd.ae index 4039570..2f68f76 100644 --- a/code/src/replicated-osd/rosd.ae +++ b/code/src/replicated-osd/rosd.ae @@ -164,6 +164,7 @@ void triton_rpc_rosd_register(void) triton_rpc_rosd_read_register(); triton_rpc_rosd_probe_fork_register(); triton_rpc_rosd_probe_object_register(); + triton_rpc_rosd_reset_register(); return; } diff --git a/code/src/replicated-osd/rosd.hae b/code/src/replicated-osd/rosd.hae index f16618b..4fffa45 100644 --- a/code/src/replicated-osd/rosd.hae +++ b/code/src/replicated-osd/rosd.hae @@ -99,6 +99,16 @@ __blocking triton_ret_t remote_triton_rpc_rosd_probe_object( uint64_t *flen, uint64_t *fcount); +__blocking triton_ret_t remote_triton_rpc_rosd_reset( + uint128_t oid, + uint64_t fork, + uint64_t record, + uint64_t rcount, + uint64_t rlen, + int flags, + uint64_t condition, + uint64_t *reset_count); + #endif /* __ROSD_HAE */ diff --git a/code/src/transactional-osd/transactional-osd.ae b/code/src/transactional-osd/transactional-osd.ae index a61bd4e..a5e24d1 100644 --- a/code/src/transactional-osd/transactional-osd.ae +++ b/code/src/transactional-osd/transactional-osd.ae @@ -3439,23 +3439,32 @@ static triton_ret_t merge_logical_map(struct triton_list* list1_in, /* pick winner for overlapped regions */ if(list1_array[i].logical_offset == list2_array[j].logical_offset) { - if(list1_array[i].version > list2_array[j].version) + if((list2_array[i].flags & TOSD_FLAG_RESET) == TOSD_FLAG_RESET) { - winner = &list1_array[i]; - loser = &list2_array[j]; + /* completely drop reset ranges from the map */ + logical_offset = TOSD_MIN(list2_array[j].logical_offset_end, + list1_array[i].logical_offset_end); } else { - winner = &list2_array[j]; - loser = &list1_array[i]; - } - list_out_array[k] = *winner; - logical_offset = TOSD_MIN(winner->logical_offset_end, + if(list1_array[i].version > list2_array[j].version) + { + winner = &list1_array[i]; + loser = &list2_array[j]; + } + else + { + winner = &list2_array[j]; + loser = &list1_array[i]; + } + list_out_array[k] = *winner; + logical_offset = TOSD_MIN(winner->logical_offset_end, loser->logical_offset_end); - list_out_array[k].logical_offset_end = logical_offset; - list_out_array[k].size = list_out_array[k].logical_offset_end - - list_out_array[k].logical_offset; - k++; + list_out_array[k].logical_offset_end = logical_offset; + list_out_array[k].size = list_out_array[k].logical_offset_end - + list_out_array[k].logical_offset; + k++; + } continue; } @@ -3475,7 +3484,7 @@ static triton_ret_t merge_logical_map(struct triton_list* list1_in, loser->logical_offset); list_out_array[k].logical_offset_end = logical_offset; list_out_array[k].size = list_out_array[k].logical_offset_end - - list_out_array[k].logical_offset; + list_out_array[k].logical_offset; k++; } @@ -4650,6 +4659,91 @@ __blocking triton_ret_t tosd_probe_fork ( return tret; } +__blocking triton_ret_t tosd_reset (uint128_t oid, + uint64_t fid, + uint64_t rid, + uint64_t rcount, + uint64_t rlen, + int64_t flags, + uint64_t condition, + uint64_t *reset_count, + uint64_t niid) +{ + struct coalesce_obj co; + struct logical_map_entry *lme_update; + tosd_txn txn; + uint64_t txn_number; + triton_ret_t tret; + triton_ret_t tret_tmp; + int tosd_flags; + + txn_number = 1; + txn = NULL; + tosd_flags = (TOSD_FLAG_AUTO_TXN | TOSD_FLAG_RESET); + lme_update = malloc (sizeof(*lme_update)); + + assert(lme_update); + triton_debug(triton_dbg_tosd, + "tosd_reset: [%llu,%llu,%llu,%llu] count:%llu len:%llu flags:%llu cond:%llu\n", + llu(oid.l), llu(oid.u), llu(fid), llu(rid), llu(rcount), llu(rlen), llu(flags), llu(condition)); + + TOSD_CHECK(); + + if(discard_data) + start_write(&co, oid, COALESCE_DB); + else + start_write(&co, oid, COALESCE_DB|COALESCE_DATA); + + tret = tosd_txn_open(oid, fid, txn_number, niid, &txn); + if (triton_is_error(tret)) + { + triton_error_print(tret, "tosd_txn_open"); + } + else + { + /* + * Setup update to logical map to reset the desired range + * NOTE: this only supports reseting records at this time. + * Not full forks or objects. + */ + lme_update->logical_offset = rid; + lme_update->size = rcount; + lme_update->logical_offset_end = rid + rcount; + lme_update->log_offset = -1; + lme_update->flags = tosd_flags; + lme_update->niid = niid; + lme_update->version = 0; + triton_list_link_clear(&lme_update->list_link); + + /* + * Add the update to the transaction accumulator + */ + triton_mutex_lock(&txn_mutex); + txn_update_list_add(lme_update, txn); + triton_mutex_unlock(&txn_mutex); + + /* + * All the magic happens while closing out the transaction. + */ + tret = tosd_txn_close_internal(oid, fid, txn); + } + + if (triton_is_error(tret)) + { + *reset_count = 0; + } + else + { + *reset_count = (rcount * rlen); + } + + tret_tmp = end_write(&co); + triton_error_destroy(tret_tmp); + + + return tret; +} + /* * Local variables: * c-indent-level: 4 diff --git a/code/src/transactional-osd/transactional-osd.hae b/code/src/transactional-osd/transactional-osd.hae index eff222c..4ec935d 100644 --- a/code/src/transactional-osd/transactional-osd.hae +++ b/code/src/transactional-osd/transactional-osd.hae @@ -23,6 +23,7 @@ typedef struct txn_accumulator* tosd_txn; #define TOSD_FLAG_TRUNC_WRITE 1 /**< truncate fork on write */ #define TOSD_FLAG_AUTO_TXN 2 /**< automatically wrap write in a transaction */ +#define TOSD_FLAG_RESET (1<<2) /* reset version */ #define TOSD_INIT_FLAG_DATA_ODIRECT 1 /**< O_DIRECT for data access */ #define TOSD_INIT_FLAG_DATA_SYNC 2 /**< fsync() (or similar) when writing data */ @@ -234,6 +235,16 @@ __blocking triton_ret_t tosd_probe_object (uint128_t oid, uint64_t *flen, uint64_t *fcount); +__blocking triton_ret_t tosd_reset (uint128_t oid, + uint64_t fid, + uint64_t rid, + uint64_t rcount, + uint64_t rlen, + int64_t flags, + uint64_t condition, + uint64_t *reset_count, + uint64_t niid); + #endif /* __VERSIONED_OSD_HAE__ */ /* @} */ hooks/post-receive --
participants (1)
-
noreply@mcs.anl.gov