Port ovnisort
This commit is contained in:
parent
61b0efee34
commit
451d4be386
@ -58,10 +58,10 @@ target_link_libraries(ovniemu emu parson-static ovni-static)
|
||||
|
||||
add_executable(ovnidump ovnidump.c)
|
||||
target_link_libraries(ovnidump emu parson-static ovni-static)
|
||||
#
|
||||
#add_executable(ovnisort ovnisort.c)
|
||||
#target_link_libraries(ovnisort emu trace)
|
||||
#
|
||||
|
||||
add_executable(ovnisort ovnisort.c)
|
||||
target_link_libraries(ovnisort emu parson-static ovni-static)
|
||||
|
||||
## Use <PackageName>_ROOT variables if available, commonly used by MPI
|
||||
## installations
|
||||
#if(POLICY CMP0074)
|
||||
|
@ -423,6 +423,9 @@ process_ev(struct emu *emu)
|
||||
return pre_cpu(emu);
|
||||
case 'F':
|
||||
return pre_flush(emu);
|
||||
case 'U':
|
||||
/* Ignore sorting events */
|
||||
return 0;
|
||||
default:
|
||||
err("unknown ovni event category %c\n",
|
||||
emu->ev->c);
|
||||
|
@ -238,13 +238,13 @@ execute_sort_plan(struct sortplan *sp)
|
||||
|
||||
/* Sort the events in the stream chronologically using a ring */
|
||||
static int
|
||||
stream_winsort(struct ovni_stream *stream, struct ring *r)
|
||||
stream_winsort(struct stream *stream, struct ring *r)
|
||||
{
|
||||
char *fn = stream->thread->tracefile;
|
||||
char *fn = stream->path;
|
||||
int fd = open(fn, O_WRONLY);
|
||||
|
||||
if (fd < 0)
|
||||
die("open %s failed: %s\n", fn, strerror(errno));
|
||||
die("open %s failed:", fn);
|
||||
|
||||
ring_reset(r);
|
||||
|
||||
@ -256,9 +256,10 @@ stream_winsort(struct ovni_stream *stream, struct ring *r)
|
||||
size_t empty_regions = 0;
|
||||
size_t updated = 0;
|
||||
char st = 'S';
|
||||
int ret = 0;
|
||||
|
||||
while (ovni_load_next_event(stream) == 0) {
|
||||
struct ovni_ev *ev = stream->cur_ev;
|
||||
while ((ret = stream_step(stream)) == 0) {
|
||||
struct ovni_ev *ev = stream_ev(stream);
|
||||
|
||||
if (st == 'S' && starts_unsorted_region(ev)) {
|
||||
st = 'U';
|
||||
@ -276,10 +277,11 @@ stream_winsort(struct ovni_stream *stream, struct ring *r)
|
||||
if (ends_unsorted_region(ev)) {
|
||||
updated = 1;
|
||||
sp.next = ev;
|
||||
dbg("executing sort plan for stream tid=%d\n", stream->tid);
|
||||
dbg("executing sort plan for stream %s\n",
|
||||
stream->relpath);
|
||||
if (execute_sort_plan(&sp) < 0) {
|
||||
err("sort failed for stream tid=%d\n",
|
||||
stream->tid);
|
||||
err("sort failed for stream %s\n",
|
||||
stream->relpath);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -294,9 +296,14 @@ stream_winsort(struct ovni_stream *stream, struct ring *r)
|
||||
ring_add(r, ev);
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
err("stream_step failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (empty_regions > 0)
|
||||
err("warning: stream %d contains %ld empty sort regions\n",
|
||||
stream->tid, empty_regions);
|
||||
err("warning: stream %s contains %ld empty sort regions\n",
|
||||
stream->relpath, empty_regions);
|
||||
|
||||
if (updated && fdatasync(fd) < 0)
|
||||
die("fdatasync %s failed: %s\n", fn, strerror(errno));
|
||||
@ -309,33 +316,44 @@ stream_winsort(struct ovni_stream *stream, struct ring *r)
|
||||
|
||||
/* Ensures that each individual stream is sorted */
|
||||
static int
|
||||
stream_check(struct ovni_stream *stream)
|
||||
stream_check(struct stream *stream)
|
||||
{
|
||||
if (ovni_load_next_event(stream) != 0)
|
||||
int ret = stream_step(stream);
|
||||
if (ret < 0) {
|
||||
err("stream_step failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Reached the end */
|
||||
if (ret != 0)
|
||||
return 0;
|
||||
|
||||
struct ovni_ev *ev = stream->cur_ev;
|
||||
struct ovni_ev *ev = stream_ev(stream);
|
||||
uint64_t last_clock = ev->header.clock;
|
||||
int ret = 0;
|
||||
|
||||
while (ovni_load_next_event(stream) == 0) {
|
||||
ev = stream->cur_ev;
|
||||
while ((ret = stream_step(stream)) == 0) {
|
||||
ev = stream_ev(stream);
|
||||
uint64_t cur_clock = ovni_ev_get_clock(ev);
|
||||
|
||||
if (cur_clock < last_clock) {
|
||||
err("backwards jump in time %ld -> %ld for stream tid=%d\n",
|
||||
last_clock, cur_clock, stream->tid);
|
||||
err("backwards jump in time %ld -> %ld for stream %s\n",
|
||||
last_clock, cur_clock, stream->relpath);
|
||||
ret = -1;
|
||||
}
|
||||
|
||||
last_clock = cur_clock;
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
err("stream_step failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
process_trace(struct ovni_trace *trace)
|
||||
process_trace(struct trace *trace)
|
||||
{
|
||||
struct ring ring;
|
||||
int ret = 0;
|
||||
@ -346,19 +364,20 @@ process_trace(struct ovni_trace *trace)
|
||||
if (ring.ev == NULL)
|
||||
die("malloc failed: %s\n", strerror(errno));
|
||||
|
||||
for (size_t i = 0; i < trace->nstreams; i++) {
|
||||
struct ovni_stream *stream = &trace->stream[i];
|
||||
for (struct stream *stream = trace->streams; stream; stream = stream->next) {
|
||||
stream_allow_unsorted(stream);
|
||||
|
||||
if (operation_mode == SORT) {
|
||||
dbg("sorting stream tid=%d\n", stream->tid);
|
||||
dbg("sorting stream %s\n", stream->relpath);
|
||||
if (stream_winsort(stream, &ring) != 0) {
|
||||
err("sort stream tid=%d failed\n", stream->tid);
|
||||
err("sort stream %s failed\n", stream->relpath);
|
||||
/* When sorting, return at the first
|
||||
* attempt */
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
if (stream_check(stream) != 0) {
|
||||
err("stream tid=%d is not sorted\n", stream->tid);
|
||||
err("stream %s is not sorted\n", stream->relpath);
|
||||
/* When checking, report all errors and
|
||||
* then fail */
|
||||
ret = -1;
|
||||
@ -427,31 +446,29 @@ parse_args(int argc, char *argv[])
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
int ret = 0;
|
||||
progname_set("ovnisort");
|
||||
|
||||
parse_args(argc, argv);
|
||||
|
||||
struct ovni_trace *trace = calloc(1, sizeof(struct ovni_trace));
|
||||
struct trace *trace = calloc(1, sizeof(struct trace));
|
||||
|
||||
if (trace == NULL) {
|
||||
perror("calloc");
|
||||
exit(EXIT_FAILURE);
|
||||
err("calloc failed:");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ovni_load_trace(trace, tracedir))
|
||||
if (trace_load(trace, tracedir) != 0) {
|
||||
err("failed to load trace: %s", tracedir);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (ovni_load_streams(trace))
|
||||
if (process_trace(trace) != 0) {
|
||||
err("failed to process trace: %s", tracedir);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (process_trace(trace))
|
||||
ret = 1;
|
||||
|
||||
ovni_free_streams(trace);
|
||||
|
||||
ovni_free_trace(trace);
|
||||
|
||||
free(trace);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
@ -7,10 +7,10 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release")
|
||||
endif()
|
||||
|
||||
ovni_test(flush.c)
|
||||
#ovni_test(sort.c SORT)
|
||||
#ovni_test(empty-sort.c SORT)
|
||||
#ovni_test(sort-first-and-full-ring.c SORT
|
||||
# SHOULD_FAIL REGEX "cannot find a event previous to clock")
|
||||
ovni_test(sort.c SORT)
|
||||
ovni_test(empty-sort.c SORT)
|
||||
ovni_test(sort-first-and-full-ring.c SORT
|
||||
SHOULD_FAIL REGEX "cannot find a event previous to clock")
|
||||
ovni_test(burst-stats.c REGEX "burst stats: median 33 ns, avg 33\.0 ns, max 33 ns")
|
||||
ovni_test(mp-simple.c MP)
|
||||
ovni_test(version-good.c)
|
||||
|
@ -21,7 +21,7 @@ static void
|
||||
emit_jumbo(uint8_t *buf, size_t size, int64_t clock)
|
||||
{
|
||||
struct ovni_ev ev = {0};
|
||||
ovni_ev_set_mcv(&ev, "O$$");
|
||||
ovni_ev_set_mcv(&ev, "OUj");
|
||||
ovni_ev_set_clock(&ev, clock);
|
||||
ovni_ev_jumbo_emit(&ev, buf, size);
|
||||
}
|
||||
|
@ -36,9 +36,8 @@ function(nodes_rt_test)
|
||||
ENVIRONMENT "NOSV_CONFIG=${OVNI_TEST_SOURCE_DIR}/rt/nodes/nosv.toml")
|
||||
endfunction()
|
||||
|
||||
# FIXME: Add SORT for all tests once ovnisort is ported
|
||||
nodes_rt_test(../nanos6/simple-task.c NAME simple-task)
|
||||
nodes_rt_test(../nanos6/nested-task.c NAME nested-task)
|
||||
nodes_rt_test(../nanos6/several-tasks.c NAME several-tasks)
|
||||
nodes_rt_test(../nanos6/if0.c NAME if0)
|
||||
nodes_rt_test(../nanos6/sched-add.c NAME sched-add)
|
||||
nodes_rt_test(../nanos6/simple-task.c NAME simple-task SORT)
|
||||
nodes_rt_test(../nanos6/nested-task.c NAME nested-task SORT)
|
||||
nodes_rt_test(../nanos6/several-tasks.c NAME several-tasks SORT)
|
||||
nodes_rt_test(../nanos6/if0.c NAME if0 SORT)
|
||||
nodes_rt_test(../nanos6/sched-add.c NAME sched-add SORT)
|
||||
|
@ -23,6 +23,6 @@ function(nosv_test)
|
||||
ENVIRONMENT "NOSV_CONFIG=${OVNI_TEST_SOURCE_DIR}/rt/nosv/nosv.toml")
|
||||
endfunction()
|
||||
|
||||
nosv_test(attach.c)
|
||||
nosv_test(waitfor.c)
|
||||
nosv_test(several-tasks.c)
|
||||
nosv_test(attach.c SORT)
|
||||
nosv_test(waitfor.c SORT)
|
||||
nosv_test(several-tasks.c SORT)
|
||||
|
Loading…
Reference in New Issue
Block a user