From 8a1d7222f41a351843a9118579012eef1e19c3d3 Mon Sep 17 00:00:00 2001 From: Jilles Tjoelker Date: Wed, 3 Mar 2010 22:58:16 +0100 Subject: [PATCH] bandb: Group writes in transactions to reduce load on heavy kline activity. When a ban is added or removed, open a transaction and close it after 3 seconds; any bans in the 3 seconds will not trigger another transaction (= 4 fsyncs with sqlite). The transaction is also committed if ircd closes the connection, but not if bandb itself is terminated with a signal. --- bandb/bandb.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/bandb/bandb.c b/bandb/bandb.c index cce310c..33166b1 100644 --- a/bandb/bandb.c +++ b/bandb/bandb.c @@ -38,6 +38,8 @@ #define MAXPARA 10 +#define COMMIT_INTERVAL 3 /* seconds */ + typedef enum { BANDB_KLINE, @@ -57,9 +59,17 @@ static const char *bandb_table[LAST_BANDB_TYPE] = { static rb_helper *bandb_helper; +static int in_transaction; static void check_schema(void); +static void +bandb_commit(void *unused) +{ + rsdb_transaction(RSDB_TRANS_END); + in_transaction = 0; +} + static void parse_ban(bandb_type type, char *parv[], int parc) { @@ -89,6 +99,14 @@ parse_ban(bandb_type type, char *parv[], int parc) perm = parv[para++]; reason = parv[para++]; + if(!in_transaction) + { + rsdb_transaction(RSDB_TRANS_START); + in_transaction = 1; + rb_event_addonce("bandb_commit", bandb_commit, NULL, + COMMIT_INTERVAL); + } + rsdb_exec(NULL, "INSERT INTO %s (mask1, mask2, oper, time, perm, reason) VALUES('%Q', '%Q', '%Q', %s, %s, '%Q')", bandb_table[type], mask1, mask2 ? mask2 : "", oper, curtime, perm, reason); @@ -113,6 +131,14 @@ parse_unban(bandb_type type, char *parv[], int parc) if(type == BANDB_KLINE) mask2 = parv[2]; + if(!in_transaction) + { + rsdb_transaction(RSDB_TRANS_START); + in_transaction = 1; + rb_event_addonce("bandb_commit", bandb_commit, NULL, + COMMIT_INTERVAL); + } + rsdb_exec(NULL, "DELETE FROM %s WHERE mask1='%Q' AND mask2='%Q'", bandb_table[type], mask1, mask2 ? mask2 : ""); } @@ -215,6 +241,8 @@ parse_request(rb_helper *helper) static void error_cb(rb_helper *helper) { + if(in_transaction) + rsdb_transaction(RSDB_TRANS_END); exit(1); }