commit 3d8a528: [Project] Some more adjustments in symbols registration

Vsevolod Stakhov vsevolod at rspamd.com
Sat Apr 30 19:21:25 UTC 2022


Author: Vsevolod Stakhov
Date: 2022-04-12 21:31:56 +0100
URL: https://github.com/rspamd/rspamd/commit/3d8a5284b352cd0b080a2edcbf7373406f95489f

[Project] Some more adjustments in symbols registration

---
 src/libserver/symcache/symcache_c.cxx        | 29 ++++++++++
 src/libserver/symcache/symcache_impl.cxx     | 83 ++++++++++++++++++++++++++--
 src/libserver/symcache/symcache_internal.hxx | 53 +++++++++++++-----
 src/libutil/mem_pool.h                       |  6 ++
 4 files changed, 152 insertions(+), 19 deletions(-)

diff --git a/src/libserver/symcache/symcache_c.cxx b/src/libserver/symcache/symcache_c.cxx
index 7c204b04e..8ba991f53 100644
--- a/src/libserver/symcache/symcache_c.cxx
+++ b/src/libserver/symcache/symcache_c.cxx
@@ -54,3 +54,32 @@ rspamd_symcache_save (struct rspamd_symcache *cache)
 
 	real_cache->save_items();
 }
+
+gint
+rspamd_symcache_add_symbol (struct rspamd_symcache *cache,
+								 const gchar *name,
+								 gint priority,
+								 symbol_func_t func,
+								 gpointer user_data,
+								 enum rspamd_symbol_type type,
+								 gint parent)
+{
+	auto *real_cache = C_API_SYMCACHE(cache);
+
+	if (func) {
+		g_assert (parent == -1);
+
+		return real_cache->add_symbol_with_callback(name, priority, func, user_data, type);
+	}
+	else {
+		return real_cache->add_virtual_symbol(name, parent, type);
+	}
+}
+
+void
+rspamd_symcache_set_peak_callback (struct rspamd_symcache *cache, gint cbref)
+{
+	auto *real_cache = C_API_SYMCACHE(cache);
+
+	real_cache->set_peak_cb(cbref);
+}
\ No newline at end of file
diff --git a/src/libserver/symcache/symcache_impl.cxx b/src/libserver/symcache/symcache_impl.cxx
index 3da915ebe..92cd6f3fb 100644
--- a/src/libserver/symcache/symcache_impl.cxx
+++ b/src/libserver/symcache/symcache_impl.cxx
@@ -18,6 +18,7 @@
 #include "unix-std.h"
 #include "libutil/cxx/locked_file.hxx"
 #include "fmt/core.h"
+#include "contrib/t1ha/t1ha.h"
 
 #include <cmath>
 
@@ -556,6 +557,18 @@ auto symcache::add_symbol_with_callback(std::string_view name,
 
 	auto real_type_pair = real_type_pair_maybe.value();
 
+	if (real_type_pair.first != symcache_item_type::FILTER) {
+		real_type_pair.second |= SYMBOL_TYPE_NOSTAT;
+	}
+	if (real_type_pair.second & (SYMBOL_TYPE_GHOST|SYMBOL_TYPE_CALLBACK)) {
+		real_type_pair.second |= SYMBOL_TYPE_NOSTAT;
+	}
+
+	if ((real_type_pair.second & SYMBOL_TYPE_FINE) && priority == 0) {
+		/* Adjust priority for negative weighted symbols */
+		priority = 1;
+	}
+
 	std::string static_string_name;
 
 	if (name.empty()) {
@@ -570,14 +583,23 @@ auto symcache::add_symbol_with_callback(std::string_view name,
 		return -1;
 	}
 
-	auto item = cache_item::create_with_function(std::move(static_string_name),
+	auto id = items_by_id.size();
+
+	auto item = cache_item::create_with_function(static_pool, id,
+			std::move(static_string_name),
 			priority, func, user_data,
 			real_type_pair.first, real_type_pair.second);
 
 	items_by_symbol[item->get_name()] = item;
 	items_by_id.push_back(item);
+	used_items++;
+
+	if (!(real_type_pair.second & SYMBOL_TYPE_NOSTAT)) {
+		cksum = t1ha(name.data(), name.size(), cksum);
+		stats_symbols_count ++;
+	}
 
-	return items_by_id.size();
+	return id;
 }
 
 auto symcache::add_virtual_symbol(std::string_view name, int parent_id, enum rspamd_symbol_type flags_and_type) -> int
@@ -602,12 +624,26 @@ auto symcache::add_virtual_symbol(std::string_view name, int parent_id, enum rsp
 		return -1;
 	}
 
-	auto item = cache_item::create_with_virtual(std::string{name},
+	auto id = virtual_symbols.size();
+
+	auto item = cache_item::create_with_virtual(static_pool,
+			id,
+			std::string{name},
 			parent_id, real_type_pair.first, real_type_pair.second);
 	items_by_symbol[item->get_name()] = item;
 	virtual_symbols.push_back(item);
 
-	return virtual_symbols.size();
+	return id;
+}
+
+auto symcache::set_peak_cb(int cbref) -> void
+{
+	if (peak_cb != -1) {
+		luaL_unref(L, LUA_REGISTRYINDEX, peak_cb);
+	}
+
+	peak_cb = cbref;
+	msg_info_cache("registered peak callback");
 }
 
 
@@ -727,6 +763,28 @@ auto cache_item::process_deps(const symcache &cache) -> void
 			[](const auto &dep){ return !dep.item; }), std::end(deps));
 }
 
