blob: 8840fbf3eecda0c2aede3f3dc59c961d6672d34c [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "core/span.h"
#include "test/span_table.h"
#include "test/span_util.h"
#include "test/test.h"
#include "util/htable.h"
#include "util/log.h"
#include <errno.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct span_table *span_table_alloc(void)
{
struct htable *ht;
ht = htable_alloc(128, ht_hash_string, ht_compare_string);
if (!ht) {
return NULL;
}
return (struct span_table*)ht;
}
int span_table_get(struct span_table *st, struct htrace_span **out,
const char *desc, const char *prid)
{
struct htable *ht = (struct htable *)st;
struct htrace_span *span;
span = htable_get(ht, desc);
EXPECT_NONNULL(span);
EXPECT_STR_EQ(desc, span->desc);
EXPECT_UINT64_GE(span->begin_ms, span->end_ms);
EXPECT_UINT64_GT(0L, span->span_id);
EXPECT_NONNULL(span->prid);
EXPECT_STR_EQ(prid, span->prid);
*out = span;
return EXIT_SUCCESS;
}
int span_table_put(struct span_table *st, struct htrace_span *span)
{
struct htable *ht = (struct htable *)st;
int res;
res = htable_put(ht, span->desc, span);
if (res) {
htrace_span_free(span);
return res;
}
return 0;
}
static void span_table_free_entry(void *tracer, void *key, void *val)
{
struct htrace_span *span = val;
htrace_span_free(span);
// We don't need to free the key, since it's simply the span->desc string,
// which is already freed by htrace_span_free.
}
void span_table_free(struct span_table *st)
{
struct htable *ht = (struct htable *)st;
// Free all entries
htable_visit(ht, span_table_free_entry, NULL);
// Free the table itself
htable_free(ht);
}
uint32_t span_table_size(struct span_table *st)
{
struct htable *ht = (struct htable *)st;
return htable_used(ht);
}
int load_trace_span_file(const char *path, struct span_table *st)
{
char line[8196], err[1024];
size_t err_len = sizeof(err);
FILE *fp = NULL;
int lineno = 0, ret = EXIT_FAILURE;
struct htrace_span *span;
fp = fopen(path, "r");
if (!fp) {
int res = errno;
fprintf(stderr, "failed to open %s: %s\n", path, terror(res));
return -1;
}
while (1) {
++lineno;
if (!fgets(line, sizeof(line), fp)) {
if (ferror(fp)) {
int res = errno;
fprintf(stderr, "error reading from %s: %s\n",
path, terror(res));
break;
}
ret = EXIT_SUCCESS;
break;
}
span_json_parse(line, &span, err, err_len);
if (err[0]) {
fprintf(stderr, "error parsing line %d. Failed to parse %s "
"from %s: %s\n", lineno, line, path, err);
break;
}
span_table_put(st, span);
}
fclose(fp);
if (ret == EXIT_SUCCESS) {
//fprintf(stderr, "loaded %d spans from %s\n", lineno - 1, path);
return lineno - 1;
}
return -1;
}
// vim: ts=4:sw=4:tw=79:et