summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gevers <elbrus@debian.org>2023-10-28 23:02:37 +0200
committerPaul Gevers <elbrus@debian.org>2023-10-28 23:02:37 +0200
commit5542d49f212eeccb9cddee26f2bfe3768a78cb74 (patch)
treeb1dfbea4316621e56810b81e0053727074ace6bb
parentb828eb790661efbe8007bae6da16654b34307b58 (diff)
parent8a46b295909db05606a9004454ed173bbfe607a9 (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/Dockerfile2
-rw-r--r--docs/Kubernetes/statefulset.yaml4
-rw-r--r--grammar/grammar.py5
-rw-r--r--help/help_timezones.md2
-rw-r--r--include/siri/db/insert.h2
-rw-r--r--include/siri/db/query.h1
-rw-r--r--include/siri/file/handler.h3
-rw-r--r--include/siri/grammar/grammar.h4
-rw-r--r--include/siri/version.h2
-rw-r--r--src/iso8601/iso8601.c7
-rw-r--r--src/siri/db/aggregate.c20
-rw-r--r--src/siri/db/listener.c148
-rw-r--r--src/siri/db/query.c17
-rw-r--r--src/siri/db/servers.c2
-rw-r--r--src/siri/db/shard.c4
-rw-r--r--src/siri/file/handler.c22
-rw-r--r--src/siri/grammar/grammar.c14
-rw-r--r--src/siri/siri.c7
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);
}