aboutsummaryrefslogtreecommitdiffstats
path: root/utils
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-06-14 22:40:31 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-06-14 22:40:31 +0100
commit1c356c51a97e023e8fc936d46477233e5d65cc5b (patch)
tree8a59d0a13351d701bebe327cde34e6ebdcfd3c09 /utils
parent1de3b213131faf3e4cf4864f93e52739f4865e13 (diff)
downloadrspamd-1c356c51a97e023e8fc936d46477233e5d65cc5b.tar.gz
rspamd-1c356c51a97e023e8fc936d46477233e5d65cc5b.zip
[Minor] Add a simple received parser benchmark routine
Diffstat (limited to 'utils')
-rw-r--r--utils/CMakeLists.txt15
-rw-r--r--utils/received_parser_bench.c90
2 files changed, 104 insertions, 1 deletions
diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt
index 672325924..e0bb5c886 100644
--- a/utils/CMakeLists.txt
+++ b/utils/CMakeLists.txt
@@ -1,5 +1,6 @@
SET(UTILSERVERSRC rspamd_http_server.c)
SET(UTILBENCHSRC rspamd_http_bench.c)
+SET(RECVBENCHSRC received_parser_bench.c)
ADD_EXECUTABLE(rspamd-http-server ${UTILSERVERSRC})
SET_TARGET_PROPERTIES(rspamd-http-server PROPERTIES LINKER_LANGUAGE C)
@@ -9,13 +10,25 @@ TARGET_LINK_LIBRARIES(rspamd-http-server ${RSPAMD_REQUIRED_LIBRARIES})
ADD_EXECUTABLE(rspamd-http-bench ${UTILBENCHSRC})
SET_TARGET_PROPERTIES(rspamd-http-bench PROPERTIES LINKER_LANGUAGE C)
-TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-server)
TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-http-parser)
+TARGET_LINK_LIBRARIES(rspamd-http-bench rspamd-server)
TARGET_LINK_LIBRARIES(rspamd-http-bench ${RSPAMD_REQUIRED_LIBRARIES})
+ADD_EXECUTABLE(rspamd-received-bench ${RECVBENCHSRC})
+SET_TARGET_PROPERTIES(rspamd-received-bench PROPERTIES LINKER_LANGUAGE C)
+TARGET_LINK_LIBRARIES(rspamd-received-bench rspamd-server)
+IF (ENABLE_SNOWBALL MATCHES "ON")
+ TARGET_LINK_LIBRARIES(rspamd-received-bench stemmer)
+ENDIF()
+IF(ENABLE_HIREDIS MATCHES "ON")
+ TARGET_LINK_LIBRARIES(rspamd-received-bench rspamd-hiredis)
+ENDIF()
+TARGET_LINK_LIBRARIES(rspamd-received-bench ${RSPAMD_REQUIRED_LIBRARIES})
+
IF (ENABLE_HYPERSCAN MATCHES "ON")
SET_TARGET_PROPERTIES(rspamd-http-bench PROPERTIES LINKER_LANGUAGE CXX)
SET_TARGET_PROPERTIES(rspamd-http-server PROPERTIES LINKER_LANGUAGE CXX)
+ SET_TARGET_PROPERTIES(rspamd-received-bench PROPERTIES LINKER_LANGUAGE CXX)
ENDIF()
# Redirector
diff --git a/utils/received_parser_bench.c b/utils/received_parser_bench.c
new file mode 100644
index 000000000..65c656741
--- /dev/null
+++ b/utils/received_parser_bench.c
@@ -0,0 +1,90 @@
+/*-
+ * Copyright 2016 Vsevolod Stakhov
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "config.h"
+#include "printf.h"
+#include "message.h"
+#include "smtp_parsers.h"
+
+static gdouble total_time = 0;
+static gint total_parsed = 0;
+
+static void
+rspamd_process_file (const gchar *fname)
+{
+ struct rspamd_task *task;
+ GIOChannel *f;
+ GError *err = NULL;
+ GString *buf;
+ struct received_header rh;
+ gdouble t1, t2;
+
+ f = g_io_channel_new_file (fname, "r", &err);
+
+ if (!f) {
+ rspamd_fprintf (stderr, "cannot open %s: %e\n", fname, err);
+ g_error_free (err);
+
+ return;
+ }
+
+ g_io_channel_set_encoding (f, NULL, NULL);
+ buf = g_string_sized_new (8192);
+ task = g_malloc0 (sizeof (task));
+ task->task_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), "test");
+
+ while (g_io_channel_read_line_string (f, buf, NULL, &err)
+ == G_IO_STATUS_NORMAL) {
+
+ while (buf->len > 0 && g_ascii_isspace (buf->str[buf->len - 1])) {
+ buf->len --;
+ }
+
+ t1 = rspamd_get_virtual_ticks ();
+ rspamd_smtp_recieved_parse (task, buf->str, buf->len, &rh);
+ t2 = rspamd_get_virtual_ticks ();
+
+ total_time += t2 - t1;
+ total_parsed ++;
+ }
+
+ if (err) {
+ rspamd_fprintf (stderr, "cannot read %s: %e\n", fname, err);
+ g_error_free (err);
+ }
+
+ g_io_channel_unref (f);
+ g_string_free (buf, TRUE);
+ rspamd_mempool_delete (task->task_pool);
+ g_free (task);
+}
+
+int
+main (int argc, char **argv)
+{
+ gint i;
+
+ for (i = 1; i < argc; i ++) {
+ if (argv[i]) {
+ rspamd_process_file (argv[i]);
+ }
+ }
+
+ rspamd_printf ("Parsed %d received headers in %.3f seconds\n",
+ total_parsed, total_time);
+
+ return 0;
+}