Commit graph

17382 commits

Author SHA1 Message Date
Jan Lindström
f448a800e1 MDEV-9422: Checksum errors on restart when killing busy instance that uses encrypted XtraDB tables
Analysis:

-- InnoDB has n (>0) redo-log files.
-- In the first page of redo-log there is 2 checkpoint records on fixed location (checkpoint is not encrypted)
-- On every checkpoint record there is up to 5 crypt_keys containing the keys used for encryption/decryption
-- On crash recovery we read all checkpoints on every file
-- Recovery starts by reading from the latest checkpoint forward
-- Problem is that latest checkpoint might not always contain the key we need to decrypt all the
   redo-log blocks (see MDEV-9422 for one example)
-- Furthermore, there is no way to identify is the log block corrupted or encrypted

For example checkpoint can contain following keys :

write chk: 4 [ chk key ]: [ 5 1 ] [ 4 1 ] [ 3 1 ] [ 2 1 ] [ 1 1 ]

so over time we could have a checkpoint

write chk: 13 [ chk key ]: [ 14 1 ] [ 13 1 ] [ 12 1 ] [ 11 1 ] [ 10 1 ]

killall -9 mysqld causes crash recovery and on crash recovery we read as
many checkpoints as there is log files, e.g.

read [ chk key ]: [ 13 1 ] [ 12 1 ] [ 11 1 ] [ 10 1 ] [ 9 1 ]
read [ chk key ]: [ 14 1 ] [ 13 1 ] [ 12 1 ] [ 11 1 ] [ 10 1 ] [ 9 1 ]

This is problematic, as we could still scan log blocks e.g. from checkpoint 4 and we do
not know anymore the correct key.

CRYPT INFO: for checkpoint 14 search 4
CRYPT INFO: for checkpoint 13 search 4
CRYPT INFO: for checkpoint 12 search 4
CRYPT INFO: for checkpoint 11 search 4
CRYPT INFO: for checkpoint 10 search 4
CRYPT INFO: for checkpoint 9 search 4 (NOTE: NOT FOUND)

For every checkpoint, code generated a new encrypted key based on key
from encryption plugin and random numbers. Only random numbers are
stored on checkpoint.

Fix: Generate only one key for every log file. If checkpoint contains only
one key, use that key to encrypt/decrypt all log blocks. If checkpoint
contains more than one key (this is case for databases created
using MariaDB server version 10.1.0 - 10.1.12 if log encryption was
used). If looked checkpoint_no is found from keys on checkpoint we use
that key to decrypt the log block. For encryption we use always the
first key. If the looked checkpoint_no is not found from keys on checkpoint
we use the first key.

Modified code also so that if log is not encrypted, we do not generate
any empty keys. If we have a log block and no keys is found from
checkpoint we assume that log block is unencrypted. Log corruption or
missing keys is found by comparing log block checksums. If we have
a keys but current log block checksum is correct we again assume
log block to be unencrypted. This is because current implementation
stores checksum only before encryption and new checksum after
encryption but before disk write is not stored anywhere.
2016-03-18 07:58:04 +02:00
Jan Lindström
d5d0c35f23 Merge pull request #160 from grooverdan/crc32_power_abi_fix
MDEV-9699: power8 crc32: Per the PPC64 ABI, v20-v31 are non-volatile registers
2016-03-15 10:46:33 +02:00
Jan Lindström
a12326458d Add check to avoid NULL-pointer access if encryption information
is not available. Clarify system tablespace page 0 check.
2016-03-13 15:37:47 +02:00
Jan Lindström
f341d94423 MDEV-9549: Trying to decrypt a not encrypted page
Make sure that on decrypt we do not try to reference
NULL pointer and if page contains undefined
FIL_PAGE_FILE_FLUSH_LSN field on when page is not
the first page or page is not in system tablespace,
clear it.
2016-03-12 13:43:33 +02:00
Anton Blanchard
5ea894a7c8 MDEV-9699: power crc32: Per the PPC64 ABI, v20-v31 are non-volatile registers
These where modified and not restored.

Corrected as per upstream:

