Skip to content

Commit 3973c35

Browse files
committed
trace: we only ever add two tags, so use a static array.
Avoids allocations. Also assume that name and value parameters outlive the trace span, so don't copy. Before: real 0m16.421000-18.407000(17.8128+/-0.72)s user 0m14.242000-16.041000(15.5382+/-0.67)s sys 0m2.179000-2.363000(2.273+/-0.061)s After: real 0m13.441000-14.592000(14.2686+/-0.43)s user 0m11.265000-12.289000(11.9626+/-0.37)s sys 0m2.175000-2.381000(2.3048+/-0.072)s Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
1 parent cdb7443 commit 3973c35

File tree

1 file changed

+30
-16
lines changed

1 file changed

+30
-16
lines changed

common/trace.c

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,12 @@ const char *trace_service_name = "lightningd";
4646
static bool disable_trace = false;
4747
static FILE *trace_to_file = NULL;
4848

49+
#define SPAN_MAX_TAGS 2
50+
4951
struct span_tag {
50-
char *name, *value;
52+
const char *name;
53+
const char *valuestr;
54+
int valuelen;
5155
};
5256

5357
struct span {
@@ -67,7 +71,7 @@ struct span {
6771
* spans. */
6872
size_t key;
6973
struct span *parent;
70-
struct span_tag *tags;
74+
struct span_tag tags[SPAN_MAX_TAGS];
7175
const char *name;
7276

7377
bool suspended;
@@ -93,7 +97,6 @@ static void init_span(struct span *s,
9397
randombytes_buf(s->id, SPAN_ID_SIZE);
9498
s->start_time = (now.ts.tv_sec * 1000000) + now.ts.tv_nsec / 1000;
9599
s->parent = parent;
96-
s->tags = notleak(tal_arr(NULL, struct span_tag, 0));
97100
s->name = name;
98101
s->suspended = false;
99102

@@ -286,9 +289,13 @@ static void trace_emit(struct span *s)
286289
}
287290

288291
tal_append_fmt(&res, "\"tags\": {");
289-
for (size_t i = 0; i < tal_count(s->tags); i++) {
290-
tal_append_fmt(&res, "%s\"%s\": \"%s\"", i == 0 ? "" : ", ",
291-
s->tags[i].name, s->tags[i].value);
292+
for (size_t i = 0; i < SPAN_MAX_TAGS; i++) {
293+
if (!s->tags[i].name)
294+
continue;
295+
tal_append_fmt(&res, "%s\"%s\": \"%.*s\"", i == 0 ? "" : ", ",
296+
s->tags[i].name,
297+
s->tags[i].valuelen,
298+
s->tags[i].valuestr);
292299
}
293300

294301
tal_append_fmt(&res, "}, \"traceId\": \"%s\"}]", trace_id);
@@ -311,7 +318,8 @@ static void trace_span_clear(struct span *s)
311318

312319
s->parent = NULL;
313320
s->name = NULL;
314-
s->tags = tal_free(s->tags);
321+
for (size_t i = 0; i < SPAN_MAX_TAGS; i++)
322+
s->tags[i].name = NULL;
315323
}
316324

317325
void trace_span_start_(const char *name, const void *key)
@@ -385,16 +393,22 @@ void trace_span_tag(const void *key, const char *name, const char *value)
385393
struct span *span = trace_span_find(numkey);
386394
assert(span);
387395

388-
size_t s = tal_count(span->tags);
389-
tal_resize(&span->tags, s + 1);
390-
span->tags[s].name = tal_strdup(span->tags, name);
391-
if (strstarts(value, "\"")
392-
&& strlen(value) > 1
393-
&& strends(value, "\"")) {
394-
value = tal_strndup(tmpctx, value + 1,
395-
strlen(value) - 2);
396+
for (size_t i = 0; i < SPAN_MAX_TAGS; i++) {
397+
struct span_tag *t = &span->tags[i];
398+
if (!t->name) {
399+
t->name = name;
400+
t->valuestr = value;
401+
t->valuelen = strlen(value);
402+
if (t->valuestr[0] == '"'
403+
&& t->valuelen > 1
404+
&& t->valuestr[t->valuelen-1] == '"') {
405+
t->valuestr++;
406+
t->valuelen -= 2;
407+
}
408+
return;
409+
}
396410
}
397-
span->tags[s].value = tal_strdup(span->tags, value);
411+
abort();
398412
}
399413

400414
void trace_span_suspend_(const void *key, const char *lbl)

0 commit comments

Comments
 (0)