Simon Lange wrote:

> i became aware that dbmail-imapd does consume pretty fast a lot of cpu 
> time.
> e.g. i do connect via thunderbird to my account and all i do is quering 
> a list of message in a folder it takes him up to 50% cputime (on a AMD 
> AthlonXP2000+ 512MB).

This is a known issue. Apply the attached patch to mysql/dbmysql.c to
fix it.

> Also i came aware that imapd sporadic starts spamming the mysql database 
> with queries. this increases the load enormous and the system becomes 
> unusable. last time i metered imapd/mysql it took 262.000queries/sec

I wish I could ask you to get the logs for this, so that I could know
what causes this. (It was reported before). However, detailed logging
slows the system down about 10 times, and this is not yet resolved.

Yours, Mikhail Ramendik

--- mysql/dbmysql.c.orig	2004-06-03 16:41:55.000000000 +0400
+++ mysql/dbmysql.c	2004-10-23 16:10:31.000000000 +0400
@@ -1,6 +1,8 @@
 /*
  Copyright (C) 1999-2004 IC & S  [EMAIL PROTECTED]
 
+ Modified 2004 by Mikhail Ramendik [EMAIL PROTECTED] (MR)
+
  This program is free software; you can redistribute it and/or 
  modify it under the terms of the GNU General Public License 
  as published by the Free Software Foundation; either 
@@ -49,6 +51,11 @@
 static MYSQL_RES *stored_res = NULL; /**< MySQL result set backup */
 static MYSQL_ROW last_row; /**< MySQL result row */
 
+/* Additions by MR */
+
+static int res_changed = 1; /* result set changed */
+static unsigned last_row_number = 0; /* the number of the row in last_row */
+
 /** database parameters */
 db_param_t _db_params;
 
@@ -134,6 +141,7 @@
 		trace(TRACE_WARNING, "%s,%s: Trying to free result set "
 		      "that is already NULL!", __FILE__, __func__);
 	res = NULL;
+        res_changed = 1; /*MR*/
 }
 
 
@@ -154,9 +162,28 @@
 		return NULL;
 	}
 	
-	mysql_data_seek(res, row);
-	last_row = mysql_fetch_row(res);
+        /*MR*/
+        
+        if (res_changed) 
+        
+        {
+        	mysql_data_seek(res, row);
+        	last_row = mysql_fetch_row(res);
+        } else {
+                if (row == last_row_number+1)
+                        last_row = mysql_fetch_row(res);    
+                else if (row != last_row_number) {
+                        mysql_data_seek(res, row);
+	                last_row = mysql_fetch_row(res);
+                        };
+                        /* otherwise last_row is already loaded and does not need to change! MR*/
+        };
 	
+        res_changed = 0;
+        last_row_number = row;
+        
+        /*MR changes end here*/
+        
 	if (last_row == NULL) {
 		trace(TRACE_WARNING, "%s,%s: row is NULL\n",
 		      __FILE__, __func__);
@@ -238,6 +265,7 @@
 	}
 
 	res = mysql_store_result(&conn);
+        res_changed = 1; /*MR*/
 
 	return 0;
 }
@@ -304,12 +332,14 @@
 {
 	stored_res = res;
 	res = msgbuf_res;
+        res_changed = 1; /*MR*/
 }
 
 void db_store_msgbuf_result()
 {
 	msgbuf_res = res;
 	res = stored_res;
+        res_changed = 1; /*MR*/
 }
 
 void *db_get_result_set()
@@ -320,4 +350,5 @@
 void db_set_result_set(void *the_result_set)
 {
 	res = (MYSQL_RES *) the_result_set;
+        res_changed = 1; /*MR*/
 }

Reply via email to