Commits

Anonymous committed 9a0c992

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.

  • Participants
  • Parent commits 2311c28

Comments (0)

Files changed (1)

File bandb/bandb.c

 
 #define MAXPARA 10
 
+#define COMMIT_INTERVAL 3 /* seconds */
+
 typedef enum
 {
 	BANDB_KLINE,
 
 
 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)
 {
 	const char *mask1 = NULL;
 	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);
 	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 : "");
 }
 static void
 error_cb(rb_helper *helper)
 {
+	if(in_transaction)
+		rsdb_transaction(RSDB_TRANS_END);
 	exit(1);
 }