aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Alistair Veitch <aveitch@google.com>2016-01-15 12:13:36 -0800
committerGravatar Alistair Veitch <aveitch@google.com>2016-01-15 12:13:36 -0800
commita88a22166d768fbfc2da14d88fada058cfad7735 (patch)
tree1d3ddb601b680e731c23879357cb1e7feea0cfdc /src
parentfc999adcc7570ef19e16bf580199babb98096d4c (diff)
add creation status
Diffstat (limited to 'src')
-rw-r--r--src/core/census/tag_set.c72
1 files changed, 52 insertions, 20 deletions
diff --git a/src/core/census/tag_set.c b/src/core/census/tag_set.c
index 3b8efb1935..f5f32f5e0f 100644
--- a/src/core/census/tag_set.c
+++ b/src/core/census/tag_set.c
@@ -31,9 +31,6 @@
*
*/
/*
-- ability to add extra tags in encode?
-- add drops error count to create_ts
-- add mask to ntags?
- comment about key/value ptrs being to mem
- add comment about encode/decode being for RPC use only.
*/
@@ -175,9 +172,13 @@ static bool cts_delete_tag(census_tag_set *tags, const census_tag *tag,
key_len));
}
-// Add a tag to a tag set.
-static void tag_set_add_tag(struct tag_set *tags, const census_tag *tag,
+// Add a tag to a tag set. Return true on sucess, false if the tag could
+// not be added because of tag size constraints.
+static bool tag_set_add_tag(struct tag_set *tags, const census_tag *tag,
size_t key_len) {
+ if (tags->ntags == CENSUS_MAX_PROPAGATED_TAGS) {
+ return false;
+ }
const size_t tag_size = key_len + tag->value_len + TAG_HEADER_SIZE;
if (tags->kvm_used + tag_size > tags->kvm_size) {
// allocate new memory if needed
@@ -199,22 +200,41 @@ static void tag_set_add_tag(struct tag_set *tags, const census_tag *tag,
tags->kvm_used += tag_size;
tags->ntags++;
tags->ntags_alloc++;
+ return true;
}
-// Add a tag to a census_tag_set
+// Add a tag to a census_tag_set.
static void cts_add_tag(census_tag_set *tags, const census_tag *tag,
- size_t key_len) {
+ size_t key_len, census_tag_set_create_status *status) {
// first delete the tag if it is already present
- cts_delete_tag(tags, tag, key_len);
- if (tag->value != NULL && tag->value_len != 0) {
+ bool deleted = cts_delete_tag(tags, tag, key_len);
+ bool call_add = tag->value != NULL && tag->value_len != 0;
+ bool added = false;
+ if (call_add) {
if (CENSUS_TAG_IS_PROPAGATED(tag->flags)) {
if (CENSUS_TAG_IS_BINARY(tag->flags)) {
- tag_set_add_tag(&tags->tags[PROPAGATED_BINARY_TAGS], tag, key_len);
+ added =
+ tag_set_add_tag(&tags->tags[PROPAGATED_BINARY_TAGS], tag, key_len);
+ } else {
+ added = tag_set_add_tag(&tags->tags[PROPAGATED_TAGS], tag, key_len);
+ }
+ } else {
+ added = tag_set_add_tag(&tags->tags[LOCAL_TAGS], tag, key_len);
+ }
+ }
+ if (status) {
+ if (deleted) {
+ if (call_add) {
+ status->n_modified_tags++;
} else {
- tag_set_add_tag(&tags->tags[PROPAGATED_TAGS], tag, key_len);
+ status->n_deleted_tags++;
}
} else {
- tag_set_add_tag(&tags->tags[LOCAL_TAGS], tag, key_len);
+ if (added) {
+ status->n_added_tags++;
+ } else {
+ status->n_ignored_tags++;
+ }
}
}
}
@@ -263,8 +283,11 @@ static void tag_set_flatten(struct tag_set *tags) {
census_tag_set *census_tag_set_create(const census_tag_set *base,
const census_tag *tags, int ntags,
- census_tag_set_create_stats *stats) {
+ census_tag_set_create_status *status) {
int n_invalid_tags = 0;
+ if (status) {
+ memset(status, 0, sizeof(*status));
+ }
census_tag_set *new_ts = gpr_malloc(sizeof(census_tag_set));
if (base == NULL) {
memset(new_ts, 0, sizeof(census_tag_set));
@@ -280,7 +303,7 @@ census_tag_set *census_tag_set_create(const census_tag_set *base,
// ignore the tag if it is too long/short.
if (key_len != 1 && key_len <= CENSUS_MAX_TAG_KV_LEN &&
tag->value_len <= CENSUS_MAX_TAG_KV_LEN) {
- cts_add_tag(new_ts, tag, key_len);
+ cts_add_tag(new_ts, tag, key_len, status);
} else {
n_invalid_tags++;
}
@@ -288,12 +311,12 @@ census_tag_set *census_tag_set_create(const census_tag_set *base,
tag_set_flatten(&new_ts->tags[PROPAGATED_TAGS]);
tag_set_flatten(&new_ts->tags[PROPAGATED_BINARY_TAGS]);
tag_set_flatten(&new_ts->tags[LOCAL_TAGS]);
- if (stats != NULL) {
- stats->n_propagated_tags = new_ts->tags[PROPAGATED_TAGS].ntags;
- stats->n_propagated_binary_tags =
+ if (status != NULL) {
+ status->n_propagated_tags = new_ts->tags[PROPAGATED_TAGS].ntags;
+ status->n_propagated_binary_tags =
new_ts->tags[PROPAGATED_BINARY_TAGS].ntags;
- stats->n_local_tags = new_ts->tags[LOCAL_TAGS].ntags;
- stats->n_invalid_tags = n_invalid_tags;
+ status->n_local_tags = new_ts->tags[LOCAL_TAGS].ntags;
+ status->n_invalid_tags = n_invalid_tags;
}
return new_ts;
}
@@ -480,7 +503,11 @@ static void tag_set_decode(struct tag_set *tags, const char *buffer,
}
census_tag_set *census_tag_set_decode(const char *buffer, size_t size,
- const char *bin_buffer, size_t bin_size) {
+ const char *bin_buffer, size_t bin_size,
+ census_tag_set_create_status *status) {
+ if (status) {
+ memset(status, 0, sizeof(*status));
+ }
census_tag_set *new_ts = gpr_malloc(sizeof(census_tag_set));
memset(&new_ts->tags[LOCAL_TAGS], 0, sizeof(struct tag_set));
if (buffer == NULL) {
@@ -493,6 +520,11 @@ census_tag_set *census_tag_set_decode(const char *buffer, size_t size,
} else {
tag_set_decode(&new_ts->tags[PROPAGATED_BINARY_TAGS], bin_buffer, bin_size);
}
+ if (status) {
+ status->n_propagated_tags = new_ts->tags[PROPAGATED_TAGS].ntags;
+ status->n_propagated_binary_tags =
+ new_ts->tags[PROPAGATED_BINARY_TAGS].ntags;
+ }
// TODO(aveitch): check that BINARY flag is correct for each type.
return new_ts;
}