respondd: add provider "respondd-providers" to list registrations
Add an internal respondd provider "respondd-providers" which allows a respondd querier to query which providers are registered on a node. Example output: { "respondd-providers": [ "neighbours", "nodeinfo", "statistics", "statistics-extended" ] } This can be useful for providers which are known to be bulky, where the actual data is better queried via HTTP/TCP instead. But where such a provider is only present on a few nodes, so you'd want to avoid trying each node via HTTP. Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue>
This commit is contained in:
parent
308166e3c6
commit
49604ce507
|
@ -78,6 +78,11 @@ struct provider_list {
|
||||||
respondd_provider provider;
|
respondd_provider provider;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct key_list {
|
||||||
|
struct key_list *next;
|
||||||
|
char *key;
|
||||||
|
};
|
||||||
|
|
||||||
struct request_type {
|
struct request_type {
|
||||||
struct provider_list *providers;
|
struct provider_list *providers;
|
||||||
|
|
||||||
|
@ -101,6 +106,7 @@ struct request_schedule {
|
||||||
|
|
||||||
static int64_t now;
|
static int64_t now;
|
||||||
static struct hsearch_data htab;
|
static struct hsearch_data htab;
|
||||||
|
static struct key_list *keys;
|
||||||
|
|
||||||
|
|
||||||
static struct json_object * merge_json(struct json_object *a, struct json_object *b);
|
static struct json_object * merge_json(struct json_object *a, struct json_object *b);
|
||||||
|
@ -272,6 +278,23 @@ static void load_cache_time(struct request_type *r, const char *name) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void add_key(const char *key) {
|
||||||
|
struct key_list **pos, *pentry;
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (pos = &keys; *pos; pos = &(*pos)->next) {
|
||||||
|
if (strcmp(key, (*pos)->key) == 0)
|
||||||
|
return;
|
||||||
|
if (strcmp(key, (*pos)->key) < 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pentry = malloc(sizeof(*pentry));
|
||||||
|
pentry->key = strdup(key);
|
||||||
|
pentry->next = *pos;
|
||||||
|
*pos = pentry;
|
||||||
|
}
|
||||||
|
|
||||||
static void add_provider(const char *name, const struct respondd_provider_info *provider) {
|
static void add_provider(const char *name, const struct respondd_provider_info *provider) {
|
||||||
ENTRY key = {
|
ENTRY key = {
|
||||||
.key = (char *)provider->request,
|
.key = (char *)provider->request,
|
||||||
|
@ -306,6 +329,31 @@ static void add_provider(const char *name, const struct respondd_provider_info *
|
||||||
*pos = pentry;
|
*pos = pentry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct json_object *respondd_provider_providers(void) {
|
||||||
|
struct key_list **pos;
|
||||||
|
struct json_object *provider;
|
||||||
|
struct json_object *ret = json_object_new_array();
|
||||||
|
|
||||||
|
if (!ret)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (pos = &keys; *pos; pos = &(*pos)->next) {
|
||||||
|
provider = json_object_new_string((*pos)->key);
|
||||||
|
json_object_array_add(ret, provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void add_providers_provider(void) {
|
||||||
|
const struct respondd_provider_info providers[] = {
|
||||||
|
{"respondd-providers", respondd_provider_providers},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
add_provider("respondd", providers);
|
||||||
|
}
|
||||||
|
|
||||||
static void load_providers(const char *path) {
|
static void load_providers(const char *path) {
|
||||||
update_time();
|
update_time();
|
||||||
|
|
||||||
|
@ -339,10 +387,14 @@ static void load_providers(const char *path) {
|
||||||
if (!providers)
|
if (!providers)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (; providers->request; providers++)
|
for (; providers->request; providers++) {
|
||||||
add_provider(ent->d_name, providers);
|
add_provider(ent->d_name, providers);
|
||||||
|
add_key(providers->request);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
add_providers_provider();
|
||||||
|
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
|
Loading…
Reference in New Issue