Author: arekm Date: Wed Dec 15 22:22:57 2010 GMT Module: packages Tag: HEAD ---- Log message: - new perfona url, new patch names (but still have to wait for the patches to be updated to 5.5.8)
---- Files affected: packages/mysql: mysql.spec (1.502 -> 1.503) , mysql-innodb_extend_slow.patch (NONE -> 1.1) (NEW), mysql-innodb_split_buf_pool_mutex.patch (1.1 -> 1.2) , mysql-microsec_process.patch (1.1 -> 1.2) , mysql-userstat.patch (NONE -> 1.1) (NEW) ---- Diffs: ================================================================ Index: packages/mysql/mysql.spec diff -u packages/mysql/mysql.spec:1.502 packages/mysql/mysql.spec:1.503 --- packages/mysql/mysql.spec:1.502 Wed Dec 15 23:11:28 2010 +++ packages/mysql/mysql.spec Wed Dec 15 23:22:51 2010 @@ -71,12 +71,11 @@ Patch15: plugin-avoid-version.patch Patch16: %{name}-fix-dummy-thread-race-condition.patch Patch18: %{name}-sphinx.patch -# <percona patches, http://www.percona.com/percona-lab.html> -Patch100: %{name}-userstats.patch -Patch101: %{name}-microslow.patch -Patch102: %{name}-acc-pslist.patch -Patch103: %{name}-split_buf_pool_mutex_fixed_optimistic_safe.patch -Patch104: %{name}-innodb_rw_lock.patch +# <percona patches, http://bazaar.launchpad.net/~percona-dev/percona-server/5.5.7/files> +Patch100: %{name}-userstat.patch +Patch101: %{name}-innodb_extend_slow.patch +Patch102: %{name}-microsec_process.patch +Patch103: %{name}-innodb_split_buf_pool_mutex.patch # </percona> URL: http://www.mysql.com/products/database/mysql/community_edition.html BuildRequires: bison @@ -526,8 +525,6 @@ #%patch102 -p1 # CHECK ME #%patch103 -p1 -# CHECK ME -#%patch104 -p1 # </percona> %build @@ -1097,6 +1094,9 @@ All persons listed below can be reached at <cvs_login>@pld-linux.org $Log$ +Revision 1.503 2010/12/15 22:22:51 arekm +- new perfona url, new patch names (but still have to wait for the patches to be updated to 5.5.8) + Revision 1.502 2010/12/15 22:11:28 arekm - fix so symlinks and update system users patch ================================================================ Index: packages/mysql/mysql-innodb_extend_slow.patch diff -u /dev/null packages/mysql/mysql-innodb_extend_slow.patch:1.1 --- /dev/null Wed Dec 15 23:22:57 2010 +++ packages/mysql/mysql-innodb_extend_slow.patch Wed Dec 15 23:22:51 2010 @@ -0,0 +1,1044 @@ +# name : innodb_extend_slow.patch +# introduced : 11 or before +# maintainer : Yasufumi +# +#!!! notice !!! +# Any small change to this file in the main branch +# should be done or reviewed by the maintainer! +diff -ruN a/storage/innobase/buf/buf0buf.c b/storage/innobase/buf/buf0buf.c +--- a/storage/innobase/buf/buf0buf.c 2010-12-03 15:49:59.175955882 +0900 ++++ b/storage/innobase/buf/buf0buf.c 2010-12-03 17:42:42.074307123 +0900 +@@ -51,6 +51,40 @@ + #include "dict0dict.h" + #include "log0recv.h" + #include "page0zip.h" ++#include "trx0trx.h" ++ ++/* prototypes for new functions added to ha_innodb.cc */ ++trx_t* innobase_get_trx(); ++ ++inline void _increment_page_get_statistics(buf_block_t* block, trx_t* trx) ++{ ++ ulint block_hash; ++ ulint block_hash_byte; ++ byte block_hash_offset; ++ ++ ut_ad(block); ++ ++ if (!innobase_get_slow_log() || !trx || !trx->take_stats) ++ return; ++ ++ if (!trx->distinct_page_access_hash) { ++ trx->distinct_page_access_hash = mem_alloc(DPAH_SIZE); ++ memset(trx->distinct_page_access_hash, 0, DPAH_SIZE); ++ } ++ ++ block_hash = ut_hash_ulint((block->page.space << 20) + block->page.space + ++ block->page.offset, DPAH_SIZE << 3); ++ block_hash_byte = block_hash >> 3; ++ block_hash_offset = (byte) block_hash & 0x07; ++ if (block_hash_byte < 0 || block_hash_byte >= DPAH_SIZE) ++ fprintf(stderr, "!!! block_hash_byte = %lu block_hash_offset = %d !!!\n", block_hash_byte, block_hash_offset); ++ if (block_hash_offset < 0 || block_hash_offset > 7) ++ fprintf(stderr, "!!! block_hash_byte = %lu block_hash_offset = %d !!!\n", block_hash_byte, block_hash_offset); ++ if ((trx->distinct_page_access_hash[block_hash_byte] & ((byte) 0x01 << block_hash_offset)) == 0) ++ trx->distinct_page_access++; ++ trx->distinct_page_access_hash[block_hash_byte] |= (byte) 0x01 << block_hash_offset; ++ return; ++} + + /* + IMPLEMENTATION OF THE BUFFER POOL +@@ -2399,11 +2433,19 @@ + mutex_t* block_mutex; + ibool must_read; + unsigned access_time; ++ trx_t* trx = NULL; ++ ulint sec; ++ ulint ms; ++ ib_uint64_t start_time; ++ ib_uint64_t finish_time; + buf_pool_t* buf_pool = buf_pool_get(space, offset); + + #ifndef UNIV_LOG_DEBUG + ut_ad(!ibuf_inside()); + #endif ++ if (innobase_get_slow_log()) { ++ trx = innobase_get_trx(); ++ } + buf_pool->stat.n_page_gets++; + + for (;;) { +@@ -2421,7 +2463,7 @@ + //buf_pool_mutex_exit(buf_pool); + rw_lock_s_unlock(&buf_pool->page_hash_latch); + +- buf_read_page(space, zip_size, offset); ++ buf_read_page(space, zip_size, offset, trx); + + #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG + ut_a(++buf_dbg_counter % 37 || buf_validate()); +@@ -2499,6 +2541,13 @@ + /* Let us wait until the read operation + completes */ + ++ if (innobase_get_slow_log() && trx && trx->take_stats) ++ { ++ ut_usectime(&sec, &ms); ++ start_time = (ib_uint64_t)sec * 1000000 + ms; ++ } else { ++ start_time = 0; ++ } + for (;;) { + enum buf_io_fix io_fix; + +@@ -2513,6 +2562,12 @@ + break; + } + } ++ if (innobase_get_slow_log() && trx && trx->take_stats && start_time) ++ { ++ ut_usectime(&sec, &ms); ++ finish_time = (ib_uint64_t)sec * 1000000 + ms; ++ trx->io_reads_wait_timer += (ulint)(finish_time - start_time); ++ } + } + + #ifdef UNIV_IBUF_COUNT_DEBUG +@@ -2825,6 +2880,11 @@ + ibool must_read; + ulint retries = 0; + mutex_t* block_mutex = NULL; ++ trx_t* trx = NULL; ++ ulint sec; ++ ulint ms; ++ ib_uint64_t start_time; ++ ib_uint64_t finish_time; + buf_pool_t* buf_pool = buf_pool_get(space, offset); + + ut_ad(mtr); +@@ -2842,6 +2902,9 @@ + #ifndef UNIV_LOG_DEBUG + ut_ad(!ibuf_inside() || ibuf_page(space, zip_size, offset, NULL)); + #endif ++ if (innobase_get_slow_log()) { ++ trx = innobase_get_trx(); ++ } + buf_pool->stat.n_page_gets++; + fold = buf_page_address_fold(space, offset); + loop: +@@ -2915,7 +2978,7 @@ + return(NULL); + } + +- if (buf_read_page(space, zip_size, offset)) { ++ if (buf_read_page(space, zip_size, offset, trx)) { + retries = 0; + } else if (retries < BUF_PAGE_READ_MAX_RETRIES) { + ++retries; +@@ -3178,6 +3241,13 @@ + /* Let us wait until the read operation + completes */ + ++ if (innobase_get_slow_log() && trx && trx->take_stats) ++ { ++ ut_usectime(&sec, &ms); ++ start_time = (ib_uint64_t)sec * 1000000 + ms; ++ } else { ++ start_time = 0; ++ } + for (;;) { + enum buf_io_fix io_fix; + +@@ -3192,6 +3262,12 @@ + break; + } + } ++ if (innobase_get_slow_log() && trx && trx->take_stats && start_time) ++ { ++ ut_usectime(&sec, &ms); ++ finish_time = (ib_uint64_t)sec * 1000000 + ms; ++ trx->io_reads_wait_timer += (ulint)(finish_time - start_time); ++ } + } + + fix_type = MTR_MEMO_BUF_FIX; +@@ -3217,13 +3293,17 @@ + /* In the case of a first access, try to apply linear + read-ahead */ + +- buf_read_ahead_linear(space, zip_size, offset); ++ buf_read_ahead_linear(space, zip_size, offset, trx); + } + + #ifdef UNIV_IBUF_COUNT_DEBUG + ut_a(ibuf_count_get(buf_block_get_space(block), + buf_block_get_page_no(block)) == 0); + #endif ++ if (innobase_get_slow_log()) { ++ _increment_page_get_statistics(block, trx); ++ } ++ + return(block); + } + +@@ -3247,6 +3327,7 @@ + unsigned access_time; + ibool success; + ulint fix_type; ++ trx_t* trx = NULL; + + ut_ad(block); + ut_ad(mtr); +@@ -3324,13 +3405,17 @@ + #ifdef UNIV_DEBUG_FILE_ACCESSES + ut_a(block->page.file_page_was_freed == FALSE); + #endif ++ if (innobase_get_slow_log()) { ++ trx = innobase_get_trx(); ++ } ++ + if (UNIV_UNLIKELY(!access_time)) { + /* In the case of a first access, try to apply linear + read-ahead */ + + buf_read_ahead_linear(buf_block_get_space(block), + buf_block_get_zip_size(block), +- buf_block_get_page_no(block)); ++ buf_block_get_page_no(block), trx); + } + + #ifdef UNIV_IBUF_COUNT_DEBUG +@@ -3340,6 +3425,9 @@ + buf_pool = buf_pool_from_block(block); + buf_pool->stat.n_page_gets++; + ++ if (innobase_get_slow_log()) { ++ _increment_page_get_statistics(block, trx); ++ } + return(TRUE); + } + +@@ -3362,6 +3450,7 @@ + buf_pool_t* buf_pool; + ibool success; + ulint fix_type; ++ trx_t* trx = NULL; + + ut_ad(mtr); + ut_ad(mtr->state == MTR_ACTIVE); +@@ -3448,6 +3537,11 @@ + #endif + buf_pool->stat.n_page_gets++; + ++ if (innobase_get_slow_log()) { ++ trx = innobase_get_trx(); ++ _increment_page_get_statistics(block, trx); ++ } ++ + return(TRUE); + } + +diff -ruN a/storage/innobase/buf/buf0rea.c b/storage/innobase/buf/buf0rea.c +--- a/storage/innobase/buf/buf0rea.c 2010-12-03 17:32:15.617037263 +0900 ++++ b/storage/innobase/buf/buf0rea.c 2010-12-03 17:42:42.075297193 +0900 +@@ -77,7 +77,8 @@ + treat the tablespace as dropped; this is a timestamp we + use to stop dangling page reads from a tablespace + which we have DISCARDed + IMPORTed back */ +- ulint offset) /*!< in: page number */ ++ ulint offset, /*!< in: page number */ ++ trx_t* trx) + { + buf_page_t* bpage; + ulint wake_later; +@@ -179,15 +180,15 @@ + + thd_wait_begin(NULL, THD_WAIT_DISKIO); + if (zip_size) { +- *err = fil_io(OS_FILE_READ | wake_later, ++ *err = _fil_io(OS_FILE_READ | wake_later, + sync, space, zip_size, offset, 0, zip_size, +- bpage->zip.data, bpage); ++ bpage->zip.data, bpage, trx); + } else { + ut_a(buf_page_get_state(bpage) == BUF_BLOCK_FILE_PAGE); + +- *err = fil_io(OS_FILE_READ | wake_later, ++ *err = _fil_io(OS_FILE_READ | wake_later, + sync, space, 0, offset, 0, UNIV_PAGE_SIZE, +- ((buf_block_t*) bpage)->frame, bpage); ++ ((buf_block_t*) bpage)->frame, bpage, trx); + } + thd_wait_end(NULL); + ut_a(*err == DB_SUCCESS); +@@ -213,7 +214,8 @@ + /*==========*/ + ulint space, /*!< in: space id */ + ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ +- ulint offset) /*!< in: page number */ ++ ulint offset, /*!< in: page number */ ++ trx_t* trx) + { + buf_pool_t* buf_pool = buf_pool_get(space, offset); + ib_int64_t tablespace_version; +@@ -227,7 +229,7 @@ + + count = buf_read_page_low(&err, TRUE, BUF_READ_ANY_PAGE, space, + zip_size, FALSE, +- tablespace_version, offset); ++ tablespace_version, offset, trx); + srv_buf_pool_reads += count; + if (err == DB_TABLESPACE_DELETED) { + ut_print_timestamp(stderr); +@@ -278,8 +280,9 @@ + /*==================*/ + ulint space, /*!< in: space id */ + ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ +- ulint offset) /*!< in: page number of a page; NOTE: the current thread ++ ulint offset, /*!< in: page number of a page; NOTE: the current thread + must want access to this page (see NOTE 3 above) */ ++ trx_t* trx) + { + buf_pool_t* buf_pool = buf_pool_get(space, offset); + ib_int64_t tablespace_version; +@@ -500,7 +503,7 @@ + count += buf_read_page_low( + &err, FALSE, + ibuf_mode | OS_AIO_SIMULATED_WAKE_LATER, +- space, zip_size, FALSE, tablespace_version, i); ++ space, zip_size, FALSE, tablespace_version, i, trx); + if (err == DB_TABLESPACE_DELETED) { + ut_print_timestamp(stderr); + fprintf(stderr, +@@ -594,7 +597,7 @@ + buf_read_page_low(&err, sync && (i + 1 == n_stored), + BUF_READ_ANY_PAGE, space_ids[i], + zip_size, TRUE, space_versions[i], +- page_nos[i]); ++ page_nos[i], NULL); + + if (UNIV_UNLIKELY(err == DB_TABLESPACE_DELETED)) { + tablespace_deleted: +@@ -736,12 +739,12 @@ + if ((i + 1 == n_stored) && sync) { + buf_read_page_low(&err, TRUE, BUF_READ_ANY_PAGE, space, + zip_size, TRUE, tablespace_version, +- page_nos[i]); ++ page_nos[i], NULL); + } else { + buf_read_page_low(&err, FALSE, BUF_READ_ANY_PAGE + | OS_AIO_SIMULATED_WAKE_LATER, + space, zip_size, TRUE, +- tablespace_version, page_nos[i]); ++ tablespace_version, page_nos[i], NULL); + } + } + +diff -ruN a/storage/innobase/fil/fil0fil.c b/storage/innobase/fil/fil0fil.c +--- a/storage/innobase/fil/fil0fil.c 2010-12-03 15:53:54.610037199 +0900 ++++ b/storage/innobase/fil/fil0fil.c 2010-12-03 17:42:42.079064198 +0900 +@@ -4349,7 +4349,7 @@ + node->name, node->handle, buf, + offset_low, offset_high, + page_size * n_pages, +- NULL, NULL); ++ NULL, NULL, NULL); + #endif + if (success) { + node->size += n_pages; +@@ -4676,7 +4676,7 @@ + i/o on a tablespace which does not exist */ + UNIV_INTERN + ulint +-fil_io( ++_fil_io( + /*===*/ + ulint type, /*!< in: OS_FILE_READ or OS_FILE_WRITE, + ORed to OS_FILE_LOG, if a log i/o +@@ -4701,8 +4701,9 @@ + void* buf, /*!< in/out: buffer where to store read data + or from where to write; in aio this must be + appropriately aligned */ +- void* message) /*!< in: message for aio handler if non-sync ++ void* message, /*!< in: message for aio handler if non-sync + aio used, else ignored */ ++ trx_t* trx) + { + ulint mode; + fil_space_t* space; +@@ -4872,7 +4873,7 @@ + #else + /* Queue the aio request */ + ret = os_aio(type, mode | wake_later, node->name, node->handle, buf, +- offset_low, offset_high, len, node, message); ++ offset_low, offset_high, len, node, message, trx); + #endif + ut_a(ret); + +diff -ruN a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc +--- a/storage/innobase/handler/ha_innodb.cc 2010-12-03 17:36:44.293955189 +0900 ++++ b/storage/innobase/handler/ha_innodb.cc 2010-12-03 17:42:42.090024586 +0900 +@@ -1528,6 +1528,16 @@ + trx->check_unique_secondary = !thd_test_options( + thd, OPTION_RELAXED_UNIQUE_CHECKS); + ++#ifdef EXTENDED_SLOWLOG ++ if (thd_log_slow_verbosity(thd) & SLOG_V_INNODB) { ++ trx->take_stats = TRUE; ++ } else { ++ trx->take_stats = FALSE; ++ } ++#else ++ trx->take_stats = FALSE; ++#endif ++ + DBUG_VOID_RETURN; + } + +@@ -1583,6 +1593,32 @@ + } + + ++/************************************************************************* ++Gets current trx. */ ++extern "C" ++trx_t* ++innobase_get_trx() ++{ ++ THD *thd=current_thd; ++ if (likely(thd != 0)) { ++ trx_t*& trx = thd_to_trx(thd); ++ return(trx); ++ } else { ++ return(NULL); ++ } ++} ++ ++extern "C" ++ibool ++innobase_get_slow_log() ++{ ++#ifdef EXTENDED_SLOWLOG ++ return((ibool) thd_opt_slow_log()); ++#else ++ return(FALSE); ++#endif ++} ++ + /*********************************************************************//** + Construct ha_innobase handler. */ + UNIV_INTERN +@@ -9179,6 +9215,25 @@ + statement has ended */ + + if (trx->n_mysql_tables_in_use == 0) { ++#ifdef EXTENDED_SLOWLOG ++ increment_thd_innodb_stats(thd, ++ (unsigned long long) trx->id, ++ trx->io_reads, ++ trx->io_read, ++ trx->io_reads_wait_timer, ++ trx->lock_que_wait_timer, ++ trx->innodb_que_wait_timer, ++ trx->distinct_page_access); ++ ++ trx->io_reads = 0; ++ trx->io_read = 0; ++ trx->io_reads_wait_timer = 0; ++ trx->lock_que_wait_timer = 0; ++ trx->innodb_que_wait_timer = 0; ++ trx->distinct_page_access = 0; ++ if (trx->distinct_page_access_hash) ++ memset(trx->distinct_page_access_hash, 0, DPAH_SIZE); ++#endif + + trx->mysql_n_tables_locked = 0; + prebuilt->used_in_HANDLER = FALSE; +diff -ruN a/storage/innobase/handler/innodb_patch_info.h b/storage/innobase/handler/innodb_patch_info.h +--- a/storage/innobase/handler/innodb_patch_info.h 2010-12-03 17:36:44.293955189 +0900 ++++ b/storage/innobase/handler/innodb_patch_info.h 2010-12-03 17:42:42.094955866 +0900 +@@ -38,5 +38,6 @@ + {"innodb_recovery_patches","Bugfixes and adjustments about recovery process","","http://www.percona.com/docs/wiki/percona-xtradb"}, + {"innodb_admin_command_base","XtraDB specific command interface through i_s","","http://www.percona.com/docs/wiki/percona-xtradb"}, + {"innodb_show_lock_name","Show mutex/lock name instead of crated file/line","","http://www.percona.com/docs/wiki/percona-xtradb"}, ++{"innodb_extend_slow","Extended statistics in slow.log","It is InnoDB-part only. It needs to patch also to mysqld.","http://www.percona.com/docs/wiki/percona-xtradb"}, + {NULL, NULL, NULL, NULL} + }; +diff -ruN a/storage/innobase/include/buf0rea.h b/storage/innobase/include/buf0rea.h +--- a/storage/innobase/include/buf0rea.h 2010-12-03 15:18:48.891024406 +0900 ++++ b/storage/innobase/include/buf0rea.h 2010-12-03 17:42:42.096026873 +0900 +@@ -27,6 +27,7 @@ + #define buf0rea_h + + #include "univ.i" ++#include "trx0types.h" + #include "buf0types.h" + + /********************************************************************//** +@@ -41,7 +42,8 @@ + /*==========*/ + ulint space, /*!< in: space id */ + ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ +- ulint offset);/*!< in: page number */ ++ ulint offset, /*!< in: page number */ ++ trx_t* trx); + /********************************************************************//** + Applies linear read-ahead if in the buf_pool the page is a border page of + a linear read-ahead area and all the pages in the area have been accessed. +@@ -72,8 +74,9 @@ + /*==================*/ + ulint space, /*!< in: space id */ + ulint zip_size,/*!< in: compressed page size in bytes, or 0 */ +- ulint offset);/*!< in: page number of a page; NOTE: the current thread ++ ulint offset, /*!< in: page number of a page; NOTE: the current thread + must want access to this page (see NOTE 3 above) */ ++ trx_t* trx); + /********************************************************************//** + Issues read requests for pages which the ibuf module wants to read in, in + order to contract the insert buffer tree. Technically, this function is like +diff -ruN a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h +--- a/storage/innobase/include/fil0fil.h 2010-12-03 15:09:51.290958543 +0900 ++++ b/storage/innobase/include/fil0fil.h 2010-12-03 17:42:42.097027548 +0900 +@@ -611,9 +611,12 @@ + Reads or writes data. This operation is asynchronous (aio). + @return DB_SUCCESS, or DB_TABLESPACE_DELETED if we are trying to do + i/o on a tablespace which does not exist */ ++#define fil_io(type, sync, space_id, zip_size, block_offset, byte_offset, len, buf, message) \ ++ _fil_io(type, sync, space_id, zip_size, block_offset, byte_offset, len, buf, message, NULL) ++ + UNIV_INTERN + ulint +-fil_io( ++_fil_io( + /*===*/ + ulint type, /*!< in: OS_FILE_READ or OS_FILE_WRITE, + ORed to OS_FILE_LOG, if a log i/o +@@ -638,8 +641,9 @@ + void* buf, /*!< in/out: buffer where to store read data + or from where to write; in aio this must be + appropriately aligned */ +- void* message); /*!< in: message for aio handler if non-sync ++ void* message, /*!< in: message for aio handler if non-sync + aio used, else ignored */ ++ trx_t* trx); + /**********************************************************************//** + Waits for an aio operation to complete. This function is used to write the + handler for completed requests. The aio array of pending requests is divided +diff -ruN a/storage/innobase/include/os0file.h b/storage/innobase/include/os0file.h +--- a/storage/innobase/include/os0file.h 2010-11-03 07:01:13.000000000 +0900 ++++ b/storage/innobase/include/os0file.h 2010-12-03 17:42:42.100023783 +0900 +@@ -36,6 +36,7 @@ + #define os0file_h + + #include "univ.i" ++#include "trx0types.h" + + #ifndef __WIN__ + #include <dirent.h> +@@ -277,13 +278,17 @@ + pfs_os_file_close_func(file, __FILE__, __LINE__) + + # define os_aio(type, mode, name, file, buf, offset, offset_high, \ +- n, message1, message2) \ ++ n, message1, message2, trx) \ + pfs_os_aio_func(type, mode, name, file, buf, offset, \ +- offset_high, n, message1, message2, \ ++ offset_high, n, message1, message2, trx, \ + __FILE__, __LINE__) + <<Diff was trimmed, longer than 597 lines>> ---- CVS-web: http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/mysql/mysql.spec?r1=1.502&r2=1.503&f=u http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/mysql/mysql-innodb_split_buf_pool_mutex.patch?r1=1.1&r2=1.2&f=u http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/mysql/mysql-microsec_process.patch?r1=1.1&r2=1.2&f=u _______________________________________________ pld-cvs-commit mailing list pld-cvs-commit@lists.pld-linux.org http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit