summaryrefslogtreecommitdiff
path: root/infra/monitor/monitor_transaction.c
diff options
context:
space:
mode:
authorlijia <[email protected]>2024-10-18 16:47:51 +0800
committerlijia <[email protected]>2024-11-07 18:30:58 +0800
commite734af76d81b07090c618b1c4af3b2fdd6b592f3 (patch)
treec9b894fb0eaa9c56bd5f04bfab5628a97592091d /infra/monitor/monitor_transaction.c
parent99a68d5c9efe500ab339165a2af515a0a7355ada (diff)
rebase onto develop-2.0
Diffstat (limited to 'infra/monitor/monitor_transaction.c')
-rw-r--r--infra/monitor/monitor_transaction.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/infra/monitor/monitor_transaction.c b/infra/monitor/monitor_transaction.c
new file mode 100644
index 0000000..0f9aba8
--- /dev/null
+++ b/infra/monitor/monitor_transaction.c
@@ -0,0 +1,83 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <pthread.h>
+#include "uthash/utlist.h"
+#include "monitor_private.h"
+
+/******************************************** connection manager *****************************************/
+struct stm_connection_manager *stm_connection_insert(struct evhttp_connection *evconn)
+{
+ struct stellar_monitor *stm = stellar_monitor_get();
+ struct stm_connection_manager *conn_mgr = stm->connection_mgr;
+ struct stm_connection_manager *ele, *tmp;
+ DL_FOREACH_SAFE(conn_mgr, ele, tmp) // check if current connection already exist
+ {
+ if (ele->conn == evconn)
+ {
+ stm->gettime_cb(&ele->last_active_time, NULL);
+ return ele;
+ }
+ }
+
+ stm_stat_update(stm->stat, stm->worker_thread_num, STM_STAT_CLI_CONNECTION_NEW, 1);
+ struct stm_connection_manager *new_conn = (struct stm_connection_manager *)calloc(1, sizeof(struct stm_connection_manager));
+ char *tmp_ip_addr;
+ uint16_t tmp_port;
+ evhttp_connection_get_peer(evconn, &tmp_ip_addr, &tmp_port);
+ if (tmp_ip_addr)
+ {
+ strncpy(new_conn->peer_ipaddr, tmp_ip_addr, INET6_ADDRSTRLEN - 1);
+ }
+ new_conn->peer_port_host_order = tmp_port;
+ stm->gettime_cb(&new_conn->link_start_time, NULL);
+ new_conn->last_active_time = new_conn->link_start_time;
+ new_conn->conn = evconn;
+ DL_APPEND(stm->connection_mgr, new_conn);
+ return new_conn;
+}
+
+void stm_connection_delete(struct evhttp_connection *evconn)
+{
+ struct stellar_monitor *stm = stellar_monitor_get();
+ struct stm_connection_manager *conn_mgr = stm->connection_mgr;
+ struct stm_connection_manager *ele, *tmp;
+ DL_FOREACH_SAFE(conn_mgr, ele, tmp)
+ {
+ if (ele->conn == evconn)
+ {
+ DL_DELETE(conn_mgr, ele);
+ FREE(ele);
+ }
+ }
+ stm->connection_mgr = conn_mgr;
+}
+
+void stm_connection_update(struct stm_connection_manager *conn_mgr, const struct evhttp_connection *evconn)
+{
+ struct stellar_monitor *stm = stellar_monitor_get();
+ struct stm_connection_manager *ele, *tmp;
+ DL_FOREACH_SAFE(conn_mgr, ele, tmp)
+ {
+ if (ele->conn == evconn)
+ {
+ stm->gettime_cb(&ele->last_active_time, NULL);
+ }
+ }
+}
+
+const struct stm_connection_manager *stm_connection_search(const struct stm_connection_manager *conn_mgr_head, const struct evhttp_connection *evconn)
+{
+ const struct stm_connection_manager *ele, *tmp;
+ DL_FOREACH_SAFE(conn_mgr_head, ele, tmp)
+ {
+ if (ele->conn == evconn)
+ {
+ return ele;
+ }
+ }
+ return NULL;
+}