summaryrefslogtreecommitdiff
path: root/storage/maria/ma_control_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'storage/maria/ma_control_file.c')
-rw-r--r--storage/maria/ma_control_file.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/storage/maria/ma_control_file.c b/storage/maria/ma_control_file.c
index 9ebe21ac15a..122fa9f38ee 100644
--- a/storage/maria/ma_control_file.c
+++ b/storage/maria/ma_control_file.c
@@ -92,6 +92,7 @@ CONTROL_FILE_ERROR ma_control_file_create_or_open()
{
char buffer[CONTROL_FILE_SIZE];
char name[FN_REFLEN];
+ const char *errmsg;
MY_STAT stat_buff;
my_bool create_file;
int open_flags= O_BINARY | /*O_DIRECT |*/ O_RDWR;
@@ -121,7 +122,8 @@ CONTROL_FILE_ERROR ma_control_file_create_or_open()
if (maria_in_recovery)
DBUG_RETURN(CONTROL_FILE_MISSING);
if ((control_file_fd= my_create(name, 0,
- open_flags, MYF(MY_SYNC_DIR))) < 0)
+ open_flags,
+ MYF(MY_SYNC_DIR | MY_WME))) < 0)
DBUG_RETURN(CONTROL_FILE_UNKNOWN_ERROR);
/* Create unique uuid for the control file */
@@ -153,10 +155,16 @@ CONTROL_FILE_ERROR ma_control_file_create_or_open()
/* Otherwise, file exists */
if ((control_file_fd= my_open(name, open_flags, MYF(MY_WME))) < 0)
+ {
+ errmsg= "Can't open file";
goto err;
+ }
- if (my_stat(name, &stat_buff, MYF(MY_WME)) == NULL)
+ if (my_stat(name, &stat_buff, MYF(0)) == NULL)
+ {
+ errmsg= "Can't read status";
goto err;
+ }
if ((uint)stat_buff.st_size < CONTROL_FILE_SIZE)
{
@@ -176,6 +184,7 @@ CONTROL_FILE_ERROR ma_control_file_create_or_open()
MySQL's error log at startup.
*/
error= CONTROL_FILE_TOO_SMALL;
+ errmsg= "File size to small";
goto err;
}
@@ -183,17 +192,21 @@ CONTROL_FILE_ERROR ma_control_file_create_or_open()
{
/* TODO: store "too big file" message */
error= CONTROL_FILE_TOO_BIG;
+ errmsg= "File size bigger than expected";
goto err;
}
- if (my_read(control_file_fd, buffer, CONTROL_FILE_SIZE,
- MYF(MY_FNABP | MY_WME)))
+ if (my_read(control_file_fd, buffer, CONTROL_FILE_SIZE, MYF(MY_FNABP)))
+ {
+ errmsg= "Can't read file";
goto err;
+ }
if (memcmp(buffer + CONTROL_FILE_MAGIC_STRING_OFFSET,
CONTROL_FILE_MAGIC_STRING, CONTROL_FILE_MAGIC_STRING_SIZE))
{
/* TODO: store message "bad magic string" somewhere */
error= CONTROL_FILE_BAD_MAGIC_STRING;
+ errmsg= "Missing valid id at start of file";
goto err;
}
memcpy(maria_uuid, buffer + CONTROL_FILE_UUID_OFFSET,
@@ -203,15 +216,19 @@ CONTROL_FILE_ERROR ma_control_file_create_or_open()
CONTROL_FILE_SIZE - CONTROL_FILE_LSN_OFFSET) !=
uint4korr(buffer + CONTROL_FILE_CHECKSUM_OFFSET))
{
- /* TODO: store message "checksum mismatch" somewhere */
error= CONTROL_FILE_BAD_CHECKSUM;
+ errmsg= "Checksum missmatch";
goto err;
}
last_checkpoint_lsn= lsn_korr(buffer + CONTROL_FILE_LSN_OFFSET);
last_logno= uint4korr(buffer + CONTROL_FILE_FILENO_OFFSET);
DBUG_RETURN(0);
+
err:
+ my_printf_error(HA_ERR_INITIALIZATION,
+ "Error when trying to use maria control file '%s': %s", 0,
+ name, errmsg);
ma_control_file_end();
DBUG_RETURN(error);
}
@@ -247,7 +264,7 @@ err:
*/
int ma_control_file_write_and_force(const LSN checkpoint_lsn, uint32 logno,
- uint objs_to_write)
+ uint objs_to_write)
{
char buffer[CONTROL_FILE_SIZE];
my_bool update_checkpoint_lsn= FALSE, update_logno= FALSE;