Author: arekm Date: Mon Feb 27 21:04:12 2012 GMT Module: packages Tag: HEAD ---- Log message: - rel 2; update percona patches
---- Files affected: packages/mysql: mysql.spec (1.568 -> 1.569) , slow_extended.patch (1.13 -> 1.14) ---- Diffs: ================================================================ Index: packages/mysql/mysql.spec diff -u packages/mysql/mysql.spec:1.568 packages/mysql/mysql.spec:1.569 --- packages/mysql/mysql.spec:1.568 Wed Feb 22 18:48:19 2012 +++ packages/mysql/mysql.spec Mon Feb 27 22:04:06 2012 @@ -37,7 +37,7 @@ Summary(zh_CN.UTF-8): MySQL数据库服务器 Name: mysql Version: 5.5.20 -Release: 1 +Release: 2 License: GPL + MySQL FLOSS Exception Group: Applications/Databases # Source0Download: http://dev.mysql.com/downloads/mysql/5.5.html#downloads @@ -1265,6 +1265,9 @@ All persons listed below can be reached at <cvs_login>@pld-linux.org $Log$ +Revision 1.569 2012/02/27 21:04:06 arekm +- rel 2; update percona patches + Revision 1.568 2012/02/22 17:48:19 arekm - make sure that perfschema is enabled ================================================================ Index: packages/mysql/slow_extended.patch diff -u packages/mysql/slow_extended.patch:1.13 packages/mysql/slow_extended.patch:1.14 --- packages/mysql/slow_extended.patch:1.13 Thu Feb 16 17:26:12 2012 +++ packages/mysql/slow_extended.patch Mon Feb 27 22:04:06 2012 @@ -129,7 +129,7 @@ thd->client_capabilities|= CLIENT_MULTI_RESULTS; mysql_mutex_lock(&LOCK_thread_count); thd->thread_id= thd->variables.pseudo_thread_id= thread_id++; -+ thd->write_to_slow_log = TRUE; ++ thd->write_to_slow_log= true; mysql_mutex_unlock(&LOCK_thread_count); /* @@ -411,7 +411,7 @@ ulonglong lock_utime, bool is_command, --- a/sql/mysqld.cc +++ b/sql/mysqld.cc -@@ -425,6 +425,10 @@ +@@ -421,6 +421,11 @@ char* opt_secure_file_priv; my_bool opt_log_slow_admin_statements= 0; my_bool opt_log_slow_slave_statements= 0; @@ -419,10 +419,11 @@ +my_bool opt_slow_query_log_timestamp_always= 0; +ulonglong opt_slow_query_log_use_global_control= 0; +ulong opt_slow_query_log_timestamp_precision= 0; ++ulong opt_slow_query_log_rate_type= 0; my_bool lower_case_file_system= 0; my_bool opt_large_pages= 0; my_bool opt_super_large_pages= 0; -@@ -5753,14 +5757,10 @@ +@@ -5892,14 +5897,10 @@ "Don't log extra information to update and slow-query logs.", &opt_short_log_format, &opt_short_log_format, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0}, @@ -439,7 +440,7 @@ {"log-slow-queries", OPT_SLOW_QUERY_LOG, "Log slow queries to a table or log file. Defaults logging to table " "mysql.slow_log or hostname-slow.log if --log-output=file is used. " -@@ -7156,6 +7156,10 @@ +@@ -7288,6 +7289,10 @@ C_MODE_END @@ -450,7 +451,7 @@ /** Get server options from the command line, and perform related server initializations. -@@ -7305,6 +7309,8 @@ +@@ -7437,6 +7442,8 @@ global_system_variables.long_query_time= (ulonglong) (global_system_variables.long_query_time_double * 1e6); @@ -461,7 +462,7 @@ --- a/sql/mysqld.h +++ b/sql/mysqld.h -@@ -116,6 +116,10 @@ +@@ -116,6 +116,11 @@ extern char* opt_secure_backup_file_priv; extern size_t opt_secure_backup_file_priv_len; extern my_bool opt_log_slow_admin_statements, opt_log_slow_slave_statements; @@ -469,6 +470,7 @@ +extern my_bool opt_slow_query_log_timestamp_always; +extern ulonglong opt_slow_query_log_use_global_control; +extern ulong opt_slow_query_log_timestamp_precision; ++extern ulong opt_slow_query_log_rate_type; extern my_bool sp_automatic_privileges, opt_noacl; extern my_bool opt_old_style_user_limits, trust_function_creators; extern uint opt_crash_binlog_innodb; @@ -681,9 +683,45 @@ DBUG_VOID_RETURN; } +@@ -3802,7 +3896,7 @@ + { + mysql_mutex_lock(&LOCK_thd_data); + set_query_inner(query_arg, query_length_arg, cs); +- query_id= new_query_id; ++ do_set_query_id(new_query_id); + mysql_mutex_unlock(&LOCK_thd_data); + } + +@@ -3811,9 +3905,25 @@ + void THD::set_query_id(query_id_t new_query_id) + { + mysql_mutex_lock(&LOCK_thd_data); +- query_id= new_query_id; ++ do_set_query_id(new_query_id); + mysql_mutex_unlock(&LOCK_thd_data); + } ++void THD::do_set_query_id(query_id_t new_query_id) ++{ ++#ifndef DBUG_OFF ++ if (variables.query_exec_id != 0 && ++ lex->sql_command != SQLCOM_SET_OPTION) ++ { ++ new_query_id= variables.query_exec_id; ++ } ++#endif /* DBUG_OFF */ ++ query_id= new_query_id; ++ if (opt_slow_query_log_rate_type == SLOG_RT_QUERY) ++ { ++ const ulong& limit= variables.log_slow_rate_limit; ++ write_to_slow_log= limit == 0 || (query_id % limit) == 0; ++ } ++} + + /** Assign a new value to thd->mysys_var. */ + void THD::set_mysys_var(struct st_my_thread_var *new_mysys_var) --- a/sql/sql_class.h +++ b/sql/sql_class.h -@@ -60,6 +60,33 @@ +@@ -60,6 +60,36 @@ enum enum_duplicates { DUP_ERROR, DUP_REPLACE, DUP_UPDATE }; enum enum_delay_key_write { DELAY_KEY_WRITE_NONE, DELAY_KEY_WRITE_ON, DELAY_KEY_WRITE_ALL }; @@ -700,6 +738,9 @@ +enum enum_slow_query_log_timestamp_precision { + SLOG_SECOND, SLOG_MICROSECOND +}; ++enum enum_slow_query_log_rate_type { ++ SLOG_RT_SESSION, SLOG_RT_QUERY ++}; +#define QPLAN_NONE 0 +#define QPLAN_QC 1 << 0 +#define QPLAN_QC_NO 1 << 1 @@ -717,13 +758,14 @@ enum enum_slave_exec_mode { SLAVE_EXEC_MODE_STRICT, SLAVE_EXEC_MODE_IDEMPOTENT, SLAVE_EXEC_MODE_LAST_BIT}; -@@ -506,6 +533,21 @@ +@@ -508,6 +538,22 @@ my_bool sysdate_is_now; +#ifndef DBUG_OFF + ulonglong query_exec_time; + double query_exec_time_double; ++ ulong query_exec_id; +#endif + ulong log_slow_rate_limit; + ulonglong log_slow_filter; @@ -739,7 +781,7 @@ double long_query_time_double; } SV; -@@ -1138,6 +1180,24 @@ +@@ -1140,6 +1186,24 @@ uint in_sub_stmt; bool enable_slow_log; bool last_insert_id_used; @@ -764,7 +806,7 @@ SAVEPOINT *savepoints; enum enum_check_fields count_cuted_fields; }; -@@ -1586,6 +1646,71 @@ +@@ -1588,6 +1652,71 @@ thr_lock_type update_lock_default; Delayed_insert *di; @@ -836,20 +878,29 @@ /* <> 0 if we are inside of trigger or stored function. */ uint in_sub_stmt; +@@ -2784,6 +2913,9 @@ + void set_query_and_id(char *query_arg, uint32 query_length_arg, + CHARSET_INFO *cs, query_id_t new_query_id); + void set_query_id(query_id_t new_query_id); ++private: ++ void do_set_query_id(query_id_t new_query_id); ++public: + void set_open_tables(TABLE *open_tables_arg) + { + mysql_mutex_lock(&LOCK_thd_data); --- a/sql/sql_connect.cc +++ b/sql/sql_connect.cc -@@ -721,6 +721,15 @@ +@@ -721,6 +721,14 @@ MYSQL_CONNECTION_START(thd->thread_id, &thd->security_ctx->priv_user[0], (char *) thd->security_ctx->host_or_ip); -+ /* -+ If rate limiting of slow log writes is enabled, decide whether to log this -+ new thread's queries or not. Uses extremely simple algorithm. :) -+ */ -+ thd->write_to_slow_log= FALSE; -+ if (thd->variables.log_slow_rate_limit <= 1 || -+ (thd->thread_id % thd->variables.log_slow_rate_limit) == 0) -+ thd->write_to_slow_log= TRUE; ++ /* ++ If rate limiting of slow log writes is enabled, decide whether to log this ++ new thread's queries or not. Uses extremely simple algorithm. :) ++ */ ++ const ulong& limit= thd->variables.log_slow_rate_limit; ++ thd->write_to_slow_log= opt_slow_query_log_rate_type == SLOG_RT_SESSION && ++ (limit == 0 || (thd->thread_id % limit) == 0); + prepare_new_connection_state(thd); return FALSE; @@ -933,7 +984,7 @@ void log_slow_statement(THD *thd) { -@@ -1453,13 +1509,48 @@ +@@ -1453,13 +1509,47 @@ if (unlikely(thd->in_sub_stmt)) DBUG_VOID_RETURN; // Don't set time for sub stmt @@ -967,9 +1018,8 @@ + &g.min_examined_row_limit); + + /* Do not log this thread's queries due to rate limiting. */ -+ if (thd->write_to_slow_log != TRUE -+ && (thd->variables.long_query_time >= 1000000 -+ || (ulong) query_exec_time < 1000000)) ++ if (!thd->write_to_slow_log && (thd->variables.long_query_time >= 1000000 ++ || (ulong) query_exec_time < 1000000)) + DBUG_VOID_RETURN; + + @@ -1072,7 +1122,7 @@ { --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc -@@ -1045,6 +1045,29 @@ +@@ -972,6 +972,36 @@ NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(update_cached_long_query_time)); @@ -1097,12 +1147,19 @@ + NO_CMD_LINE, VALID_RANGE(0, LONG_TIMEOUT), DEFAULT(0), + NO_MUTEX_GUARD, IN_BINLOG, ON_CHECK(0), + ON_UPDATE(update_cached_query_exec_time)); ++static Sys_var_ulong sys_query_exec_id( ++ "query_exec_id", ++ "Pretend queries take this query id. When 0 (the default) use the" ++ "actual query id. Used only for debugging.", ++ SESSION_VAR(query_exec_id), ++ NO_CMD_LINE, VALID_RANGE(0, ULONG_MAX), DEFAULT(0), BLOCK_SIZE(1), ++ NO_MUTEX_GUARD, IN_BINLOG); +#endif + static bool fix_low_prio_updates(sys_var *self, THD *thd, enum_var_type type) { if (type == OPT_SESSION) -@@ -2977,6 +3000,123 @@ +@@ -2898,6 +2928,134 @@ DEFAULT(FALSE), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0), ON_UPDATE(fix_log_state)); @@ -1222,7 +1279,18 @@ + "Log slow statements executed by stored procedure to the slow log if it is open. [second, microsecond]", + GLOBAL_VAR(opt_slow_query_log_timestamp_precision), CMD_LINE(REQUIRED_ARG), + slow_query_log_timestamp_precision_name, DEFAULT(SLOG_SECOND)); -+ ++ ++const char* slow_query_log_rate_name[]= {"session", "query", 0}; ++static Sys_var_enum Sys_slow_query_log_rate_type( ++ "log_slow_rate_type", ++ "Choose the log_slow_rate_limit behavior: session or query. " ++ "When you choose 'session' - every %log_slow_rate_limit connection " ++ "will be processed to slow query log. " ++ "When you choose 'query' - every %log_slow_rate_limit query " ++ "will be processed to slow query log. " ++ "[session, query]", ++ GLOBAL_VAR(opt_slow_query_log_rate_type), CMD_LINE(REQUIRED_ARG), ++ slow_query_log_rate_name, DEFAULT(SLOG_RT_SESSION)); /* Synonym of "slow_query_log" for consistency with SHOW VARIABLES output */ static Sys_var_mybool Sys_log_slow( "log_slow_queries", @@ -1476,23 +1544,47 @@ # endif /* HAVE_PROFILING */ --- /dev/null +++ b/mysql-test/include/log_grep.inc -@@ -0,0 +1,17 @@ -+--disable_query_log +@@ -0,0 +1,41 @@ +--echo [log_grep.inc] file: $log_file pattern: $grep_pattern +perl; + $log_file= $ENV{'log_file'}; + $log_file_full_path= $ENV{'log_file_full_path'}; -+ $grep_pattern= $ENV{'grep_pattern'}; -+ ++ $log_slow_rate_test= $ENV{'log_slow_rate_test'}; + open(FILE, "$log_file_full_path") + or die("Cannot open file $log_file_full_path: $!\n"); + -+ $lines = 0; -+ while(<FILE>) { -+ $lines++ if (/$grep_pattern/); ++ if ($log_slow_rate_test) { ++ $one= 0; ++ $two= 0; ++ $three= 0; ++ while(<FILE>) { ++ $one++ if(/'connection_one'/); ++ $two++ if(/'connection_two'/); ++ $three++ if(/'connection_three'/); ++ } ++ $sum= $one + $two + $three; ++ $zero= 0; ++ if ($one == 0) { ++ $zero++; ++ } ++ if ($two == 0) { ++ $zero++; ++ } ++ if ($three == 0) { ++ $zero++; ++ } ++ print "[log_grep.inc] sum: $sum\n"; ++ print "[log_grep.inc] zero: $zero\n"; ++ } ++ else { ++ $grep_pattern= $ENV{'grep_pattern'}; ++ $lines= 0; ++ while(<FILE>) { ++ $lines++ if (/$grep_pattern/); ++ } ++ print "[log_grep.inc] lines: $lines\n"; + } + close(FILE); -+ print "[log_grep.inc] lines: $lines\n"; +EOF --- /dev/null +++ b/mysql-test/include/log_start.inc @@ -1513,7 +1605,6 @@ +EVAL SET GLOBAL slow_query_log_file="$log_file_full_path"; +SET GLOBAL slow_query_log=ON; +--enable_query_log -\ No newline at end of file --- /dev/null +++ b/mysql-test/include/log_stop.inc @@ -0,0 +1,7 @@ @@ -1559,7 +1650,7 @@ +log_slow_filter full_join --- /dev/null +++ b/mysql-test/r/percona_log_slow_filter.result -@@ -0,0 +1,15 @@ +@@ -0,0 +1,16 @@ +CREATE TABLE t(id INT PRIMARY KEY); +INSERT INTO t VALUES(1); +INSERT INTO t VALUES(2); @@ -1575,6 +1666,7 @@ +SET long_query_time=default; +[log_grep.inc] file: percona.slow_extended.log_slow_filter pattern: Query_time +[log_grep.inc] lines: 1 ++DROP TABLE t; --- /dev/null +++ b/mysql-test/r/percona_log_slow_slave_statements-cl.result @@ -0,0 +1,6 @@ @@ -1586,7 +1678,7 @@ +log_slow_slave_statements ON --- /dev/null +++ b/mysql-test/r/percona_log_slow_slave_statements-innodb.result -@@ -0,0 +1,18 @@ +@@ -0,0 +1,19 @@ +include/master-slave.inc +[connection master] +DROP TABLE IF EXISTS t; @@ -1604,10 +1696,11 @@ +[log_stop.inc] percona.slow_extended.log_slow_slave_statements-innodb +[log_grep.inc] file: percona.slow_extended.log_slow_slave_statements-innodb pattern: InnoDB_IO_r_ops +[log_grep.inc] lines: 1 ++DROP TABLE t; +include/rpl_end.inc --- /dev/null +++ b/mysql-test/r/percona_log_slow_slave_statements.result -@@ -0,0 +1,44 @@ +@@ -0,0 +1,45 @@ +include/master-slave.inc +[connection master] +DROP TABLE IF EXISTS t; @@ -1651,6 +1744,7 @@ +[log_grep.inc] lines: 0 +[log_grep.inc] file: percona.slow_extended.log_slow_slave_statements pattern: INSERT INTO t VALUES \(7\) +[log_grep.inc] lines: 1 ++DROP TABLE t; +include/rpl_end.inc --- /dev/null +++ b/mysql-test/r/percona_log_slow_sp_statements-cl.result @@ -1663,7 +1757,7 @@ +log_slow_sp_statements ON --- /dev/null +++ b/mysql-test/r/percona_log_slow_sp_statements.result -@@ -0,0 +1,24 @@ +@@ -0,0 +1,25 @@ +SET long_query_time=1; +SET GLOBAL log_slow_sp_statements=ON; +SET SESSION query_exec_time=0.1; @@ -1688,6 +1782,7 @@ +SET long_query_time=default; +[log_grep.inc] file: percona.slow_extended.log_slow_sp_statements pattern: Query_time +[log_grep.inc] lines: 3 ++DROP PROCEDURE test_f; --- /dev/null +++ b/mysql-test/r/percona_log_slow_verbosity-cl.result @@ -0,0 +1,6 @@ @@ -2373,7 +2468,7 @@ +SHOW GLOBAL VARIABLES LIKE 'slow_query_log_use_global_control'; --- /dev/null +++ b/mysql-test/r/percona_min_examined_row_limit.result -@@ -0,0 +1,34 @@ +@@ -0,0 +1,35 @@ +drop table if exists t; +create table t(id INT PRIMARY KEY); +insert into t values(1); @@ -2408,6 +2503,7 @@ +SET GLOBAL long_query_time=default; +[log_grep.inc] file: percona.slow_extended.min_examined_row_limit pattern: Query_time +[log_grep.inc] lines: 1 ++DROP TABLE t; --- /dev/null +++ b/mysql-test/t/percona_min_examined_row_limit.test @@ -0,0 +1,35 @@ @@ -2516,7 +2612,7 @@ +SET GLOBAL slow_query_log_use_global_control=default; --- /dev/null +++ b/mysql-test/r/percona_slow_extended_log_error.result -@@ -0,0 +1,9 @@ +@@ -0,0 +1,10 @@ +SET long_query_time=0; +DROP TABLE IF EXISTS t1; +CREATE TABLE t(a INT); @@ -2526,6 +2622,7 @@ +[log_stop.inc] percona.slow_extended.log_error +[log_grep.inc] file: percona.slow_extended.log_error pattern: Last_errno: 1050 +[log_grep.inc] lines: 1 ++DROP TABLE t; --- /dev/null +++ b/mysql-test/t/percona_slow_extended_log_error.test @@ -0,0 +1,15 @@ @@ -2695,7 +2792,7 @@ +SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='log_slow_admin_statements'; --- a/mysql-test/r/mysqld--help-notwin.result +++ b/mysql-test/r/mysqld--help-notwin.result -@@ -250,15 +250,31 @@ +@@ -250,15 +250,38 @@ --log-slow-admin-statements Log slow OPTIMIZE, ANALYZE, ALTER and other administrative statements to the slow log if it is open. @@ -2713,6 +2810,13 @@ + --log-slow-rate-limit=# + Rate limit statement writes to slow log to only those + from every (1/log_slow_rate_limit) session. ++ --log-slow-rate-type=name ++ Choose the log_slow_rate_limit behavior: session or ++ query. When you choose 'session' - every ++ %log_slow_rate_limit connection will be processed to slow ++ query log. When you choose 'query' - every ++ %log_slow_rate_limit query will be processed to slow ++ query log. [session, query] --log-slow-slave-statements - Log slow statements executed by slave thread to the slow - log if it is open. @@ -2729,7 +2833,7 @@ --log-tc=name Path to transaction coordinator log (used for transactions that affect more than one storage engine, when binary log is disabled). -@@ -662,6 +678,18 @@ +@@ -660,6 +683,18 @@ Log slow queries to given log file. Defaults logging to hostname-slow.log. Must be enabled to activate other slow log options @@ -2748,19 +2852,20 @@ --socket=name Socket file to use for connection --sort-buffer-size=# Each thread that needs to do a sort allocates a buffer of -@@ -819,7 +847,11 @@ +@@ -817,7 +852,12 @@ log-short-format FALSE log-slave-updates FALSE log-slow-admin-statements FALSE +log-slow-filter +log-slow-rate-limit 1 ++log-slow-rate-type session log-slow-slave-statements FALSE +log-slow-sp-statements TRUE +log-slow-verbosity log-tc tc.log log-tc-size 24576 log-warnings 1 -@@ -936,6 +968,9 @@ +@@ -933,6 +973,9 @@ slave-type-conversions slow-launch-time 2 slow-query-log FALSE @@ -2770,3 +2875,180 @@ sort-buffer-size 2097152 sporadic-binlog-dump-fail FALSE sql-mode +--- /dev/null ++++ b/mysql-test/r/percona_slow_query_log_rate.result +@@ -0,0 +1,78 @@ ++SET GLOBAL long_query_time=1; ++SET GLOBAL log_slow_rate_type='session'; ++SET GLOBAL log_slow_rate_limit=3; ++[log_start.inc] percona.slow_extended.log_slow_rate_limit ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=1; ++SELECT 'connection_one'; ++connection_one ++connection_one ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=2; ++SELECT 'connection_two'; ++connection_two ++connection_two ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=3; ++SELECT 'connection_three'; ++connection_three ++connection_three ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=4; ++SELECT 'connection_one'; ++connection_one ++connection_one ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=5; ++SELECT 'connection_two'; ++connection_two ++connection_two ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=6; ++SELECT 'connection_three'; ++connection_three ++connection_three ++[log_stop.inc] percona.slow_extended.log_slow_rate_limit ++[log_grep.inc] file: percona.slow_extended.log_slow_rate_limit pattern: ++[log_grep.inc] sum: 2 ++[log_grep.inc] zero: 2 ++SET GLOBAL log_slow_rate_type='query'; ++SET GLOBAL log_slow_rate_limit=2; ++[log_start.inc] percona.slow_extended.log_slow_rate_limit ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=1; ++SELECT 'connection_one'; ++connection_one ++connection_one ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=2; ++SELECT 'connection_two'; ++connection_two ++connection_two ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=3; ++SELECT 'connection_three'; ++connection_three ++connection_three ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=4; ++SELECT 'connection_one'; ++connection_one ++connection_one ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=5; ++SELECT 'connection_two'; ++connection_two ++connection_two ++SET SESSION query_exec_time=1.1; ++SET SESSION query_exec_id=6; ++SELECT 'connection_three'; ++connection_three ++connection_three ++[log_stop.inc] percona.slow_extended.log_slow_rate_limit ++[log_grep.inc] file: percona.slow_extended.log_slow_rate_limit pattern: ++[log_grep.inc] sum: 3 ++[log_grep.inc] zero: 0 ++SET GLOBAL long_query_time=default; ++SET GLOBAL log_slow_rate_type=default; <<Diff was trimmed, longer than 597 lines>> ---- CVS-web: http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/mysql/mysql.spec?r1=1.568&r2=1.569&f=u http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/mysql/slow_extended.patch?r1=1.13&r2=1.14&f=u _______________________________________________ pld-cvs-commit mailing list [email protected] http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit
