summaryrefslogtreecommitdiff
path: root/innobase
diff options
context:
space:
mode:
authorheikki@hundin.mysql.fi <>2003-01-05 22:15:03 +0200
committerheikki@hundin.mysql.fi <>2003-01-05 22:15:03 +0200
commit42095544eaafdeca09bb5659d66c9cca60a7dd71 (patch)
tree20a33aef7572a6af406f1e57bd500a301ee95c41 /innobase
parenta41886a09656cd8fb52720941cb29eb07aa2d67f (diff)
downloadmariadb-git-42095544eaafdeca09bb5659d66c9cca60a7dd71.tar.gz
log0log.c:
Backport bugfix from 4.0: combined log file size >= 2 GB could cause log to be written in wrong place btr0pcur.c: Backport bugfix from 4.0: index cursor restoration could theoretically fail
Diffstat (limited to 'innobase')
-rw-r--r--innobase/btr/btr0pcur.c6
-rw-r--r--innobase/log/log0log.c32
2 files changed, 27 insertions, 11 deletions
diff --git a/innobase/btr/btr0pcur.c b/innobase/btr/btr0pcur.c
index 8ca3d41f7f9..2b9dc11e683 100644
--- a/innobase/btr/btr0pcur.c
+++ b/innobase/btr/btr0pcur.c
@@ -292,6 +292,12 @@ btr_pcur_restore_position(
mem_heap_free(heap);
+ /* We have to store position information, modify clock value, etc.
+ because the cursor may now be on a different page */
+
+ btr_pcur_store_position(cursor, mtr);
+
+
return(FALSE);
}
diff --git a/innobase/log/log0log.c b/innobase/log/log0log.c
index cb85e9d3ba6..9e40e4898a5 100644
--- a/innobase/log/log0log.c
+++ b/innobase/log/log0log.c
@@ -437,25 +437,29 @@ log_group_calc_lsn_offset(
dulint lsn, /* in: lsn, must be within 4 GB of group->lsn */
log_group_t* group) /* in: log group */
{
- dulint gr_lsn;
- ulint gr_lsn_size_offset;
- ulint difference;
- ulint group_size;
- ulint offset;
+ dulint gr_lsn;
+ ib_longlong gr_lsn_size_offset;
+ ib_longlong difference;
+ ib_longlong group_size;
+ ib_longlong offset;
ut_ad(mutex_own(&(log_sys->mutex)));
+ /* If total log file size is > 2 GB we can easily get overflows
+ with 32-bit integers. Use 64-bit integers instead. */
+
gr_lsn = group->lsn;
- gr_lsn_size_offset = log_group_calc_size_offset(group->lsn_offset,
- group);
- group_size = log_group_get_capacity(group);
+ gr_lsn_size_offset = (ib_longlong)
+ log_group_calc_size_offset(group->lsn_offset, group);
+
+ group_size = (ib_longlong) log_group_get_capacity(group);
if (ut_dulint_cmp(lsn, gr_lsn) >= 0) {
- difference = ut_dulint_minus(lsn, gr_lsn);
+ difference = (ib_longlong) ut_dulint_minus(lsn, gr_lsn);
} else {
- difference = ut_dulint_minus(gr_lsn, lsn);
+ difference = (ib_longlong) ut_dulint_minus(gr_lsn, lsn);
difference = difference % group_size;
@@ -464,7 +468,13 @@ log_group_calc_lsn_offset(
offset = (gr_lsn_size_offset + difference) % group_size;
- return(log_group_calc_real_offset(offset, group));
+ ut_a(offset <= 0xFFFFFFFF);
+
+ /* printf("Offset is %lu gr_lsn_offset is %lu difference is %lu\n",
+ (ulint)offset,(ulint)gr_lsn_size_offset, (ulint)difference);
+ */
+
+ return(log_group_calc_real_offset((ulint)offset, group));
}
/***********************************************************************