+auto cache_item::resolve_parent(const symcache &cache) -> bool
+{
+	auto log_tag = [&](){ return cache.log_tag(); };
+
+	if (is_virtual()) {
+		auto &virt = std::get<virtual_item>(specific);
+
+		if (virt.get_parent(cache)) {
+			msg_warn_cache("trying to resolve parent twice for %s", symbol.c_str());
+
+			return false;
+		}
+
+		return virt.resolve_parent(cache);
+	}
+	else {
+		msg_warn_cache("trying to resolve a parent for non-virtual symbol %s", symbol.c_str());
+	}
+
+	return false;
+}
+
 auto virtual_item::get_parent(const symcache &cache) const -> const cache_item *
 {
 	if (parent) {
@@ -736,6 +794,23 @@ auto virtual_item::get_parent(const symcache &cache) const -> const cache_item *
 	return cache.get_item_by_id(parent_id, false);
 }
 
+auto virtual_item::resolve_parent(const symcache &cache) -> bool
+{
+	if (parent) {
+		return false;
+	}
+
+	auto item_ptr = cache.get_item_by_id(parent_id, true);
+
+	if (item_ptr) {
+		parent = const_cast<cache_item*>(item_ptr)->getptr();
+
+		return true;
+	}
+
+	return false;
+}
+
 auto item_type_from_c(enum rspamd_symbol_type type) -> tl::expected<std::pair<symcache_item_type, int>, std::string>
 {
 	constexpr const auto trivial_types = SYMBOL_TYPE_CONNFILTER|SYMBOL_TYPE_PREFILTER
diff --git a/src/libserver/symcache/symcache_internal.hxx b/src/libserver/symcache/symcache_internal.hxx
index 674f4034d..77f48de19 100644
--- a/src/libserver/symcache/symcache_internal.hxx
+++ b/src/libserver/symcache/symcache_internal.hxx
@@ -149,6 +149,7 @@ public:
 	explicit virtual_item(int _parent_id) : parent_id(_parent_id) {}
 
 	auto get_parent(const symcache &cache) const -> const cache_item *;
+	auto resolve_parent(const symcache &cache) -> bool;
 };
 
 struct cache_dependency {
@@ -167,6 +168,8 @@ struct cache_item : std::enable_shared_from_this<cache_item> {
 	struct rspamd_symcache_item_stat *st = nullptr;
 	struct rspamd_counter_data *cd = nullptr;
 
+	/* Unique id - counter */
+	int id;
 	std::uint64_t last_count = 0;
 	std::string symbol;
 	symcache_item_type type;
@@ -179,8 +182,6 @@ struct cache_item : std::enable_shared_from_this<cache_item> {
 	int priority = 0;
 	/* Topological order */
 	unsigned int order = 0;
-	/* Unique id - counter */
-	int id = 0;
 	int frequency_peaks = 0;
 
 	/* Specific data for virtual and callback symbols */
@@ -208,15 +209,18 @@ public:
 	 * @param flags
 	 * @return
 	 */
-	[[nodiscard]] static auto create_with_function(std::string &&name,
+	[[nodiscard]] static auto create_with_function(rspamd_mempool_t *pool,
+												   int id,
+												   std::string &&name,
 												   int priority,
 												   symbol_func_t func,
 												   void *user_data,
 												   symcache_item_type type,
 												   int flags) -> cache_item_ptr {
-		return std::shared_ptr<cache_item>(new cache_item(std::move(name), priority,
-														  func, user_data,
-														  type, flags));
+		return std::shared_ptr<cache_item>(new cache_item(pool,
+				id, std::move(name), priority,
+				func, user_data,
+				type, flags));
 	}
 	/**
 	 * Create a virtual item
@@ -227,11 +231,13 @@ public:
 	 * @param flags
 	 * @return
 	 */
-	[[nodiscard]] static auto create_with_virtual(std::string &&name,
-												   int parent,
-												   symcache_item_type type,
-												   int flags) -> cache_item_ptr {
-		return std::shared_ptr<cache_item>(new cache_item(std::move(name),
+	[[nodiscard]] static auto create_with_virtual(rspamd_mempool_t *pool,
+												  int id,
+												  std::string &&name,
+												  int parent,
+												  symcache_item_type type,
+												  int flags) -> cache_item_ptr {
+		return std::shared_ptr<cache_item>(new cache_item(pool, id, std::move(name),
 				parent, type, flags));
 	}
 	/**
@@ -255,6 +261,7 @@ public:
 		return flags & SYMBOL_TYPE_GHOST;
 	}
 	auto get_parent(const symcache &cache) const -> const cache_item *;
+	auto resolve_parent(const symcache &cache) -> bool;
 	auto get_type() const -> auto {
 		return type;
 	}
@@ -282,12 +289,15 @@ private:
 	 * @param _type
 	 * @param _flags
 	 */
-	cache_item(std::string &&name,
+	cache_item(rspamd_mempool_t *pool,
+			   int _id,
+			   std::string &&name,
 			   int _priority,
 			   symbol_func_t func,
 			   void *user_data,
 			   symcache_item_type _type,
-			   int _flags) : symbol(std::move(name)),
+			   int _flags) : id(_id),
+			   				 symbol(std::move(name)),
 							 type(_type),
 							 flags(_flags),
 							 priority(_priority),
@@ -296,6 +306,8 @@ private:
 		forbidden_ids.reset();
 		allowed_ids.reset();
 		exec_only_ids.reset();
+		st = rspamd_mempool_alloc0_shared_type(pool, std::remove_pointer_t<decltype(st)>);
+		cd = rspamd_mempool_alloc0_shared_type(pool, std::remove_pointer_t<decltype(cd)>);
 	}
 	/**
 	 * Constructor for a virtual symbol
@@ -305,10 +317,13 @@ private:
 	 * @param _type
 	 * @param _flags
 	 */
-	cache_item(std::string &&name,
+	cache_item(rspamd_mempool_t *pool,
+			   int _id,
+			   std::string &&name,
 			   int parent,
 			   symcache_item_type _type,
-			   int _flags) : symbol(std::move(name)),
+			   int _flags) : id(_id),
+							 symbol(std::move(name)),
 							 type(_type),
 							 flags(_flags),
 							 specific(virtual_item{parent})
@@ -316,6 +331,8 @@ private:
 		forbidden_ids.reset();
 		allowed_ids.reset();
 		exec_only_ids.reset();
+		st = rspamd_mempool_alloc0_shared_type(pool, std::remove_pointer_t<decltype(st)>);
+		cd = rspamd_mempool_alloc0_shared_type(pool, std::remove_pointer_t<decltype(cd)>);
 	}
 };
 
@@ -476,6 +493,12 @@ public:
 	 */
 	auto add_virtual_symbol(std::string_view name, int parent_id,
 							enum rspamd_symbol_type flags_and_type) -> int;
+
+	/**
+	 * Sets a lua callback to be called on peaks in execution time
+	 * @param cbref
+	 */
+	auto set_peak_cb(int cbref) -> void;
 };
 
 /*
diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h
index 0ca1d3905..a9f4fec98 100644
--- a/src/libutil/mem_pool.h
+++ b/src/libutil/mem_pool.h
@@ -248,11 +248,17 @@ void *rspamd_mempool_alloc_shared_ (rspamd_mempool_t *pool, gsize size, gsize al
 	RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
 #define rspamd_mempool_alloc_shared(pool, size) \
 	rspamd_mempool_alloc_shared_((pool), (size), MIN_MEM_ALIGNMENT, (G_STRLOC))
+#define rspamd_mempool_alloc_shared_type(pool, type) \
+	(type *)(rspamd_mempool_alloc_shared_((pool), sizeof(type), \
+		MAX(MIN_MEM_ALIGNMENT, RSPAMD_ALIGNOF(type)), (G_STRLOC)))
 
 void *rspamd_mempool_alloc0_shared_ (rspamd_mempool_t *pool, gsize size, gsize alignment, const gchar *loc)
 	RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
 #define rspamd_mempool_alloc0_shared(pool, size) \
 	rspamd_mempool_alloc0_shared_((pool), (size), MIN_MEM_ALIGNMENT, (G_STRLOC))
+#define rspamd_mempool_alloc0_shared_type(pool, type) \
+	(type *)(rspamd_mempool_alloc0_shared_((pool), sizeof(type), \
+		MAX(MIN_MEM_ALIGNMENT, RSPAMD_ALIGNOF(type)), (G_STRLOC)))
 
 /**
  * Add destructor callback to pool


More information about the Commits mailing list