f2145e5858...aaf0ac4
2016-03-08 16:17:32 +11:00
Nirbhay Choubey
0251232f8c Fix to ensure updates in gtid_slave_state table do not get binlogged.
Also, renamed wsrep_skip_append_keys to wsrep_ignore_table.
Test case : galera.galera_as_slave_gtid.test
2016-02-24 23:32:37 -05:00
Sergei Golubchik
d044507dc5 Merge branch 'bb-10.1-serg' into 10.1
10.0 merge
10.0-galera merge
connect/10.1 merge
2016-02-24 10:27:23 +01:00
Nirbhay Choubey
cceec7858f Merge branch '10.0-galera' into bb-10.1-serg 2016-02-24 01:21:40 -05:00
Nirbhay Choubey
0d58323e26 Merge tag 'mariadb-10.0.24' into 10.0-galera 2016-02-23 20:53:29 -05:00
Sergei Golubchik
88576b3a80 Merge tracking branch 'connect/10.1' into 10.1 2016-02-23 22:16:35 +01:00
Sergei Golubchik
a5679af1b1 Merge branch '10.0' into 10.1 2016-02-23 21:35:05 +01:00
Vicențiu Ciorbaru
0e20137a80 [Code cleanup] Refactor duplicate code within myisam and maria sort.cc 2016-02-23 13:05:16 +02:00
Sergei Golubchik
e6d51aac77 MDEV-9550 COUNT(NULL) returns incorrect result with sequence storage engine
when calculating COUNT(basic_const), take into account that
this basic_const may be NULL
2016-02-23 10:54:35 +01:00
Nirbhay Choubey
2cdcde93c5 Merge sync point from previous commit to XtraDB. 2016-02-23 00:19:41 -05:00
sjaakola
18f160d954 refs codership/mysql-wsrep#233
- added dbug sync points for further mtr test for this issue
2016-02-23 00:13:12 -05:00
Nirbhay Choubey
c1ea0570af refs codership/mysql-wsrep#184
Merge fix to XtraDB engine.
2016-02-22 16:51:45 -05:00
Daniele Sciascia
251c53a8a7 refs codership/mysql-wsrep#184
- Adds runtime check wsrep_on(), to not interfere with default
  innodb behavior.
2016-02-22 16:47:44 -05:00
Nirbhay Choubey
2c56142b77 refs codership/mysql-wsrep#184
Merge fix to XtraDB engine.
2016-02-22 16:36:05 -05:00
Daniele Sciascia
1d21676853 refs codership/mysql-wsrep#184
Fixes a deadlock between applier and its victim transaction.
The deadlock would manifest when a BF victim was waiting for some lock
and was signaled to rollback, and the same time its wait
timeout expired. In such cases the victim would return from
lock_wait_suspend_thread() with error DB_LOCK_WAIT_TIMEOUT, as opposed to
DB_DEADLOCK. As a result only the last statement of the victim would rollback,
and eventually it would deadlock with the applier.
2016-02-22 16:32:45 -05:00
Oliver Giles
d9c640aa8b SphinxSE: add support for json filtering
The filter command did not accept characters . [ ] which are valid
in an attribute name for a sphinx query with json filtering.

+ test case added
2016-02-22 12:50:39 +01:00
Olivier Bertrand
69042ffe4e - Fix to MDEV-9579 be testing for void result.
modified:   storage/connect/tabodbc.cpp
2016-02-20 00:22:16 +01:00
Sergei Golubchik
5f2f3c4fa8 connect engine compiler warnings 2016-02-18 09:22:41 +01:00
Sergei Golubchik
a4b2714968 Merge branch 'bb-10.0-serg' into 10.0 2016-02-17 21:42:57 +01:00
Sergei Golubchik
3eb8b1125f fix InnoDB on Windows 2016-02-17 21:42:48 +01:00
Andrew McDonnell
59b6b99ce3 Added regression test for MDEV_5871 2016-02-17 21:46:32 +04:00
Jan Lindström
36ca65b73b MDEV-9559: Server without encryption configs crashes if selecting from an implicitly encrypted table
There was two problems. Firstly, if page in ibuf is encrypted but
decrypt failed we should not allow InnoDB to start because
this means that system tablespace is encrypted and not usable.
Secondly, if page decrypt is detected we should return false
from buf_page_decrypt_after_read.
2016-02-17 12:32:07 +02:00
Sergei Golubchik
77b548484e Merge branch 'connect/10.0' into 10.0 2016-02-16 19:35:58 +01:00
Sergei Golubchik
b6bcd0fc92 Merge branch 'merge-perfschema-5.6' into 10.0 2016-02-16 19:15:55 +01:00
Sergei Golubchik
7e22a1d843 5.6.29 2016-02-16 18:56:39 +01:00
Sergei Golubchik
17a792a441 Merge branch 'merge-xtradb-5.6' into 10.0 2016-02-16 18:55:00 +01:00
Sergei Golubchik
c8fcaf8aec Merge branch 'merge-innodb-5.6' into 10.0 2016-02-16 18:32:59 +01:00
Sergei Golubchik
d520d35380 Revert "MDEV-8696: Adding indexes on empty table is slow with large innodb_sort_buffer_size."
This reverts commit 13884cf206.

