summaryrefslogtreecommitdiff
path: root/innobase/trx
diff options
context:
space:
mode:
authorheikki@hundin.mysql.fi <>2003-07-03 17:36:33 +0300
committerheikki@hundin.mysql.fi <>2003-07-03 17:36:33 +0300
commitb2769e279239cca52c3f264724286b052357ed14 (patch)
treee450ae76ace2fb81f68f4b65ced85ea941d5ec10 /innobase/trx
parent16bf8d7aae2d424f7d3fd50ee405e999f416f5ff (diff)
downloadmariadb-git-b2769e279239cca52c3f264724286b052357ed14.tar.gz
trx0trx.c:
Fix bug: group commit still did not work when we had MySQL binlogging on
Diffstat (limited to 'innobase/trx')
-rw-r--r--innobase/trx/trx0trx.c98
1 files changed, 67 insertions, 31 deletions
diff --git a/innobase/trx/trx0trx.c b/innobase/trx/trx0trx.c
index 9233e861784..095a9df9082 100644
--- a/innobase/trx/trx0trx.c
+++ b/innobase/trx/trx0trx.c
@@ -778,29 +778,53 @@ trx_commit_off_kernel(
efficient here: call os_thread_yield here to allow also other
trxs to come to commit! */
- /* We now flush the log, as the transaction made changes to
- the database, making the transaction committed on disk. It is
- enough that any one of the log groups gets written to disk. */
-
/*-------------------------------------*/
- /* Most MySQL users run with srv_flush_.. set to 0: */
-
- if (srv_flush_log_at_trx_commit != 0) {
- if (srv_unix_file_flush_method != SRV_UNIX_NOSYNC
- && srv_flush_log_at_trx_commit != 2
- && !trx->flush_log_later) {
-
- /* Write the log to the log files AND flush
- them to disk */
-
- log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, TRUE);
- } else {
- /* Write the log but do not flush it to disk */
-
- log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);
- }
- }
+ /* Depending on the my.cnf options, we may now write the log
+ buffer to the log files, making the transaction durable if
+ the OS does not crash. We may also flush the log files to
+ disk, making the transaction durable also at an OS crash or a
+ power outage.
+
+ The idea in InnoDB's group commit is that a group of
+ transactions gather behind a trx doing a physical disk write
+ to log files, and when that physical write has been completed,
+ one of those transactions does a write which commits the whole
+ group. Note that this group commit will only bring benefit if
+ there are > 2 users in the database. Then at least 2 users can
+ gather behind one doing the physical log write to disk.
+
+ If we are calling trx_commit() under MySQL's binlog mutex, we
+ will delay possible log write and flush to a separate function
+ trx_commit_complete_for_mysql(), which is only called when the
+ thread has released the binlog mutex. This is to make the
+ group commit algorithm to work. Otherwise, the MySQL binlog
+ mutex would serialize all commits and prevent a group of
+ transactions from gathering. */
+
+ if (trx->flush_log_later) {
+ /* Do nothing yet */
+ } else if (srv_flush_log_at_trx_commit == 0) {
+ /* Do nothing */
+ } else if (srv_flush_log_at_trx_commit == 1) {
+ if (srv_unix_file_flush_method == SRV_UNIX_NOSYNC) {
+ /* Write the log but do not flush it to disk */
+
+ log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);
+ } else {
+ /* Write the log to the log files AND flush
+ them to disk */
+
+ log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, TRUE);
+ }
+ } else if (srv_flush_log_at_trx_commit == 2) {
+
+ /* Write the log but do not flush it to disk */
+
+ log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);
+ } else {
+ ut_a(0);
+ }
trx->commit_lsn = lsn;
@@ -1497,21 +1521,33 @@ trx_commit_complete_for_mysql(
/* out: 0 or error number */
trx_t* trx) /* in: trx handle */
{
- ut_a(trx);
+ dulint lsn = trx->commit_lsn;
- if (srv_flush_log_at_trx_commit == 1
- && srv_unix_file_flush_method != SRV_UNIX_NOSYNC) {
-
- trx->op_info = (char *) "flushing log";
+ ut_a(trx);
- /* Flush the log files to disk */
+ if (srv_flush_log_at_trx_commit == 0) {
+ /* Do nothing */
+ } else if (srv_flush_log_at_trx_commit == 1) {
+ if (srv_unix_file_flush_method == SRV_UNIX_NOSYNC) {
+ /* Write the log but do not flush it to disk */
- log_write_up_to(trx->commit_lsn, LOG_WAIT_ONE_GROUP, TRUE);
+ log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);
+ } else {
+ /* Write the log to the log files AND flush them to
+ disk */
- trx->op_info = (char *) "";
- }
+ log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, TRUE);
+ }
+ } else if (srv_flush_log_at_trx_commit == 2) {
- return(0);
+ /* Write the log but do not flush it to disk */
+
+ log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);
+ } else {
+ ut_a(0);
+ }
+
+ return(0);
}
/**************************************************************************