diff options
author | Paul Gevers <elbrus@debian.org> | 2023-10-28 23:02:37 +0200 |
---|---|---|
committer | Paul Gevers <elbrus@debian.org> | 2023-10-28 23:02:37 +0200 |
commit | 5542d49f212eeccb9cddee26f2bfe3768a78cb74 (patch) | |
tree | b1dfbea4316621e56810b81e0053727074ace6bb | |
parent | b828eb790661efbe8007bae6da16654b34307b58 (diff) | |
parent | 8a46b295909db05606a9004454ed173bbfe607a9 (diff) |
Update upstream source from tag 'upstream/2.0.51'
Update to upstream version '2.0.51'
with Debian dir 99909aaa849aab59b78b92de02713438fe7ae3ff
-rw-r--r-- | docker/Dockerfile | 2 | ||||
-rw-r--r-- | docs/Kubernetes/statefulset.yaml | 4 | ||||
-rw-r--r-- | grammar/grammar.py | 5 | ||||
-rw-r--r-- | help/help_timezones.md | 2 | ||||
-rw-r--r-- | include/siri/db/insert.h | 2 | ||||
-rw-r--r-- | include/siri/db/query.h | 1 | ||||
-rw-r--r-- | include/siri/file/handler.h | 3 | ||||
-rw-r--r-- | include/siri/grammar/grammar.h | 4 | ||||
-rw-r--r-- | include/siri/version.h | 2 | ||||
-rw-r--r-- | src/iso8601/iso8601.c | 7 | ||||
-rw-r--r-- | src/siri/db/aggregate.c | 20 | ||||
-rw-r--r-- | src/siri/db/listener.c | 148 | ||||
-rw-r--r-- | src/siri/db/query.c | 17 | ||||
-rw-r--r-- | src/siri/db/servers.c | 2 | ||||
-rw-r--r-- | src/siri/db/shard.c | 4 | ||||
-rw-r--r-- | src/siri/file/handler.c | 22 | ||||
-rw-r--r-- | src/siri/grammar/grammar.c | 14 | ||||
-rw-r--r-- | src/siri/siri.c | 7 |
18 files changed, 160 insertions, 106 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile index fe6d275e..ff7d6017 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -11,7 +11,7 @@ RUN apk update && \ make clean && \ make -FROM alpine:latest +FROM amd64/alpine:3.12.4 RUN apk update && \ apk add pcre2 libuv libuuid yajl && \ mkdir -p /etc/siridb && \ diff --git a/docs/Kubernetes/statefulset.yaml b/docs/Kubernetes/statefulset.yaml index 768f56a5..0eff9832 100644 --- a/docs/Kubernetes/statefulset.yaml +++ b/docs/Kubernetes/statefulset.yaml @@ -33,7 +33,7 @@ spec: tolerationSeconds: 14400 containers: - name: siridb - image: siridb/siridb-server:2.0.42 # Pin to a specific version + image: siridb/siridb-server:2.0.49 # Pin to a specific version imagePullPolicy: Always args: ["--managed"] # Tells SiriDB it will be managed by Kubernetes env: @@ -93,4 +93,4 @@ spec: accessModes: ["ReadWriteOnce"] resources: requests: - storage: 200Mi # For example, 300Gi for large data sets + storage: 300Gi # For example, 300Gi for large data sets diff --git a/grammar/grammar.py b/grammar/grammar.py index 59460271..8a7b4c5a 100644 --- a/grammar/grammar.py +++ b/grammar/grammar.py @@ -126,6 +126,7 @@ class SiriGrammar(Grammar): k_ninf = Sequence('-', k_inf) k_now = Keyword('now') k_number = Keyword('number') + k_offset = Keyword('offset') k_online = Keyword('online') k_open_files = Keyword('open_files') k_or = Keyword('or') @@ -527,6 +528,9 @@ class SiriGrammar(Grammar): f_last = Sequence( k_last, '(', Optional(time_expr), ')') + f_offset = Sequence( + k_offset, + '(', time_expr, ')') f_timeval = Sequence( k_timeval, '(', ')') @@ -572,6 +576,7 @@ class SiriGrammar(Grammar): aggregate_functions = List(Choice( f_all, + f_offset, f_limit, f_mean, f_sum, diff --git a/help/help_timezones.md b/help/help_timezones.md index d1e09f59..9b06e8df 100644 --- a/help/help_timezones.md +++ b/help/help_timezones.md @@ -346,7 +346,7 @@ For information on how to change the time zone see `help alter database` - Europe/Istanbul - Europe/Jersey - Europe/Kaliningrad -- Europe/Kiev +- Europe/Kyiv - Europe/Lisbon - Europe/Ljubljana - Europe/London diff --git a/include/siri/db/insert.h b/include/siri/db/insert.h index e1a663e8..4f22bb5a 100644 --- a/include/siri/db/insert.h +++ b/include/siri/db/insert.h @@ -62,9 +62,9 @@ struct siridb_insert_s uint8_t ref; uint8_t flags; uint16_t pid; + uint16_t packer_size; /* number of packers (one for each pool) */ sirinet_stream_t * client; size_t npoints; /* number of points */ - uint16_t packer_size; /* number of packers (one for each pool) */ qp_packer_t * packer[]; }; diff --git a/include/siri/db/query.h b/include/siri/db/query.h index b7f8971f..9c993518 100644 --- a/include/siri/db/query.h +++ b/include/siri/db/query.h @@ -81,6 +81,7 @@ struct siridb_query_s float factor; void * data; sirinet_stream_t * client; + siridb_t * siridb; char * q; char err_msg[SIRIDB_MAX_SIZE_ERR_MSG]; qp_packer_t * packer; diff --git a/include/siri/file/handler.h b/include/siri/file/handler.h index 19d813dd..08943756 100644 --- a/include/siri/file/handler.h +++ b/include/siri/file/handler.h @@ -8,8 +8,10 @@ typedef struct siri_fh_s siri_fh_t; #include <inttypes.h> #include <siri/file/pointer.h> +#include <uv.h> siri_fh_t * siri_fh_new(uint16_t size); +void siri_fh_close(siri_fh_t * fh); void siri_fh_free(siri_fh_t * fh); int siri_fopen( siri_fh_t * fh, @@ -22,6 +24,7 @@ struct siri_fh_s uint16_t size; uint16_t idx; siri_fp_t ** fpointers; + uv_mutex_t lock_; }; #endif /* SIRI_FH_H_ */ diff --git a/include/siri/grammar/grammar.h b/include/siri/grammar/grammar.h index 3d48891f..50229652 100644 --- a/include/siri/grammar/grammar.h +++ b/include/siri/grammar/grammar.h @@ -5,7 +5,7 @@ * should be used with the libcleri module. * * Source class: SiriGrammar - * Created at: 2022-05-05 15:08:05 + * Created at: 2023-10-24 15:46:26 */ #ifndef CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_ #define CLERI_EXPORT_SIRI_GRAMMAR_GRAMMAR_H_ @@ -70,6 +70,7 @@ enum cleri_grammar_ids { CLERI_GID_F_MEDIAN_HIGH, CLERI_GID_F_MEDIAN_LOW, CLERI_GID_F_MIN, + CLERI_GID_F_OFFSET, CLERI_GID_F_POINTS, CLERI_GID_F_PVARIANCE, CLERI_GID_F_STDDEV, @@ -201,6 +202,7 @@ enum cleri_grammar_ids { CLERI_GID_K_NINF, CLERI_GID_K_NOW, CLERI_GID_K_NUMBER, + CLERI_GID_K_OFFSET, CLERI_GID_K_ONLINE, CLERI_GID_K_OPEN_FILES, CLERI_GID_K_OR, diff --git a/include/siri/version.h b/include/siri/version.h index ed237fe5..e0fcbe6b 100644 --- a/include/siri/version.h +++ b/include/siri/version.h @@ -6,7 +6,7 @@ #define SIRIDB_VERSION_MAJOR 2 #define SIRIDB_VERSION_MINOR 0 -#define SIRIDB_VERSION_PATCH 48 +#define SIRIDB_VERSION_PATCH 51 /* * Use SIRIDB_VERSION_PRE_RELEASE for alpha release versions. diff --git a/src/iso8601/iso8601.c b/src/iso8601/iso8601.c index 7a9b4461..7ab52955 100644 --- a/src/iso8601/iso8601.c +++ b/src/iso8601/iso8601.c @@ -354,7 +354,7 @@ static const char * tz_common[] = { "TZ=:Europe/Istanbul", "TZ=:Europe/Jersey", "TZ=:Europe/Kaliningrad", - "TZ=:Europe/Kiev", + "TZ=:Europe/Kiev", /* obsolete, correct spelling is Europe/Kyiv */ "TZ=:Europe/Lisbon", "TZ=:Europe/Ljubljana", "TZ=:Europe/London", @@ -448,10 +448,11 @@ static const char * tz_common[] = { "TZ=:US/Hawaii", "TZ=:US/Mountain", "TZ=:US/Pacific", - "TZ=:UTC" + "TZ=:UTC", + "TZ=:Europe/Kyiv" }; -#define TZ_LEN 433 +#define TZ_LEN 434 #define TZ_UTC 432 /* Use this offset because names start with TZ=: */ diff --git a/src/siri/db/aggregate.c b/src/siri/db/aggregate.c index 2dad9014..d56fa4d2 100644 --- a/src/siri/db/aggregate.c +++ b/src/siri/db/aggregate.c @@ -206,7 +206,7 @@ void siridb_init_aggregates(void) vec_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg) { uint32_t gid; - siridb_aggr_t * aggr; + siridb_aggr_t * aggr = NULL; vec_t * vec = vec_new(VEC_DEFAULT_SIZE); if (vec == NULL) { @@ -221,6 +221,19 @@ vec_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg) switch (gid) { + case CLERI_GID_F_OFFSET: + if (aggr == NULL || aggr->group_by == 0) + { + sprintf(err_msg, + "Offset must be used after an aggregation method."); + siridb_aggregate_list_free(vec); + return NULL; + } + /* group_by is always > 0 */ + aggr->offset = CLERI_NODE_DATA( + cleri_gn(cleri_gn(cleri_gn(children) + ->children)->children->next->next)) % aggr->group_by; + break; case CLERI_GID_F_LIMIT: AGGR_NEW { @@ -319,11 +332,6 @@ vec_t * siridb_aggregate_list(cleri_children_t * children, char * err_msg) case CLERI_GID_F_TIMEVAL: case CLERI_GID_F_INTERVAL: AGGR_NEW - { - aggr->timespan = 1; - aggr->group_by = 0; - } - VEC_APPEND break; diff --git a/src/siri/db/listener.c b/src/siri/db/listener.c index 0965fc75..f795081f 100644 --- a/src/siri/db/listener.c +++ b/src/siri/db/listener.c @@ -578,7 +578,7 @@ static void enter_access_expr(uv_async_t * handle) static void enter_alter_group(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_alter_t * q_alter = (query_alter_t *) query->data; MASTER_CHECK_ACCESSIBLE(siridb) @@ -611,7 +611,7 @@ static void enter_alter_group(uv_async_t * handle) static void enter_alter_tag(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_alter_t * q_alter = (query_alter_t *) query->data; MASTER_CHECK_ACCESSIBLE(siridb) @@ -643,7 +643,7 @@ static void enter_alter_tag(uv_async_t * handle) static void enter_alter_series(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_alter_t * q_alter = (query_alter_t *) query->data; MASTER_CHECK_ACCESSIBLE(siridb) @@ -656,7 +656,7 @@ static void enter_alter_series(uv_async_t * handle) static void enter_alter_server(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_alter_t * q_alter = (query_alter_t *) query->data; siridb_server_t * server = siridb_server_from_node( siridb, @@ -716,7 +716,7 @@ static void enter_alter_stmt(uv_async_t * handle) static void enter_alter_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) @@ -844,7 +844,7 @@ static void enter_drop_stmt(uv_async_t * handle) static void enter_grant_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_user_t * db_user = query->client->origin; SIRIPARSER_MASTER_CHECK_ACCESS(db_user, SIRIDB_ACCESS_GRANT) MASTER_CHECK_ACCESSIBLE(siridb) @@ -884,7 +884,7 @@ static void enter_grant_user(uv_async_t * handle) static void enter_group_tag_match(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; cleri_node_t * node = query->nodes->node; query_wrapper_t * q_wrapper = query->data; siridb_group_t * group; @@ -1006,7 +1006,7 @@ static void enter_help(uv_async_t * handle) static void enter_limit_expr(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_list_t * qlist = (query_list_t *) query->data; int64_t limit = CLERI_NODE_DATA(cleri_gn(query->nodes->node->children->next)); @@ -1095,7 +1095,7 @@ static void enter_merge_as(uv_async_t * handle) static void enter_revoke_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_user_t * db_user = query->client->origin; SIRIPARSER_MASTER_CHECK_ACCESS(db_user, SIRIDB_ACCESS_REVOKE) MASTER_CHECK_ACCESSIBLE(siridb) @@ -1139,7 +1139,7 @@ static void enter_revoke_user(uv_async_t * handle) static void enter_select_stmt(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_select_t * q_select; cleri_children_t * child; int skip_get_points; @@ -1197,7 +1197,7 @@ static void enter_select_stmt(uv_async_t * handle) static void enter_set_expression(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; cleri_node_t * node = cleri_gn(query->nodes->node->children->next->next); query_alter_t * q_alter = (query_alter_t *) query->data; @@ -1234,7 +1234,7 @@ static void enter_set_ignore_threshold(uv_async_t * handle) static void enter_set_name(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; cleri_node_t * name_node = cleri_gn(query->nodes->node->children->next->next); @@ -1312,7 +1312,7 @@ static void enter_series_name(uv_async_t * handle) { siridb_query_t * query = handle->data; cleri_node_t * node = query->nodes->node; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_wrapper_t * q_wrapper = query->data; siridb_series_t * series = NULL; uint16_t pool; @@ -1512,7 +1512,7 @@ static void enter_series_parentheses(uv_async_t * handle) static void enter_series_all(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_series_t * series; query_wrapper_t * q_wrapper = query->data; @@ -1571,7 +1571,7 @@ static void enter_series_all(uv_async_t * handle) static void enter_series_re(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; cleri_node_t * node = query->nodes->node; query_wrapper_t * q_wrapper = query->data; @@ -1700,7 +1700,7 @@ static void enter_tag_series(uv_async_t * handle) { siridb_query_t * query = (siridb_query_t *) handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_alter_t * q_alter = (query_alter_t *) query->data; MASTER_CHECK_ACCESSIBLE(siridb) @@ -1817,7 +1817,7 @@ static void enter_timeit_stmt(uv_async_t * handle) static void enter_untag_series(uv_async_t * handle) { siridb_query_t * query = (siridb_query_t *) handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_alter_t * q_alter = (query_alter_t *) query->data; q_alter->tp = QUERY_ALTER_SERIES; @@ -2008,7 +2008,7 @@ static void exit_tail_expr(uv_async_t * handle) static void exit_alter_group(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (siridb_groups_save(siridb->groups)) { @@ -2037,7 +2037,7 @@ static void exit_alter_group(uv_async_t * handle) static void exit_alter_tag(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_tag_t * tag = ((query_alter_t *) query->data)->via.tag; siridb_tags_set_require_save(siridb->tags, tag); @@ -2064,7 +2064,7 @@ static void exit_alter_tag(uv_async_t * handle) static void exit_alter_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (siridb_users_save(siridb)) { @@ -2163,7 +2163,7 @@ static void exit_calc_stmt(uv_async_t * handle) static void exit_count_groups(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; if (q_count->where_expr == NULL || !cexpr_contains( @@ -2196,7 +2196,7 @@ static void exit_count_groups(uv_async_t * handle) static void exit_count_pools(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; siridb_pool_t * pool = siridb->pools->pool + siridb->server->pool; @@ -2241,7 +2241,7 @@ static void exit_count_pools(uv_async_t * handle) static void exit_count_series(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; MASTER_CHECK_ONLINE(siridb) @@ -2304,7 +2304,7 @@ static void exit_count_series(uv_async_t * handle) static void exit_count_series_length(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; MASTER_CHECK_ACCESSIBLE(siridb) @@ -2391,7 +2391,7 @@ static void exit_count_series_length(uv_async_t * handle) static void exit_count_servers(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; cexpr_t * where_expr = q_count->where_expr; cexpr_cb_t cb = (cexpr_cb_t) siridb_server_cexpr_cb; @@ -2447,7 +2447,7 @@ static void exit_count_servers(uv_async_t * handle) static void exit_count_servers_received(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; cexpr_t * where_expr = q_count->where_expr; cexpr_cb_t cb = (cexpr_cb_t) siridb_server_cexpr_cb; @@ -2481,7 +2481,7 @@ static void exit_count_servers_received(uv_async_t * handle) static void exit_count_servers_selected(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; cexpr_t * where_expr = q_count->where_expr; cexpr_cb_t cb = (cexpr_cb_t) siridb_server_cexpr_cb; @@ -2515,7 +2515,7 @@ static void exit_count_servers_selected(uv_async_t * handle) static void exit_count_shards(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; qp_add_raw(query->packer, (const unsigned char *) "shards", 6); @@ -2585,7 +2585,7 @@ static void exit_count_shards(uv_async_t * handle) static void exit_count_shards_size(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; uint64_t duration; size_t i; @@ -2648,7 +2648,7 @@ static void exit_count_shards_size(uv_async_t * handle) static void exit_count_tags(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_count_t * q_count = (query_count_t *) query->data; if (q_count->where_expr == NULL || !cexpr_contains( @@ -2681,7 +2681,7 @@ static void exit_count_tags(uv_async_t * handle) static void exit_count_users(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; llist_node_t * node = siridb->users->first; cexpr_t * where_expr = ((query_count_t *) query->data)->where_expr; cexpr_cb_t cb = (cexpr_cb_t) siridb_user_cexpr_cb; @@ -2706,7 +2706,7 @@ static void exit_count_users(uv_async_t * handle) static void exit_create_group(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; cleri_node_t * name_nd = cleri_gn(query->nodes->node->children->next); @@ -2768,7 +2768,7 @@ static void exit_create_group(uv_async_t * handle) static void exit_create_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_user_t * user = ((query_alter_t *) query->data)->via.user; cleri_node_t * user_node = cleri_gn(query->nodes->node->children->next); @@ -2832,7 +2832,7 @@ static void exit_create_user(uv_async_t * handle) static void exit_drop_group(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) @@ -2871,7 +2871,7 @@ static void exit_drop_group(uv_async_t * handle) static void exit_drop_series(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_drop_t * q_drop = (query_drop_t *) query->data; MASTER_CHECK_ACCESSIBLE(siridb) @@ -2983,7 +2983,7 @@ static void exit_drop_series(uv_async_t * handle) static void exit_drop_server(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_server_t * server = siridb_server_from_node( siridb, cleri_gn(cleri_gn(query->nodes->node->children->next)->children), @@ -3052,7 +3052,7 @@ static void exit_drop_server(uv_async_t * handle) static void exit_drop_shards(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_drop_t * q_drop = (query_drop_t *) query->data; MASTER_CHECK_ACCESSIBLE(siridb) @@ -3154,7 +3154,7 @@ static void exit_drop_shards(uv_async_t * handle) static void exit_drop_tag(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) @@ -3193,7 +3193,7 @@ static void exit_drop_tag(uv_async_t * handle) static void exit_drop_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) @@ -3234,7 +3234,7 @@ static void exit_drop_user(uv_async_t * handle) static void exit_grant_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (siridb_users_save(siridb)) { @@ -3312,7 +3312,7 @@ static void exit_help_xxx(uv_async_t * handle) static void exit_list_groups(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_list_t * q_list = (query_list_t *) query->data; int is_local = (q_list->props == NULL); @@ -3369,7 +3369,7 @@ static void exit_list_groups(uv_async_t * handle) static void exit_list_pools(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_list_t * q_list = (query_list_t *) query->data; siridb_pool_t * pool = siridb->pools->pool + siridb->server->pool; siridb_pool_walker_t wpool = { @@ -3451,7 +3451,7 @@ static void exit_list_series(uv_async_t * handle) { siridb_query_t * query = handle->data; query_list_t * q_list = (query_list_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (q_list->props == NULL) { @@ -3504,7 +3504,7 @@ static void exit_list_series(uv_async_t * handle) static void exit_list_servers(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_list_t * q_list = (query_list_t *) query->data; cexpr_t * where_expr = q_list->where_expr; @@ -3589,7 +3589,7 @@ static void exit_list_servers(uv_async_t * handle) static void exit_list_shards(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_list_t * q_list = (query_list_t *) query->data; uint_fast16_t prop; @@ -3724,7 +3724,7 @@ static void exit_list_shards(uv_async_t * handle) static void exit_list_tags(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; query_list_t * q_list = (query_list_t *) query->data; int is_local = (q_list->props == NULL); @@ -3781,7 +3781,7 @@ static void exit_list_tags(uv_async_t * handle) static void exit_list_users(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; llist_node_t * node = siridb->users->first; vec_t * props = ((query_list_t *) query->data)->props; @@ -3841,7 +3841,7 @@ static void exit_list_users(uv_async_t * handle) static void exit_revoke_user(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (siridb_users_save(siridb)) { @@ -4147,7 +4147,7 @@ static void exit_set_address(uv_async_t * handle) siridb_query_t * query = handle->data; siridb_server_t * server = ((query_alter_t *) query->data)->via.server; cleri_node_t * node = cleri_gn(query->nodes->node->children->next->next); - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (siridb->server == server || server->client != NULL) { @@ -4189,7 +4189,7 @@ static void exit_set_address(uv_async_t * handle) static void exit_set_backup_mode(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; assert (query->data != NULL); assert (IS_MASTER); @@ -4289,7 +4289,7 @@ static void exit_set_backup_mode(uv_async_t * handle) static void exit_set_drop_threshold(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) @@ -4353,7 +4353,7 @@ static void exit_set_expiration_xxx( uint8_t tp) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) MASTER_CHECK_VERSION(siridb, "2.0.35") @@ -4444,7 +4444,7 @@ static void exit_set_expiration_xxx( static void exit_set_expiration_log(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; exit_set_expiration_xxx( handle, @@ -4456,7 +4456,7 @@ static void exit_set_expiration_log(uv_async_t * handle) static void exit_set_expiration_num(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; exit_set_expiration_xxx( handle, @@ -4467,7 +4467,7 @@ static void exit_set_expiration_num(uv_async_t * handle) static void exit_set_list_limit(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) MASTER_CHECK_VERSION(siridb, "2.0.17") @@ -4531,7 +4531,7 @@ static void exit_set_log_level(uv_async_t * handle) { siridb_query_t * query = handle->data; query_alter_t * q_alter = (query_alter_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; assert (query->data != NULL); @@ -4674,7 +4674,7 @@ static void exit_set_port(uv_async_t * handle) siridb_query_t * query = handle->data; siridb_server_t * server = ((query_alter_t *) query->data)->via.server; cleri_node_t * node = cleri_gn(query->nodes->node->children->next->next); - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (siridb->server == server || server->client != NULL) { @@ -4725,7 +4725,7 @@ static void exit_set_port(uv_async_t * handle) static void exit_set_select_points_limit(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) MASTER_CHECK_VERSION(siridb, "2.0.17") @@ -4788,7 +4788,7 @@ static void exit_set_select_points_limit(uv_async_t * handle) static void exit_set_tee(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) @@ -4880,7 +4880,7 @@ static void exit_set_timezone(uv_async_t * handle) { siridb_query_t * query = handle->data; cleri_node_t * node = cleri_gn(query->nodes->node->children->next->next); - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; MASTER_CHECK_ACCESSIBLE(siridb) @@ -4944,7 +4944,7 @@ static void exit_set_timezone(uv_async_t * handle) static void exit_show_stmt(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_user_t * db_user = query->client->origin; SIRIPARSER_MASTER_CHECK_ACCESS(db_user, SIRIDB_ACCESS_SHOW) @@ -5026,7 +5026,7 @@ static void exit_tag_series(uv_async_t * handle) static void exit_timeit_stmt(uv_async_t * handle) { siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; struct timespec end; char * name = siridb->server->name; @@ -5187,7 +5187,7 @@ static void async_drop_series(uv_async_t * handle) { siridb_query_t * query = handle->data; query_drop_t * q_drop = (query_drop_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_series_t * series; uint8_t async_more = 0; @@ -5244,7 +5244,7 @@ static void async_drop_shards(uv_async_t * handle) { siridb_query_t * query = handle->data; query_drop_t * q_drop = (query_drop_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (q_drop->shards_list->len) { @@ -5448,7 +5448,7 @@ static void async_no_points_aggregate(uv_async_t * handle) { siridb_query_t * query = handle->data; query_select_t * q_select = query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; uint8_t async_more = 0; siridb_series_t * series; siridb_points_t * points; @@ -5589,7 +5589,7 @@ static void async_select_aggregate(uv_async_t * handle) { siridb_query_t * query = handle->data; query_select_t * q_select = query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; uint8_t async_more = 0; siridb_series_t * series; siridb_points_t * points; @@ -6151,7 +6151,7 @@ static void on_groups_response(vec_t * promises, uv_async_t * handle) sirinet_promise_t * promise; qp_unpacker_t unpacker; siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_group_t * group; qp_obj_t qp_name; qp_obj_t qp_series; @@ -6208,7 +6208,7 @@ static void on_tags_response(vec_t * promises, uv_async_t * handle) sirinet_promise_t * promise; qp_unpacker_t unpacker; siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_tag_t * tag; qp_obj_t qp_name; qp_obj_t qp_series; @@ -6352,7 +6352,7 @@ static void on_select_response(vec_t * promises, uv_async_t * handle) sirinet_promise_t * promise; qp_unpacker_t unpacker; siridb_query_t * query = handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; size_t err_count = 0; query_select_t * q_select = query->data; qp_obj_t qp_name; @@ -6645,7 +6645,7 @@ static void master_select_work(uv_work_t * work) uv_async_t * handle = (uv_async_t *) work->data; siridb_query_t * query = handle->data; query_select_t * q_select = query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb->selected_points += q_select->n; int rc = ct_items( q_select->result, @@ -7023,7 +7023,7 @@ static void finish_list_groups(uv_async_t * handle) { siridb_query_t * query = handle->data; query_list_t * q_list = (query_list_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (q_list->props == NULL) { @@ -7056,7 +7056,7 @@ static void finish_count_groups(uv_async_t * handle) { siridb_query_t * query = handle->data; query_count_t * q_count = (query_count_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; /* Note: ct_values(..values_count_groups..) can only result in a positive * value. @@ -7117,7 +7117,7 @@ static void finish_list_tags(uv_async_t * handle) { siridb_query_t * query = handle->data; query_list_t * q_list = (query_list_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; if (q_list->props == NULL) { @@ -7150,7 +7150,7 @@ static void finish_count_tags(uv_async_t * handle) { siridb_query_t * query = handle->data; query_count_t * q_count = (query_count_t *) query->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; /* Note: ct_values(..values_count_tags..) can only result in a positive * value. diff --git a/src/siri/db/query.c b/src/siri/db/query.c index 3f9f7a0a..4ba392ed 100644 --- a/src/siri/db/query.c +++ b/src/siri/db/query.c @@ -112,10 +112,12 @@ void siridb_query_run( /* bind pid, client and flags so we can send back the result */ query->pid = pid; - /* increment client reference counter */ + /* increment client and siridb reference counters */ sirinet_stream_incref(client); + siridb_incref(client->siridb); query->client = client; + query->siridb = client->siridb; query->flags = flags; /* bind time precision factor */ @@ -153,10 +155,11 @@ void siridb_query_run( void siridb_query_free(uv_handle_t * handle) { siridb_query_t * query = (siridb_query_t *) handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; - /* decrement active tasks */ + /* decrement active tasks and siridb */ siridb_tasks_dec(siridb->tasks); + siridb_decref(siridb); /* free query */ free(query->q); @@ -265,7 +268,7 @@ void siridb_query_forward( int flags) { siridb_query_t * query = (siridb_query_t *) handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; /* * the size is important here, we will use the alloc_size to guess the @@ -563,7 +566,7 @@ static void QUERY_send_no_query(uv_async_t * handle) query->packer = sirinet_packer_new(512); qp_add_type(query->packer, QP_MAP1); - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; qp_add_raw(query->packer, (const unsigned char *) "calc", 4); uint64_t ts = siridb_time_now(siridb, query->start); @@ -585,7 +588,7 @@ static void QUERY_parse(uv_async_t * handle) { int rc; siridb_query_t * query = (siridb_query_t *) handle->data; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; siridb_walker_t * walker = siridb_walker_new( siridb, @@ -678,7 +681,7 @@ static int QUERY_to_packer(qp_packer_t * packer, siridb_query_t * query) /* reserve 200 extra chars */ char buffer[packer->alloc_size]; size_t size = packer->alloc_size; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; rc = QUERY_rebuild( siridb, diff --git a/src/siri/db/servers.c b/src/siri/db/servers.c index 690f3b26..f4de8df2 100644 --- a/src/siri/db/servers.c +++ b/src/siri/db/servers.c @@ -538,7 +538,7 @@ int siridb_servers_list(siridb_server_t * server, uv_async_t * handle) siridb_query_t * query = handle->data; query_list_t * qlist = query->data; vec_t * props = qlist->props; - siridb_t * siridb = query->client->siridb; + siridb_t * siridb = query->siridb; cexpr_t * where_expr = qlist->where_expr; size_t i; diff --git a/src/siri/db/shard.c b/src/siri/db/shard.c index c1552d76..01c24ec9 100644 --- a/src/siri/db/shard.c +++ b/src/siri/db/shard.c @@ -1717,8 +1717,12 @@ void siridb__shard_free(siridb_shard_t * shard) } /* this will close the file, even when other references exist */ + uv_mutex_lock(&siri.fh->lock_); + siri_fp_decref(shard->fp); + uv_mutex_unlock(&siri.fh->lock_); + free(shard->fn); free(shard); } diff --git a/src/siri/file/handler.c b/src/siri/file/handler.c index 9afaaeba..ff528145 100644 --- a/src/siri/file/handler.c +++ b/src/siri/file/handler.c @@ -24,15 +24,16 @@ siri_fh_t * siri_fh_new(uint16_t size) free(fh); fh = NULL; } + uv_mutex_init(&fh->lock_); } return fh; } /* - * Destroy file handler. (closes all open files in the file handler) + * Close file handler. (closes all open files in the file handler) * In case closing an open file fails, a SIGNAL will be raised. */ -void siri_fh_free(siri_fh_t * fh) +void siri_fh_close(siri_fh_t * fh) { siri_fp_t ** fp; uint16_t i; @@ -52,10 +53,20 @@ void siri_fh_free(siri_fh_t * fh) } siri_fp_decref(*fp); } +} + +/* + * Destroy file handler. (closes all open files in the file handler) + * In case closing an open file fails, a SIGNAL will be raised. + */ +void siri_fh_free(siri_fh_t * fh) +{ free(fh->fpointers); + uv_mutex_destroy(&fh->lock_); free(fh); } + /* * Returns 0 if successful or -1 in case of an error. */ @@ -65,7 +76,9 @@ int siri_fopen( const char * fn, const char * modes) { - siri_fp_t ** dest = fh->fpointers + fh->idx; + siri_fp_t ** dest; + uv_mutex_lock(&fh->lock_); + dest = fh->fpointers + fh->idx; /* close and possible free file pointer at next position */ if (*dest != NULL) @@ -82,12 +95,13 @@ int siri_fopen( if ((fp->fp = fopen(fn, modes)) == NULL) { log_critical("Cannot open file: '%s' using mode '%s'", fn, modes); + uv_mutex_unlock(&fh->lock_); return -1; } /* set file handler pointer to next position */ fh->idx = (fh->idx + 1) % fh->size; - + uv_mutex_unlock(&fh->lock_); return 0; } diff --git a/src/siri/grammar/grammar.c b/src/siri/grammar/grammar.c index ba49e8a9..46736df0 100644 --- a/src/siri/grammar/grammar.c +++ b/src/siri/grammar/grammar.c @@ -5,7 +5,7 @@ * should be used with the libcleri module. * * Source class: SiriGrammar - * Created at: 2022-05-05 15:08:05 + * Created at: 2023-10-24 15:46:26 */ #include "siri/grammar/grammar.h" @@ -124,6 +124,7 @@ cleri_grammar_t * compile_siri_grammar_grammar(void) ); cleri_t * k_now = cleri_keyword(CLERI_GID_K_NOW, "now", CLERI_CASE_SENSITIVE); cleri_t * k_number = cleri_keyword(CLERI_GID_K_NUMBER, "number", CLERI_CASE_SENSITIVE); + cleri_t * k_offset = cleri_keyword(CLERI_GID_K_OFFSET, "offset", CLERI_CASE_SENSITIVE); cleri_t * k_online = cleri_keyword(CLERI_GID_K_ONLINE, "online", CLERI_CASE_SENSITIVE); cleri_t * k_open_files = cleri_keyword(CLERI_GID_K_OPEN_FILES, "open_files", CLERI_CASE_SENSITIVE); cleri_t * k_or = cleri_keyword(CLERI_GID_K_OR, "or", CLERI_CASE_SENSITIVE); @@ -1050,6 +1051,14 @@ cleri_grammar_t * compile_siri_grammar_grammar(void) cleri_optional(CLERI_NONE, time_expr), cleri_token(CLERI_NONE, ")") ); + cleri_t * f_offset = cleri_sequence( + CLERI_GID_F_OFFSET, + 4, + k_offset, + cleri_token(CLERI_NONE, "("), + time_expr, + cleri_token(CLERI_NONE, ")") + ); cleri_t * f_timeval = cleri_sequence( CLERI_GID_F_TIMEVAL, 3, @@ -1114,8 +1123,9 @@ cleri_grammar_t * compile_siri_grammar_grammar(void) cleri_t * aggregate_functions = cleri_list(CLERI_GID_AGGREGATE_FUNCTIONS, cleri_choice( CLERI_NONE, CLERI_FIRST_MATCH, - 21, + 22, f_all, + f_offset, f_limit, f_mean, f_sum, diff --git a/src/siri/siri.c b/src/siri/siri.c index 83b4fc0d..bebc47ff 100644 --- a/src/siri/siri.c +++ b/src/siri/siri.c @@ -358,8 +358,8 @@ void siri_free(void) } } - /* first free the File Handler. (this will close all open shard files) */ - siri_fh_free(siri.fh); + /* first close the File Handler. (this will close all open shard files) */ + siri_fh_close(siri.fh); /* this will free each SiriDB database and the list */ llist_free_cb(siri.siridb_list, (llist_cb) siridb_decref_cb, NULL); @@ -376,6 +376,9 @@ void siri_free(void) /* free config */ siri_cfg_destroy(&siri); + /* free the file handler */ + siri_fh_free(siri.fh); + /* free event loop */ free(siri.loop); } |