Fixed in 5.6 (merged in the next commit)
2016-02-16 12:53:24 +01:00
Sergei Golubchik
220e70fadc 5.6.29 2016-02-16 12:07:18 +01:00
Sergei Golubchik
d76eba6a6b 5.6.28-76.1 2016-02-16 12:06:16 +01:00
Olivier Bertrand
481e6433f4 - Fix to MDEV-9542 Connect was not handling NULLs in the answer
from catalog functions and tables. It does now and when decimal
  is NULL defines DOUBLE without parameters.
  modified:   storage/connect/ha_connect.cc
  modified:   storage/connect/mysql-test/connect/r/odbc.result
  modified:   storage/connect/mysql-test/connect/r/odbc_oracle.result
  modified:   storage/connect/mysql-test/connect/r/odbc_postgresql.result
  modified:   storage/connect/mysql-test/connect/r/odbc_sqlite3.result
  modified:   storage/connect/mysql-test/connect/r/odbc_xls.result
  modified:   storage/connect/odbconn.cpp
  modified:   storage/connect/table.cpp
  modified:   storage/connect/valblk.h
2016-02-15 23:41:59 +01:00
Sergei Golubchik
271fed4106 Merge branch '5.5' into 10.0 2016-02-15 22:50:59 +01:00
Jan Lindström
a70b8961f4 MDEV-9424: Server crashes when slave works with partitioned tables copied from Windows to Linux
Add check to avoid NULL-pointer access and added warning if share->ib_table
is not what expected.
2016-02-15 18:38:15 +02:00
Jan Lindström
c0b6c27dbe MDEV-9548: Alter table (renaming and adding index) fails with "Incorrect key file for table"
MDEV-9469: 'Incorrect key file' on ALTER TABLE

InnoDB needs to rebuild table if column name is changed and
added index (or foreign key) is created based on this new
name in same alter table.
2016-02-15 14:48:15 +02:00
Sergei Golubchik
daa4a2c7ee MDEV-9351 Fix CPU detection for TokuDB on FreeBSD
"x86_64" is "amd64" on FreeBSD
2016-02-15 13:02:21 +01:00
Sergei Golubchik
1fc6e297f2 XtraDB/InnoDB crash with autoinc, vcol and online alter
Fix the doubly questional fix for MySQL Bug#17250787:
* it detected autoinc index by looking for the first index
  that starts from autoinc column. never mind one column
  can be part of many indexes.
* it used autoinc_field->field_index to look up into internal
  innodb dictionary. But field_index accounts for virtual
  columns too, while innodb dictionary ignores them.

Find the index by its name, like elsewhere in ha_innobase.
2016-02-15 13:02:21 +01:00
Sergei Golubchik
5f078cc8ff compilation errors on sparc sun studio 10
1. unused static inline functions are only removed at -xO4,
   otherwise test binaries will depend on various mysys
   symbols that they don't use. Link test with libmysys.

2. Sphinx - don't instantiate (explicitly) templates before
   they're defined. Or, rather, don't instantiate them explicitly at
   all.

3. GIS - don't use anonymous unions and structs.
2016-02-15 12:51:35 +01:00
Olivier Bertrand
d163ad338d - Fix to MDEV-9542 Connect was not handling NULLs in the answer
from catalog functions and tables. It does now and when decimal
  is NULL defines DOUBLE without parameters.
  modified:   storage/connect/ha_connect.cc
  modified:   storage/connect/mysql-test/connect/r/odbc.result
  modified:   storage/connect/mysql-test/connect/r/odbc_oracle.result
  modified:   storage/connect/mysql-test/connect/r/odbc_postgresql.result
  modified:   storage/connect/mysql-test/connect/r/odbc_sqlite3.result
  modified:   storage/connect/mysql-test/connect/r/odbc_xls.result
  modified:   storage/connect/odbconn.cpp
  modified:   storage/connect/table.cpp
  modified:   storage/connect/valblk.h
2016-02-15 10:32:30 +01:00
Sergei Golubchik
afce5415de Merge branch 'merge-xtradb-5.5' into 5.5
5.5.47-37.7
2016-02-09 14:06:45 +01:00
Sergei Golubchik
f3444df415 Merge branch 'mysql/5.5' into 5.5
reverted about half of commits as either not applicable or
outright wrong
2016-02-09 11:27:40 +01:00
Sergei Golubchik
3cfd36bbe2 5.5.47-37.7 2016-02-09 00:13:25 +01:00
Monty
d80b8442a6 Fixes needed to compile with musl C library
Patch originally by Codarren Velvindron
2016-02-07 15:00:30 +02:00
Jan Lindström
33ac501b6a Use C++ linkage. 2016-02-04 13:54:57 +02:00
Jan Lindström
1d00d5c626 Fix function visibility as it is used on row0mysql.c in Windows. 2016-02-03 16:51:23 +02:00
Jan Lindström
a3d843d949 Fix function visibility as it is used on row0mysql.c in Windows. 2016-02-03 15:52:26 +02:00
Jan Lindström
73d23f8581 MDEV-9471: Server crashes or returns an error while trying to alter partitioning on a table moved from Windows to Linux
At alter table when server renames the table to temporal name,
old name uses normal partioned table naming rules. However,
if tables are created on Windows and then transfered to Linux
and lower-case-table-names=1 we should modify the old name
on rename to lower case to be able to find it from the
InnoDB dictionary.
2016-02-03 14:34:06 +02:00