Commit ec825721 authored by Jan Lindström's avatar Jan Lindström

Enhancement: Change atomic_writes table option to enum type. Now every file...

Enhancement: Change atomic_writes table option to enum type. Now every file can either use atomic writes, not use it or use default.

SYNTAX: ATOMIC_WRITES=['DEFAULT','ON','OFF']

Idea here is to be able to define innodb_doublewrite = 1 but with following rules:

ATOMIC_WRITES='DEFAULT' - if innodb_use_atomic_writes = 1, we do not write to doublewrite buffer the changes
                          if innodb_use_atomic_writes = 0, we write to doublewrite buffer
ATOMIC_WRITES='ON'      - do not write to doublewrite buffer
ATOMIC_WRITES='OFF'     - write to doublewrite buffer

Note that doublewrite buffer can't be used if innodb_doublewrite = 0.
parent 2b5a0a22
...@@ -50,6 +50,7 @@ Created 11/11/1995 Heikki Tuuri ...@@ -50,6 +50,7 @@ Created 11/11/1995 Heikki Tuuri
#include "srv0mon.h" #include "srv0mon.h"
#include "mysql/plugin.h" #include "mysql/plugin.h"
#include "mysql/service_thd_wait.h" #include "mysql/service_thd_wait.h"
#include "fil0pagecompress.h"
/** Number of pages flushed through non flush_list flushes. */ /** Number of pages flushed through non flush_list flushes. */
static ulint buf_lru_flush_page_count = 0; static ulint buf_lru_flush_page_count = 0;
...@@ -866,6 +867,8 @@ buf_flush_write_block_low( ...@@ -866,6 +867,8 @@ buf_flush_write_block_low(
{ {
ulint zip_size = buf_page_get_zip_size(bpage); ulint zip_size = buf_page_get_zip_size(bpage);
page_t* frame = NULL; page_t* frame = NULL;
ulint space_id = buf_page_get_space(bpage);
atomic_writes_t awrites = fil_space_get_atomic_writes(space_id);
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
buf_pool_t* buf_pool = buf_pool_from_bpage(bpage); buf_pool_t* buf_pool = buf_pool_from_bpage(bpage);
...@@ -943,10 +946,25 @@ buf_flush_write_block_low( ...@@ -943,10 +946,25 @@ buf_flush_write_block_low(
buf_page_get_page_no(bpage), 0, buf_page_get_page_no(bpage), 0,
zip_size ? zip_size : UNIV_PAGE_SIZE, zip_size ? zip_size : UNIV_PAGE_SIZE,
frame, bpage, &bpage->write_size); frame, bpage, &bpage->write_size);
} else if (flush_type == BUF_FLUSH_SINGLE_PAGE) {
buf_dblwr_write_single_page(bpage);
} else { } else {
buf_dblwr_add_to_batch(bpage); /* InnoDB uses doublewrite buffer and doublewrite buffer
is initialized. User can define do we use atomic writes
on a file space (table) or not. If atomic writes are
not used we should use doublewrite buffer and if
atomic writes should be used, no doublewrite buffer
is used. */
if (awrites == ATOMIC_WRITES_ON) {
fil_io(OS_FILE_WRITE | OS_AIO_SIMULATED_WAKE_LATER,
FALSE, buf_page_get_space(bpage), zip_size,
buf_page_get_page_no(bpage), 0,
zip_size ? zip_size : UNIV_PAGE_SIZE,
frame, bpage, &bpage->write_size);
} else if (flush_type == BUF_FLUSH_SINGLE_PAGE) {
buf_dblwr_write_single_page(bpage);
} else {
buf_dblwr_add_to_batch(bpage);
}
} }
} }
......
...@@ -756,7 +756,7 @@ fil_node_open_file( ...@@ -756,7 +756,7 @@ fil_node_open_file(
node->handle = os_file_create_simple_no_error_handling( node->handle = os_file_create_simple_no_error_handling(
innodb_file_data_key, node->name, OS_FILE_OPEN, innodb_file_data_key, node->name, OS_FILE_OPEN,
OS_FILE_READ_ONLY, &success, FALSE); OS_FILE_READ_ONLY, &success, 0);
if (!success) { if (!success) {
/* The following call prints an error message */ /* The following call prints an error message */
os_file_get_last_error(true); os_file_get_last_error(true);
...@@ -3159,7 +3159,7 @@ fil_create_link_file( ...@@ -3159,7 +3159,7 @@ fil_create_link_file(
file = os_file_create_simple_no_error_handling( file = os_file_create_simple_no_error_handling(
innodb_file_data_key, link_filepath, innodb_file_data_key, link_filepath,
OS_FILE_CREATE, OS_FILE_READ_WRITE, &success, FALSE); OS_FILE_CREATE, OS_FILE_READ_WRITE, &success, 0);
if (!success) { if (!success) {
/* The following call will print an error message */ /* The following call will print an error message */
...@@ -3269,8 +3269,8 @@ fil_open_linked_file( ...@@ -3269,8 +3269,8 @@ fil_open_linked_file(
const char* tablename, /*!< in: database/tablename */ const char* tablename, /*!< in: database/tablename */
char** remote_filepath,/*!< out: remote filepath */ char** remote_filepath,/*!< out: remote filepath */
os_file_t* remote_file, /*!< out: remote file handle */ os_file_t* remote_file, /*!< out: remote file handle */
ibool atomic_writes) /*!< in: should atomic writes be ulint atomic_writes) /*!< in: atomic writes table option
used */ value */
{ {
ibool success; ibool success;
...@@ -4861,7 +4861,7 @@ fil_extend_space_to_desired_size( ...@@ -4861,7 +4861,7 @@ fil_extend_space_to_desired_size(
#ifdef HAVE_POSIX_FALLOCATE #ifdef HAVE_POSIX_FALLOCATE
if (srv_use_posix_fallocate) { if (srv_use_posix_fallocate) {
ulint n_pages = size_after_extend - start_page_no; ulint n_pages = size_after_extend;
success = os_file_set_size(node->name, node->handle, success = os_file_set_size(node->name, node->handle,
n_pages * page_size); n_pages * page_size);
......
...@@ -350,8 +350,8 @@ fil_get_compression_alg_name( ...@@ -350,8 +350,8 @@ fil_get_compression_alg_name(
/*******************************************************************//** /*******************************************************************//**
Returns the atomic writes flag of the space, or false if the space Returns the atomic writes flag of the space, or false if the space
is not using atomic writes. The tablespace must be cached in the memory cache. is not using atomic writes. The tablespace must be cached in the memory cache.
@return true if space using atomic writes, false if not */ @return atomic writes table option value */
ibool atomic_writes_t
fil_space_get_atomic_writes( fil_space_get_atomic_writes(
/*========================*/ /*========================*/
ulint id) /*!< in: space id */ ulint id) /*!< in: space id */
...@@ -362,8 +362,8 @@ fil_space_get_atomic_writes( ...@@ -362,8 +362,8 @@ fil_space_get_atomic_writes(
if (flags && flags != ULINT_UNDEFINED) { if (flags && flags != ULINT_UNDEFINED) {
return(fsp_flags_get_atomic_writes(flags)); return((atomic_writes_t)fsp_flags_get_atomic_writes(flags));
} }
return(flags); return((atomic_writes_t)0);
} }
...@@ -503,7 +503,7 @@ ha_create_table_option innodb_table_option_list[]= ...@@ -503,7 +503,7 @@ ha_create_table_option innodb_table_option_list[]=
compression for this table*/ compression for this table*/
HA_TOPTION_NUMBER("PAGE_COMPRESSION_LEVEL", page_compression_level, ULINT_UNDEFINED, 0, 9, 1), HA_TOPTION_NUMBER("PAGE_COMPRESSION_LEVEL", page_compression_level, ULINT_UNDEFINED, 0, 9, 1),
/* With this option user can enable atomic writes feature for this table */ /* With this option user can enable atomic writes feature for this table */
HA_TOPTION_BOOL("ATOMIC_WRITES", atomic_writes, 0), HA_TOPTION_ENUM("ATOMIC_WRITES", atomic_writes, "DEFAULT,ON,OFF", 0),
HA_TOPTION_END HA_TOPTION_END
}; };
...@@ -9738,6 +9738,7 @@ ha_innobase::check_table_options( ...@@ -9738,6 +9738,7 @@ ha_innobase::check_table_options(
{ {
enum row_type row_format = table->s->row_type;; enum row_type row_format = table->s->row_type;;
ha_table_option_struct *options= table->s->option_struct; ha_table_option_struct *options= table->s->option_struct;
atomic_writes_t awrites = (atomic_writes_t)options->atomic_writes;
/* Check page compression requirements */ /* Check page compression requirements */
if (options->page_compressed) { if (options->page_compressed) {
...@@ -9811,8 +9812,9 @@ ha_innobase::check_table_options( ...@@ -9811,8 +9812,9 @@ ha_innobase::check_table_options(
} }
/* Check atomic writes requirements */ /* Check atomic writes requirements */
if (options->atomic_writes) { if (awrites == ATOMIC_WRITES_ON ||
if (!srv_use_atomic_writes && !use_tablespace) { (awrites == ATOMIC_WRITES_DEFAULT && srv_use_atomic_writes)) {
if (!use_tablespace) {
push_warning( push_warning(
thd, Sql_condition::WARN_LEVEL_WARN, thd, Sql_condition::WARN_LEVEL_WARN,
HA_WRONG_CREATE_OPTION, HA_WRONG_CREATE_OPTION,
......
...@@ -64,8 +64,12 @@ struct ha_table_option_struct ...@@ -64,8 +64,12 @@ struct ha_table_option_struct
if this option is true. */ if this option is true. */
int page_compression_level; /*!< Table page compression level int page_compression_level; /*!< Table page compression level
or UNIV_UNSPECIFIED. */ or UNIV_UNSPECIFIED. */
bool atomic_writes; /*!< Use atomic writes for this uint atomic_writes; /*!< Use atomic writes for this
table if this options is true. */ table if this options is ON or
in DEFAULT if
srv_use_atomic_writes=1.
Atomic writes are not used if
value OFF.*/
}; };
......
...@@ -258,7 +258,7 @@ ha_innobase::check_if_supported_inplace_alter( ...@@ -258,7 +258,7 @@ ha_innobase::check_if_supported_inplace_alter(
if (new_options->page_compressed != old_options->page_compressed || if (new_options->page_compressed != old_options->page_compressed ||
new_options->page_compression_level != old_options->page_compression_level || new_options->page_compression_level != old_options->page_compression_level ||
new_options->atomic_writes != old_options->page_compression_level) { new_options->atomic_writes != old_options->atomic_writes) {
ha_alter_info->unsupported_reason = innobase_get_err_msg( ha_alter_info->unsupported_reason = innobase_get_err_msg(
ER_ALTER_OPERATION_NOT_SUPPORTED_REASON); ER_ALTER_OPERATION_NOT_SUPPORTED_REASON);
DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED); DBUG_RETURN(HA_ALTER_INPLACE_NOT_SUPPORTED);
......
...@@ -887,8 +887,8 @@ dict_tf_set( ...@@ -887,8 +887,8 @@ dict_tf_set(
pages */ pages */
ulint page_compression_level, /*!< in: table page compression ulint page_compression_level, /*!< in: table page compression
level */ level */
bool atomic_writes) /*!< in: table uses atomic ulint atomic_writes) /*!< in: table atomic
writes */ writes option value*/
__attribute__((nonnull)); __attribute__((nonnull));
/********************************************************************//** /********************************************************************//**
Convert a 32 bit integer table flags to the 32 bit integer that is Convert a 32 bit integer table flags to the 32 bit integer that is
......
...@@ -670,6 +670,7 @@ dict_sys_tables_type_validate( ...@@ -670,6 +670,7 @@ dict_sys_tables_type_validate(
ulint page_compression = DICT_TF_GET_PAGE_COMPRESSION(type); ulint page_compression = DICT_TF_GET_PAGE_COMPRESSION(type);
ulint page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL(type); ulint page_compression_level = DICT_TF_GET_PAGE_COMPRESSION_LEVEL(type);
ulint atomic_writes = DICT_TF_GET_ATOMIC_WRITES(type); ulint atomic_writes = DICT_TF_GET_ATOMIC_WRITES(type);
atomic_writes_t awrites = (atomic_writes_t)atomic_writes;
/* The low order bit of SYS_TABLES.TYPE is always set to 1. /* The low order bit of SYS_TABLES.TYPE is always set to 1.
If the format is UNIV_FORMAT_B or higher, this field is the same If the format is UNIV_FORMAT_B or higher, this field is the same
...@@ -734,7 +735,8 @@ dict_sys_tables_type_validate( ...@@ -734,7 +735,8 @@ dict_sys_tables_type_validate(
} }
} }
if (atomic_writes) { if (awrites == ATOMIC_WRITES_ON ||
(awrites == ATOMIC_WRITES_DEFAULT && srv_use_atomic_writes)) {
if (!atomic_blobs) { if (!atomic_blobs) {
return(ULINT_UNDEFINED); return(ULINT_UNDEFINED);
} }
...@@ -818,9 +820,10 @@ dict_tf_set( ...@@ -818,9 +820,10 @@ dict_tf_set(
pages */ pages */
ulint page_compression_level, /*!< in: table page compression ulint page_compression_level, /*!< in: table page compression
level */ level */
bool atomic_writes) /*!< in: table uses atomic ulint atomic_writes) /*!< in: table atomic writes setup */
writes */
{ {
atomic_writes_t awrites = (atomic_writes_t)atomic_writes;
switch (format) { switch (format) {
case REC_FORMAT_REDUNDANT: case REC_FORMAT_REDUNDANT:
*flags = 0; *flags = 0;
...@@ -853,9 +856,9 @@ dict_tf_set( ...@@ -853,9 +856,9 @@ dict_tf_set(
ut_ad(dict_tf_get_page_compression_level(*flags) == page_compression_level); ut_ad(dict_tf_get_page_compression_level(*flags) == page_compression_level);
} }
if (atomic_writes) { if (awrites != ATOMIC_WRITES_DEFAULT) {
*flags |= (1 << DICT_TF_POS_ATOMIC_WRITES); *flags |= (atomic_writes << DICT_TF_POS_ATOMIC_WRITES);
ut_ad(dict_tf_get_atomic_writes(*flags) == TRUE); ut_ad(dict_tf_get_atomic_writes(*flags) == awrites);
*flags |= (1 << DICT_TF_POS_ATOMIC_BLOBS); *flags |= (1 << DICT_TF_POS_ATOMIC_BLOBS);
} }
......
...@@ -129,8 +129,9 @@ Width of the page compression flag ...@@ -129,8 +129,9 @@ Width of the page compression flag
/** /**
Width of atomic writes flag Width of atomic writes flag
DEFAULT=0, ON = 1, OFF = 2
*/ */
#define DICT_TF_WIDTH_ATOMIC_WRITES 1 #define DICT_TF_WIDTH_ATOMIC_WRITES 2
/** Width of all the currently known table flags */ /** Width of all the currently known table flags */
#define DICT_TF_BITS (DICT_TF_WIDTH_COMPACT \ #define DICT_TF_BITS (DICT_TF_WIDTH_COMPACT \
......
...@@ -71,7 +71,7 @@ dict_tf_verify_flags( ...@@ -71,7 +71,7 @@ dict_tf_verify_flags(
Extract the atomic writes flag from table flags. Extract the atomic writes flag from table flags.
@return true if atomic writes are used, false if not used */ @return true if atomic writes are used, false if not used */
UNIV_INLINE UNIV_INLINE
ibool atomic_writes_t
dict_tf_get_atomic_writes( dict_tf_get_atomic_writes(
/*======================*/ /*======================*/
ulint flags) /*!< in: flags */ ulint flags) /*!< in: flags */
...@@ -81,7 +81,7 @@ dict_tf_get_atomic_writes( ...@@ -81,7 +81,7 @@ dict_tf_get_atomic_writes(
Check whether the table uses the atomic writes. Check whether the table uses the atomic writes.
@return true if atomic writes is used, false if not */ @return true if atomic writes is used, false if not */
UNIV_INLINE UNIV_INLINE
ibool atomic_writes_t
dict_table_get_atomic_writes( dict_table_get_atomic_writes(
/*=========================*/ /*=========================*/
const dict_table_t* table); /*!< in: table */ const dict_table_t* table); /*!< in: table */
......
...@@ -168,24 +168,24 @@ dict_table_is_page_compressed( ...@@ -168,24 +168,24 @@ dict_table_is_page_compressed(
/********************************************************************//** /********************************************************************//**
Extract the atomic writes flag from table flags. Extract the atomic writes flag from table flags.
@return true if atomic writes are used, false if not used */ @return enumerated value of atomic writes */
UNIV_INLINE UNIV_INLINE
ibool atomic_writes_t
dict_tf_get_atomic_writes( dict_tf_get_atomic_writes(
/*======================*/ /*======================*/
ulint flags) /*!< in: flags */ ulint flags) /*!< in: flags */
{ {
return(DICT_TF_GET_ATOMIC_WRITES(flags)); return((atomic_writes_t)DICT_TF_GET_ATOMIC_WRITES(flags));
} }
/********************************************************************//** /********************************************************************//**
Check whether the table uses the atomic writes. Check whether the table uses the atomic writes.
@return true if atomic writes is used, false if not */ @return enumerated value of atomic writes */
UNIV_INLINE UNIV_INLINE
ibool atomic_writes_t
dict_table_get_atomic_writes( dict_table_get_atomic_writes(
/*=========================*/ /*=========================*/
const dict_table_t* table) /*!< in: table */ const dict_table_t* table) /*!< in: table */
{ {
return (dict_tf_get_atomic_writes(table->flags)); return ((atomic_writes_t)dict_tf_get_atomic_writes(table->flags));
} }
/***************************************************************************** /*****************************************************************************
Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved. Copyright (c) 1996, 2011, Oracle and/or its affiliates. All Rights Reserved.
Copyright (c) 2013, SkySQL Ab. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it under This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software the terms of the GNU General Public License as published by the Free Software
...@@ -67,4 +68,11 @@ enum ib_quiesce_t { ...@@ -67,4 +68,11 @@ enum ib_quiesce_t {
QUIESCE_COMPLETE /*!< All done */ QUIESCE_COMPLETE /*!< All done */
}; };
/** Enum values for atomic_writes table option */
typedef enum {
ATOMIC_WRITES_DEFAULT = 0,
ATOMIC_WRITES_ON = 1,
ATOMIC_WRITES_OFF = 2
} atomic_writes_t;
#endif #endif
...@@ -49,8 +49,8 @@ fil_space_is_page_compressed( ...@@ -49,8 +49,8 @@ fil_space_is_page_compressed(
/*******************************************************************//** /*******************************************************************//**
Returns the atomic writes flag of the space, or false if the space Returns the atomic writes flag of the space, or false if the space
is not using atomic writes. The tablespace must be cached in the memory cache. is not using atomic writes. The tablespace must be cached in the memory cache.
@return true if space using atomic writes, false if not */ @return atomic write table option value */
ibool atomic_writes_t
fil_space_get_atomic_writes( fil_space_get_atomic_writes(
/*=========================*/ /*=========================*/
ulint id); /*!< in: space id */ ulint id); /*!< in: space id */
......
...@@ -58,7 +58,7 @@ is found in a remote location, not the default data directory. */ ...@@ -58,7 +58,7 @@ is found in a remote location, not the default data directory. */
#define FSP_FLAGS_WIDTH_PAGE_COMPRESSION 1 #define FSP_FLAGS_WIDTH_PAGE_COMPRESSION 1
#define FSP_FLAGS_WIDTH_PAGE_COMPRESSION_LEVEL 4 #define FSP_FLAGS_WIDTH_PAGE_COMPRESSION_LEVEL 4
/** Number of flag bits used to indicate atomic writes for this tablespace */ /** Number of flag bits used to indicate atomic writes for this tablespace */
#define FSP_FLAGS_WIDTH_ATOMIC_WRITES 1 #define FSP_FLAGS_WIDTH_ATOMIC_WRITES 2
/** Width of all the currently known tablespace flags */ /** Width of all the currently known tablespace flags */
#define FSP_FLAGS_WIDTH (FSP_FLAGS_WIDTH_POST_ANTELOPE \ #define FSP_FLAGS_WIDTH (FSP_FLAGS_WIDTH_POST_ANTELOPE \
......
...@@ -67,6 +67,7 @@ fsp_flags_is_valid( ...@@ -67,6 +67,7 @@ fsp_flags_is_valid(
ulint page_compression = FSP_FLAGS_GET_PAGE_COMPRESSION(flags); ulint page_compression = FSP_FLAGS_GET_PAGE_COMPRESSION(flags);
ulint page_compression_level = FSP_FLAGS_GET_PAGE_COMPRESSION_LEVEL(flags); ulint page_compression_level = FSP_FLAGS_GET_PAGE_COMPRESSION_LEVEL(flags);
ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(flags); ulint atomic_writes = FSP_FLAGS_GET_ATOMIC_WRITES(flags);
atomic_writes_t awrites = (atomic_writes_t)atomic_writes;
DBUG_EXECUTE_IF("fsp_flags_is_valid_failure", return(false);); DBUG_EXECUTE_IF("fsp_flags_is_valid_failure", return(false););
...@@ -116,7 +117,9 @@ fsp_flags_is_valid( ...@@ -116,7 +117,9 @@ fsp_flags_is_valid(
} }
} }
if (atomic_writes && !atomic_blobs) { if ((awrites == ATOMIC_WRITES_ON ||
(awrites == ATOMIC_WRITES_DEFAULT && srv_use_atomic_writes))
&& !atomic_blobs) {
return (false); return (false);
} }
......
...@@ -57,6 +57,15 @@ fsp_flags_get_page_compression_level( ...@@ -57,6 +57,15 @@ fsp_flags_get_page_compression_level(
/*=================================*/ /*=================================*/
ulint flags); /*!< in: tablespace flags */ ulint flags); /*!< in: tablespace flags */
/********************************************************************//**
Determine the tablespace is using atomic writes from dict_table_t::flags.
@return true if atomic writes is used, false if not */
UNIV_INLINE
atomic_writes_t
fsp_flags_get_atomic_writes(
/*========================*/
ulint flags); /*!< in: tablespace flags */
#ifndef UNIV_NONINL #ifndef UNIV_NONINL
#include "fsp0pagecompress.ic" #include "fsp0pagecompress.ic"
#endif #endif
......
...@@ -52,10 +52,10 @@ fsp_flags_get_page_compression_level( ...@@ -52,10 +52,10 @@ fsp_flags_get_page_compression_level(
Determine the tablespace is using atomic writes from dict_table_t::flags. Determine the tablespace is using atomic writes from dict_table_t::flags.
@return true if atomic writes is used, false if not */ @return true if atomic writes is used, false if not */
UNIV_INLINE UNIV_INLINE
ibool atomic_writes_t
fsp_flags_get_atomic_writes( fsp_flags_get_atomic_writes(
/*========================*/ /*========================*/
ulint flags) /*!< in: tablespace flags */ ulint flags) /*!< in: tablespace flags */
{ {
return(FSP_FLAGS_GET_ATOMIC_WRITES(flags)); return((atomic_writes_t)FSP_FLAGS_GET_ATOMIC_WRITES(flags));
} }
...@@ -275,12 +275,12 @@ The wrapper functions have the prefix of "innodb_". */ ...@@ -275,12 +275,12 @@ The wrapper functions have the prefix of "innodb_". */
pfs_os_file_create_func(key, name, create, purpose, type, \ pfs_os_file_create_func(key, name, create, purpose, type, \
success, atomic_writes, __FILE__, __LINE__) success, atomic_writes, __FILE__, __LINE__)
# define os_file_create_simple(key, name, create, access, success, atomic_writes) \ # define os_file_create_simple(key, name, create, access, success) \
pfs_os_file_create_simple_func(key, name, create, access, \ pfs_os_file_create_simple_func(key, name, create, access, \
success, atomic_writes, __FILE__, __LINE__) success, __FILE__, __LINE__)
# define os_file_create_simple_no_error_handling( \ # define os_file_create_simple_no_error_handling( \
key, name, create_mode, access, success, atomic_writes) \ key, name, create_mode, access, success, atomic_writes) \
pfs_os_file_create_simple_no_error_handling_func( \ pfs_os_file_create_simple_no_error_handling_func( \
key, name, create_mode, access, success, atomic_writes, __FILE__, __LINE__) key, name, create_mode, access, success, atomic_writes, __FILE__, __LINE__)
...@@ -315,13 +315,13 @@ to original un-instrumented file I/O APIs */ ...@@ -315,13 +315,13 @@ to original un-instrumented file I/O APIs */
# define os_file_create(key, name, create, purpose, type, success, atomic_writes) \ # define os_file_create(key, name, create, purpose, type, success, atomic_writes) \
os_file_create_func(name, create, purpose, type, success, atomic_writes) os_file_create_func(name, create, purpose, type, success, atomic_writes)
# define os_file_create_simple(key, name, create_mode, access, success, atomic_writes) \ # define os_file_create_simple(key, name, create_mode, access, success) \
os_file_create_simple_func(name, create_mode, access, success, atomic_writes) os_file_create_simple_func(name, create_mode, access, success)
# define os_file_create_simple_no_error_handling( \ # define os_file_create_simple_no_error_handling( \
key, name, create_mode, access, success, atomic_writes) \ key, name, create_mode, access, success, atomic_writes) \
os_file_create_simple_no_error_handling_func( \ os_file_create_simple_no_error_handling_func( \
name, create_mode, access, success, atomic_writes) name, create_mode, access, success, atomic_writes)
# define os_file_close(file) os_file_close_func(file) # define os_file_close(file) os_file_close_func(file)
...@@ -470,8 +470,7 @@ os_file_create_simple_func( ...@@ -470,8 +470,7 @@ os_file_create_simple_func(
ulint create_mode,/*!< in: create mode */ ulint create_mode,/*!< in: create mode */
ulint access_type,/*!< in: OS_FILE_READ_ONLY or ulint access_type,/*!< in: OS_FILE_READ_ONLY or
OS_FILE_READ_WRITE */ OS_FILE_READ_WRITE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success);/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes); /*!<in TRUE if atomic writes are used */
/****************************************************************//** /****************************************************************//**
NOTE! Use the corresponding macro NOTE! Use the corresponding macro
os_file_create_simple_no_error_handling(), not directly this function! os_file_create_simple_no_error_handling(), not directly this function!
...@@ -490,7 +489,8 @@ os_file_create_simple_no_error_handling_func( ...@@ -490,7 +489,8 @@ os_file_create_simple_no_error_handling_func(
OS_FILE_READ_ALLOW_DELETE; the last option is OS_FILE_READ_ALLOW_DELETE; the last option is
used by a backup program reading the file */ used by a backup program reading the file */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes)/*!<in TRUE if atomic writes are used */ ulint atomic_writes)/*!< in: atomic writes table option
value */
__attribute__((nonnull, warn_unused_result)); __attribute__((nonnull, warn_unused_result));
/****************************************************************//** /****************************************************************//**
Tries to disable OS caching on an opened file descriptor. */ Tries to disable OS caching on an opened file descriptor. */
...@@ -525,7 +525,8 @@ os_file_create_func( ...@@ -525,7 +525,8 @@ os_file_create_func(
function source code for the exact rules */ function source code for the exact rules */
ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */ ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes)/*!<in TRUE if atomic writes are used */ ulint atomic_writes)/*!< in: atomic writes table option
value */
__attribute__((nonnull, warn_unused_result)); __attribute__((nonnull, warn_unused_result));
/***********************************************************************//** /***********************************************************************//**
Deletes a file. The file has to be closed before calling this. Deletes a file. The file has to be closed before calling this.
...@@ -590,7 +591,6 @@ pfs_os_file_create_simple_func( ...@@ -590,7 +591,6 @@ pfs_os_file_create_simple_func(
ulint access_type,/*!< in: OS_FILE_READ_ONLY or ulint access_type,/*!< in: OS_FILE_READ_ONLY or
OS_FILE_READ_WRITE */ OS_FILE_READ_WRITE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes,/*!<in TRUE if atomic writes are used */
const char* src_file,/*!< in: file name where func invoked */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line)/*!< in: line where the func invoked */ ulint src_line)/*!< in: line where the func invoked */
__attribute__((nonnull, warn_unused_result)); __attribute__((nonnull, warn_unused_result));
...@@ -616,7 +616,8 @@ pfs_os_file_create_simple_no_error_handling_func( ...@@ -616,7 +616,8 @@ pfs_os_file_create_simple_no_error_handling_func(
OS_FILE_READ_ALLOW_DELETE; the last option is OS_FILE_READ_ALLOW_DELETE; the last option is
used by a backup program reading the file */ used by a backup program reading the file */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes, /*!<in TRUE if atomic writes are used */ ulint atomic_writes,/*!< in: atomic writes table option
value */
const char* src_file,/*!< in: file name where func invoked */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line)/*!< in: line where the func invoked */ ulint src_line)/*!< in: line where the func invoked */
__attribute__((nonnull, warn_unused_result)); __attribute__((nonnull, warn_unused_result));
...@@ -645,7 +646,8 @@ pfs_os_file_create_func( ...@@ -645,7 +646,8 @@ pfs_os_file_create_func(
function source code for the exact rules */ function source code for the exact rules */
ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */ ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes, /*!<in TRUE if atomic writes are used */ ulint atomic_writes,/*!< in: atomic writes table option
value*/
const char* src_file,/*!< in: file name where func invoked */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line)/*!< in: line where the func invoked */ ulint src_line)/*!< in: line where the func invoked */
__attribute__((nonnull, warn_unused_result)); __attribute__((nonnull, warn_unused_result));
...@@ -694,6 +696,8 @@ pfs_os_file_read_no_error_handling_func( ...@@ -694,6 +696,8 @@ pfs_os_file_read_no_error_handling_func(
void* buf, /*!< in: buffer where to read */ void* buf, /*!< in: buffer where to read */
os_offset_t offset, /*!< in: file offset where to read */ os_offset_t offset, /*!< in: file offset where to read */
ulint n, /*!< in: number of bytes to read */ ulint n, /*!< in: number of bytes to read */
ulint atomic_writes,/*!< in: atomic writes table option
value */
const char* src_file,/*!< in: file name where func invoked */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line);/*!< in: line where the func invoked */ ulint src_line);/*!< in: line where the func invoked */
......
...@@ -45,7 +45,6 @@ pfs_os_file_create_simple_func( ...@@ -45,7 +45,6 @@ pfs_os_file_create_simple_func(
ulint access_type,/*!< in: OS_FILE_READ_ONLY or ulint access_type,/*!< in: OS_FILE_READ_ONLY or
OS_FILE_READ_WRITE */ OS_FILE_READ_WRITE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes, /*!<in TRUE if atomic writes are used */
const char* src_file,/*!< in: file name where func invoked */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line)/*!< in: line where the func invoked */ ulint src_line)/*!< in: line where the func invoked */
{ {
...@@ -61,7 +60,7 @@ pfs_os_file_create_simple_func( ...@@ -61,7 +60,7 @@ pfs_os_file_create_simple_func(
name, src_file, src_line); name, src_file, src_line);
file = os_file_create_simple_func(name, create_mode, file = os_file_create_simple_func(name, create_mode,
access_type, success, atomic_writes); access_type, success);
/* Regsiter the returning "file" value with the system */ /* Regsiter the returning "file" value with the system */
register_pfs_file_open_end(locker, file); register_pfs_file_open_end(locker, file);
...@@ -90,7 +89,8 @@ pfs_os_file_create_simple_no_error_handling_func( ...@@ -90,7 +89,8 @@ pfs_os_file_create_simple_no_error_handling_func(
OS_FILE_READ_ALLOW_DELETE; the last option is OS_FILE_READ_ALLOW_DELETE; the last option is
used by a backup program reading the file */ used by a backup program reading the file */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes, /*!<in TRUE if atomic writes are used */ ulint atomic_writes,/*!< in: atomic writes table option
value */
const char* src_file,/*!< in: file name where func invoked */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line)/*!< in: line where the func invoked */ ulint src_line)/*!< in: line where the func invoked */
{ {
...@@ -137,7 +137,8 @@ pfs_os_file_create_func( ...@@ -137,7 +137,8 @@ pfs_os_file_create_func(
function source code for the exact rules */ function source code for the exact rules */
ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */ ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes, /*!<in TRUE if atomic writes are used */ ulint atomic_writes, /*!< in: atomic writes table option
value */
const char* src_file,/*!< in: file name where func invoked */ const char* src_file,/*!< in: file name where func invoked */
ulint src_line)/*!< in: line where the func invoked */ ulint src_line)/*!< in: line where the func invoked */
{ {
......
...@@ -1259,8 +1259,7 @@ os_file_create_simple_func( ...@@ -1259,8 +1259,7 @@ os_file_create_simple_func(
ulint create_mode,/*!< in: create mode */ ulint create_mode,/*!< in: create mode */
ulint access_type,/*!< in: OS_FILE_READ_ONLY or ulint access_type,/*!< in: OS_FILE_READ_ONLY or
OS_FILE_READ_WRITE */ OS_FILE_READ_WRITE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success)/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes) /*!<in TRUE if atomic writes are used */
{ {
os_file_t file; os_file_t file;
ibool retry; ibool retry;
...@@ -1354,14 +1353,6 @@ os_file_create_simple_func( ...@@ -1354,14 +1353,6 @@ os_file_create_simple_func(
} while (retry); } while (retry);
if (file != INVALID_HANDLE_VALUE
&& (srv_use_atomic_writes || atomic_writes)
&& !os_file_set_atomic_writes(name, file)) {
CloseHandle(file);
*success = FALSE;
file = INVALID_HANDLE_VALUE;
}
#else /* __WIN__ */ #else /* __WIN__ */
int create_flag; int create_flag;
...@@ -1441,14 +1432,6 @@ os_file_create_simple_func( ...@@ -1441,14 +1432,6 @@ os_file_create_simple_func(
} }
#endif /* USE_FILE_LOCK */ #endif /* USE_FILE_LOCK */
if (file != -1
&& (srv_use_atomic_writes || atomic_writes)
&& !os_file_set_atomic_writes(name, file)) {
*success = FALSE;
close(file);
file = -1;
}
#endif /* __WIN__ */ #endif /* __WIN__ */
return(file); return(file);
...@@ -1472,9 +1455,11 @@ os_file_create_simple_no_error_handling_func( ...@@ -1472,9 +1455,11 @@ os_file_create_simple_no_error_handling_func(
OS_FILE_READ_ALLOW_DELETE; the last option is OS_FILE_READ_ALLOW_DELETE; the last option is
used by a backup program reading the file */ used by a backup program reading the file */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes) /*!<in TRUE if atomic writes are used */ ulint atomic_writes) /*! in: atomic writes table option
value */
{ {
os_file_t file; os_file_t file;
atomic_writes_t awrites = (atomic_writes_t) atomic_writes;
#ifdef __WIN__ #ifdef __WIN__
DWORD access; DWORD access;
...@@ -1535,13 +1520,14 @@ os_file_create_simple_no_error_handling_func( ...@@ -1535,13 +1520,14 @@ os_file_create_simple_no_error_handling_func(
NULL); // No template file NULL); // No template file
if (file != INVALID_HANDLE_VALUE if (file != INVALID_HANDLE_VALUE
&& (srv_use_atomic_writes || atomic_writes) && (awrites == ATOMIC_WRITES_ON ||
(srv_use_atomic_writes && awrites == ATOMIC_WRITES_DEFAULT))
&& !os_file_set_atomic_writes(name, file)) { && !os_file_set_atomic_writes(name, file)) {
CloseHandle(file); CloseHandle(file);
file = INVALID_HANDLE_VALUE; *success = FALSE;
file = INVALID_HANDLE_VALUE;
} }
*success = (file != INVALID_HANDLE_VALUE); *success = (file != INVALID_HANDLE_VALUE);
#else /* __WIN__ */ #else /* __WIN__ */
int create_flag; int create_flag;
...@@ -1603,13 +1589,15 @@ os_file_create_simple_no_error_handling_func( ...@@ -1603,13 +1589,15 @@ os_file_create_simple_no_error_handling_func(
#endif /* USE_FILE_LOCK */ #endif /* USE_FILE_LOCK */
if (file != -1 if (file != -1
&& (srv_use_atomic_writes || atomic_writes) && (awrites == ATOMIC_WRITES_ON ||
(srv_use_atomic_writes && awrites == ATOMIC_WRITES_DEFAULT))
&& !os_file_set_atomic_writes(name, file)) { && !os_file_set_atomic_writes(name, file)) {
*success = FALSE; *success = FALSE;
close(file); close(file);
file = -1; file = -1;
} }
#endif /* __WIN__ */ #endif /* __WIN__ */
return(file); return(file);
...@@ -1681,13 +1669,14 @@ os_file_create_func( ...@@ -1681,13 +1669,14 @@ os_file_create_func(
function source code for the exact rules */ function source code for the exact rules */
ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */ ulint type, /*!< in: OS_DATA_FILE or OS_LOG_FILE */
ibool* success,/*!< out: TRUE if succeed, FALSE if error */ ibool* success,/*!< out: TRUE if succeed, FALSE if error */
ibool atomic_writes) /*! in: true if atomic writes for ulint atomic_writes) /*! in: atomic writes table option
this file should be used */ value */
{ {
os_file_t file; os_file_t file;
ibool retry; ibool retry;
ibool on_error_no_exit; ibool on_error_no_exit;
ibool on_error_silent; ibool on_error_silent;
atomic_writes_t awrites = (atomic_writes_t) atomic_writes;
#ifdef __WIN__ #ifdef __WIN__
DBUG_EXECUTE_IF( DBUG_EXECUTE_IF(
...@@ -1832,15 +1821,13 @@ os_file_create_func( ...@@ -1832,15 +1821,13 @@ os_file_create_func(
} while (retry); } while (retry);
if (file != INVALID_HANDLE_VALUE if (file != INVALID_HANDLE_VALUE
&& type == OS_DATA_FILE && (awrites == ATOMIC_WRITES_ON ||
&& (srv_use_atomic_writes || atomic_writes) (srv_use_atomic_writes && awrites == ATOMIC_WRITES_DEFAULT))
&& !os_file_set_atomic_writes(name, file)) { && !os_file_set_atomic_writes(name, file)) {
CloseHandle(file); CloseHandle(file);
*success = FALSE; *success = FALSE;
file = INVALID_HANDLE_VALUE; file = INVALID_HANDLE_VALUE;
} }
#else /* __WIN__ */ #else /* __WIN__ */
int create_flag; int create_flag;
const char* mode_str = NULL; const char* mode_str = NULL;
...@@ -1970,15 +1957,13 @@ os_file_create_func( ...@@ -1970,15 +1957,13 @@ os_file_create_func(
#endif /* USE_FILE_LOCK */ #endif /* USE_FILE_LOCK */
if (file != -1 if (file != -1
&& type == OS_DATA_FILE && (awrites == ATOMIC_WRITES_ON ||
&& (srv_use_atomic_writes || atomic_writes) (srv_use_atomic_writes && awrites == ATOMIC_WRITES_DEFAULT))
&& !os_file_set_atomic_writes(name, file)) { && !os_file_set_atomic_writes(name, file)) {
*success = FALSE; *success = FALSE;
close(file); close(file);
file = -1; file = -1;
} }
#endif /* __WIN__ */ #endif /* __WIN__ */
return(file); return(file);
...@@ -2288,6 +2273,11 @@ os_file_set_size( ...@@ -2288,6 +2273,11 @@ os_file_set_size(
current_size = 0; current_size = 0;
#ifdef UNIV_DEBUG
fprintf(stderr, "InnoDB: Note: File %s current_size %lu extended_size %lu\n",
name, os_file_get_size(file), size);
#endif
#ifdef HAVE_POSIX_FALLOCATE #ifdef HAVE_POSIX_FALLOCATE
if (srv_use_posix_fallocate) { if (srv_use_posix_fallocate) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment