summaryrefslogtreecommitdiffstats
path: root/src/libserver
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@rspamd.com>2022-04-23 14:35:39 +0100
committerVsevolod Stakhov <vsevolod@rspamd.com>2022-04-23 14:35:39 +0100
commitdf2db47fa7204c33880a056589728e8f62167d9f (patch)
tree53cb81ff9a69aa989a0261d5961073214fc58bcf /src/libserver
parentd351bf7850aab1f5f9d7cd5dd7442e55d36f6fbf (diff)
downloadrspamd-df2db47fa7204c33880a056589728e8f62167d9f.tar.gz
rspamd-df2db47fa7204c33880a056589728e8f62167d9f.zip
[Rework] Further steps
Diffstat (limited to 'src/libserver')
-rw-r--r--src/libserver/symcache/symcache_c.cxx42
-rw-r--r--src/libserver/symcache/symcache_internal.hxx12
-rw-r--r--src/libserver/symcache/symcache_item.cxx24
-rw-r--r--src/libserver/symcache/symcache_item.hxx2
4 files changed, 74 insertions, 6 deletions
diff --git a/src/libserver/symcache/symcache_c.cxx b/src/libserver/symcache/symcache_c.cxx
index df75bf2c8..abedba23f 100644
--- a/src/libserver/symcache/symcache_c.cxx
+++ b/src/libserver/symcache/symcache_c.cxx
@@ -221,20 +221,51 @@ rspamd_symcache_item_name (struct rspamd_symcache_item *item)
}
gint
-rspamd_symcache_item_flags (struct rspamd_symcache_item *item)
+rspamd_symcache_item_flags(struct rspamd_symcache_item *item)
{
auto *real_item = C_API_SYMCACHE_ITEM(item);
return real_item->get_flags();
}
+guint
+rspamd_symcache_get_symbol_flags(struct rspamd_symcache *cache,
+ const gchar *symbol)
+{
+ auto *real_cache = C_API_SYMCACHE(cache);
+
+ auto *sym = real_cache->get_item_by_name(symbol, false);
+
+ if (sym) {
+ return sym->get_flags();
+ }
+
+ return 0;
+}
+
const struct rspamd_symcache_item_stat *
-rspamd_symcache_item_stat (struct rspamd_symcache_item *item)
+rspamd_symcache_item_stat(struct rspamd_symcache_item *item)
{
auto *real_item = C_API_SYMCACHE_ITEM(item);
return real_item->st;
}
void
+rspamd_symcache_get_symbol_details(struct rspamd_symcache *cache,
+ const gchar *symbol,
+ ucl_object_t *this_sym_ucl)
+{
+ auto *real_cache = C_API_SYMCACHE(cache);
+
+ auto *sym = real_cache->get_item_by_name(symbol, false);
+
+ if (sym) {
+ ucl_object_insert_key (this_sym_ucl,
+ ucl_object_fromstring(sym->get_type_str()),
+ "type", strlen("type"), false);
+ }
+}
+
+void
rspamd_symcache_foreach(struct rspamd_symcache *cache,
void (*func) (struct rspamd_symcache_item *item, gpointer /* userdata */),
gpointer ud)
@@ -246,9 +277,10 @@ rspamd_symcache_foreach(struct rspamd_symcache *cache,
});
}
-void rspamd_symcache_disable_all_symbols (struct rspamd_task *task,
- struct rspamd_symcache *_cache,
- guint skip_mask)
+void
+rspamd_symcache_disable_all_symbols(struct rspamd_task *task,
+ struct rspamd_symcache *_cache,
+ guint skip_mask)
{
auto *cache_runtime = C_API_SYMCACHE_RUNTIME(task->symcache_runtime);
diff --git a/src/libserver/symcache/symcache_internal.hxx b/src/libserver/symcache/symcache_internal.hxx
index 2c3bfe739..8a7e44e62 100644
--- a/src/libserver/symcache/symcache_internal.hxx
+++ b/src/libserver/symcache/symcache_internal.hxx
@@ -80,12 +80,23 @@ struct symcache_header {
struct cache_item;
using cache_item_ptr = std::shared_ptr<cache_item>;
+/**
+ * This structure is intended to keep the current ordering for all symbols
+ * It is designed to be shared among all tasks and keep references to the real
+ * symbols.
+ * If some symbol has been added or removed to the symbol cache, it will not affect
+ * the current order, and it will only be regenerated for the subsequent tasks.
+ * This allows safe and no copy sharing and keeping track of all symbols in the
+ * cache runtime.
+ */
struct order_generation {
+ /* All items ordered */
std::vector<cache_item_ptr> d;
/* Mapping from symbol name to the position in the order array */
robin_hood::unordered_flat_map<std::string_view, unsigned int> by_symbol;
/* Mapping from symbol id to the position in the order array */
robin_hood::unordered_flat_map<unsigned int, unsigned int> by_cache_id;
+ /* It matches cache->generation_id; if not, a fresh ordering is required */
unsigned int generation_id;
explicit order_generation(std::size_t nelts, unsigned id) : generation_id(id) {
@@ -100,7 +111,6 @@ struct order_generation {
using order_generation_ptr = std::shared_ptr<order_generation>;
-
struct delayed_cache_dependency {
std::string from;
std::string to;
diff --git a/src/libserver/symcache/symcache_item.cxx b/src/libserver/symcache/symcache_item.cxx
index b25fc991f..0ca080ac0 100644
--- a/src/libserver/symcache/symcache_item.cxx
+++ b/src/libserver/symcache/symcache_item.cxx
@@ -203,6 +203,30 @@ auto cache_item::update_counters_check_peak(lua_State *L,
return ret;
}
+auto cache_item::get_type_str() const -> const char *
+{
+ switch(type) {
+ case symcache_item_type::CONNFILTER:
+ return "connfilter";
+ case symcache_item_type::FILTER:
+ return "filter";
+ case symcache_item_type::IDEMPOTENT:
+ return "idempotent";
+ case symcache_item_type::PREFILTER:
+ return "prefilter";
+ case symcache_item_type::POSTFILTER:
+ return "postfilter";
+ case symcache_item_type::COMPOSITE:
+ return "composite";
+ case symcache_item_type::CLASSIFIER:
+ return "classifier";
+ case symcache_item_type::VIRTUAL:
+ return "virtual";
+ }
+
+ RSPAMD_UNREACHABLE;
+}
+
auto virtual_item::get_parent(const symcache &cache) const -> const cache_item *
{
if (parent) {
diff --git a/src/libserver/symcache/symcache_item.hxx b/src/libserver/symcache/symcache_item.hxx
index 23347a8ec..18a46d317 100644
--- a/src/libserver/symcache/symcache_item.hxx
+++ b/src/libserver/symcache/symcache_item.hxx
@@ -260,6 +260,8 @@ public:
return type;
}
+ auto get_type_str() const -> const char*;
+
auto get_name() const -> const std::string &
{
return symbol;