Commit 6618fc29 authored by Eugene Kosov's avatar Eugene Kosov

MDEV-21774 Innodb, Windows : restore file sharing logic in Innodb

recv_sys_t opened redo log files along with log_sys_t. That's why I
removed file sharing logic from InnoDB
in 9ef2d29f
But it was actually used to ensure that only one MariaDB instance
will touch the same InnoDB files.

os0file.cc: revert some changes done previously

mapped_file_t::map(): now has arguments read_only, nvme

file_io::open(): now has argument read_only

class file_os_io: make final

log_file_t::open(): now has argument read_only
parent 84e3f9ce
...@@ -468,7 +468,8 @@ class mapped_file_t ...@@ -468,7 +468,8 @@ class mapped_file_t
mapped_file_t &operator=(mapped_file_t &&)= delete; mapped_file_t &operator=(mapped_file_t &&)= delete;
~mapped_file_t() noexcept; ~mapped_file_t() noexcept;
dberr_t map(const char *path, int flags= 0) noexcept; dberr_t map(const char *path, bool read_only= false,
bool nvme= false) noexcept;
dberr_t unmap() noexcept; dberr_t unmap() noexcept;
byte *data() noexcept { return m_area.data(); } byte *data() noexcept { return m_area.data(); }
...@@ -482,7 +483,7 @@ class file_io ...@@ -482,7 +483,7 @@ class file_io
public: public:
file_io(bool durable_writes= false) : m_durable_writes(durable_writes) {} file_io(bool durable_writes= false) : m_durable_writes(durable_writes) {}
virtual ~file_io() noexcept {}; virtual ~file_io() noexcept {};
virtual dberr_t open(const char *path) noexcept= 0; virtual dberr_t open(const char *path, bool read_only) noexcept= 0;
virtual dberr_t rename(const char *old_path, virtual dberr_t rename(const char *old_path,
const char *new_path) noexcept= 0; const char *new_path) noexcept= 0;
virtual dberr_t close() noexcept= 0; virtual dberr_t close() noexcept= 0;
...@@ -498,7 +499,7 @@ class file_io ...@@ -498,7 +499,7 @@ class file_io
bool m_durable_writes; bool m_durable_writes;
}; };
class file_os_io : public file_io class file_os_io final: public file_io
{ {
public: public:
file_os_io()= default; file_os_io()= default;
...@@ -508,7 +509,7 @@ class file_os_io : public file_io ...@@ -508,7 +509,7 @@ class file_os_io : public file_io
file_os_io &operator=(file_os_io &&rhs); file_os_io &operator=(file_os_io &&rhs);
~file_os_io() noexcept; ~file_os_io() noexcept;
dberr_t open(const char *path) noexcept final; dberr_t open(const char *path, bool read_only) noexcept final;
bool is_opened() const noexcept { return m_fd != OS_FILE_CLOSED; } bool is_opened() const noexcept { return m_fd != OS_FILE_CLOSED; }
dberr_t rename(const char *old_path, const char *new_path) noexcept final; dberr_t rename(const char *old_path, const char *new_path) noexcept final;
dberr_t close() noexcept final; dberr_t close() noexcept final;
...@@ -527,7 +528,7 @@ class log_file_t ...@@ -527,7 +528,7 @@ class log_file_t
public: public:
log_file_t(std::string path= "") noexcept : m_path{std::move(path)} {} log_file_t(std::string path= "") noexcept : m_path{std::move(path)} {}
dberr_t open() noexcept; dberr_t open(bool read_only) noexcept;
bool is_opened() const noexcept; bool is_opened() const noexcept;
const std::string &get_path() const noexcept { return m_path; } const std::string &get_path() const noexcept { return m_path; }
......
...@@ -573,32 +573,27 @@ mapped_file_t::~mapped_file_t() noexcept ...@@ -573,32 +573,27 @@ mapped_file_t::~mapped_file_t() noexcept
unmap(); unmap();
} }
dberr_t mapped_file_t::map(const char *path, int flags) noexcept dberr_t mapped_file_t::map(const char *path, bool read_only,
bool nvme) noexcept
{ {
auto fd= auto fd= mysql_file_open(innodb_log_file_key, path,
mysql_file_open(innodb_log_file_key, path, read_only ? O_RDONLY : O_RDWR, MYF(MY_WME));
srv_read_only_mode ? O_RDONLY : O_RDWR, MYF(MY_WME));
if (fd == -1) if (fd == -1)
return DB_ERROR; return DB_ERROR;
MY_STAT stat; const auto file_size= os_file_get_size(path).m_total_size;
if (mysql_file_fstat(fd, &stat, MYF(0)))
{
mysql_file_close(fd, MYF(MY_WME));
return DB_ERROR;
}
void *ptr= my_mmap(0, static_cast<size_t>(stat.st_size), const int nvme_flag= nvme ? MAP_SYNC : 0;
srv_read_only_mode ? PROT_READ : PROT_READ | PROT_WRITE, void *ptr= my_mmap(0, static_cast<size_t>(file_size),
MAP_SHARED_VALIDATE | flags, fd, 0); read_only ? PROT_READ : PROT_READ | PROT_WRITE,
MAP_SHARED_VALIDATE | nvme_flag, fd, 0);
mysql_file_close(fd, MYF(MY_WME)); mysql_file_close(fd, MYF(MY_WME));
if (ptr == MAP_FAILED) if (ptr == MAP_FAILED)
return DB_ERROR; return DB_ERROR;
m_area= {static_cast<byte *>(ptr), m_area= {static_cast<byte *>(ptr),
static_cast<span<byte>::index_type>(stat.st_size)}; static_cast<span<byte>::index_type>(file_size)};
return DB_SUCCESS; return DB_SUCCESS;
} }
...@@ -630,14 +625,14 @@ file_os_io::~file_os_io() noexcept ...@@ -630,14 +625,14 @@ file_os_io::~file_os_io() noexcept
close(); close();
} }
dberr_t file_os_io::open(const char *path) noexcept dberr_t file_os_io::open(const char *path, bool read_only) noexcept
{ {
ut_ad(!is_opened()); ut_ad(!is_opened());
bool success; bool success;
auto tmp_fd= os_file_create( auto tmp_fd= os_file_create(
innodb_log_file_key, path, OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT, innodb_log_file_key, path, OS_FILE_OPEN | OS_FILE_ON_ERROR_NO_EXIT,
OS_FILE_NORMAL, OS_LOG_FILE, srv_read_only_mode, &success); OS_FILE_NORMAL, OS_LOG_FILE, read_only, &success);
if (!success) if (!success)
return DB_ERROR; return DB_ERROR;
...@@ -685,7 +680,7 @@ dberr_t file_os_io::flush_data_only() noexcept ...@@ -685,7 +680,7 @@ dberr_t file_os_io::flush_data_only() noexcept
static bool is_pmem(const char *path) noexcept static bool is_pmem(const char *path) noexcept
{ {
mapped_file_t mf; mapped_file_t mf;
return mf.map(path, MAP_SYNC) == DB_SUCCESS ? true : false; return mf.map(path, true, true) == DB_SUCCESS ? true : false;
} }
class file_pmem_io final : public file_io class file_pmem_io final : public file_io
...@@ -693,9 +688,9 @@ class file_pmem_io final : public file_io ...@@ -693,9 +688,9 @@ class file_pmem_io final : public file_io
public: public:
file_pmem_io() noexcept : file_io(true) {} file_pmem_io() noexcept : file_io(true) {}
dberr_t open(const char *path) noexcept final dberr_t open(const char *path, bool read_only) noexcept final
{ {
return m_file.map(path, MAP_SYNC); return m_file.map(path, read_only, true);
} }
dberr_t rename(const char *old_path, const char *new_path) noexcept final dberr_t rename(const char *old_path, const char *new_path) noexcept final
{ {
...@@ -725,7 +720,7 @@ class file_pmem_io final : public file_io ...@@ -725,7 +720,7 @@ class file_pmem_io final : public file_io
}; };
#endif #endif
dberr_t log_file_t::open() noexcept dberr_t log_file_t::open(bool read_only) noexcept
{ {
ut_a(!is_opened()); ut_a(!is_opened());
...@@ -737,7 +732,7 @@ dberr_t log_file_t::open() noexcept ...@@ -737,7 +732,7 @@ dberr_t log_file_t::open() noexcept
auto ptr= std::unique_ptr<file_io>(new file_os_io); auto ptr= std::unique_ptr<file_io>(new file_os_io);
#endif #endif
if (dberr_t err= ptr->open(m_path.c_str())) if (dberr_t err= ptr->open(m_path.c_str(), read_only))
return err; return err;
m_file= std::move(ptr); m_file= std::move(ptr);
...@@ -795,7 +790,7 @@ dberr_t log_file_t::flush_data_only() noexcept ...@@ -795,7 +790,7 @@ dberr_t log_file_t::flush_data_only() noexcept
void log_t::file::open_file(std::string path) void log_t::file::open_file(std::string path)
{ {
fd= log_file_t(std::move(path)); fd= log_file_t(std::move(path));
if (const dberr_t err= fd.open()) if (const dberr_t err= fd.open(srv_read_only_mode))
ib::fatal() << "open(" << fd.get_path() << ") returned " << err; ib::fatal() << "open(" << fd.get_path() << ") returned " << err;
} }
......
...@@ -598,7 +598,7 @@ void recv_sys_t::open_log_files_if_needed() ...@@ -598,7 +598,7 @@ void recv_sys_t::open_log_files_if_needed()
for (auto &&path : get_existing_log_files_paths()) for (auto &&path : get_existing_log_files_paths())
{ {
recv_sys.files.emplace_back(std::move(path)); recv_sys.files.emplace_back(std::move(path));
ut_a(recv_sys.files.back().open() == DB_SUCCESS); ut_a(recv_sys.files.back().open(true) == DB_SUCCESS);
} }
} }
......
...@@ -2136,7 +2136,7 @@ os_file_create_simple_func( ...@@ -2136,7 +2136,7 @@ os_file_create_simple_func(
file = CreateFile( file = CreateFile(
(LPCTSTR) name, access, (LPCTSTR) name, access,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, FILE_SHARE_READ | FILE_SHARE_DELETE,
NULL, create_flag, attributes, NULL); NULL, create_flag, attributes, NULL);
if (file == INVALID_HANDLE_VALUE) { if (file == INVALID_HANDLE_VALUE) {
...@@ -2404,8 +2404,9 @@ os_file_create_func( ...@@ -2404,8 +2404,9 @@ os_file_create_func(
); );
DWORD create_flag; DWORD create_flag;
const DWORD share_mode = DWORD share_mode = read_only
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
: FILE_SHARE_READ | FILE_SHARE_DELETE;
if (create_mode != OS_FILE_OPEN && create_mode != OS_FILE_OPEN_RAW) { if (create_mode != OS_FILE_OPEN && create_mode != OS_FILE_OPEN_RAW) {
WAIT_ALLOW_WRITES(); WAIT_ALLOW_WRITES();
...@@ -2423,6 +2424,12 @@ os_file_create_func( ...@@ -2423,6 +2424,12 @@ os_file_create_func(
ut_a(!read_only); ut_a(!read_only);
/* On Windows Physical devices require admin privileges and
have to have the write-share mode set. See the remarks
section for the CreateFile() function documentation in MSDN. */
share_mode |= FILE_SHARE_WRITE;
create_flag = OPEN_EXISTING; create_flag = OPEN_EXISTING;
} else if (create_mode == OS_FILE_OPEN } else if (create_mode == OS_FILE_OPEN
...@@ -2605,8 +2612,9 @@ os_file_create_simple_no_error_handling_func( ...@@ -2605,8 +2612,9 @@ os_file_create_simple_no_error_handling_func(
DWORD access; DWORD access;
DWORD create_flag; DWORD create_flag;
DWORD attributes = 0; DWORD attributes = 0;
const DWORD share_mode = DWORD share_mode = read_only
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; ? FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
: FILE_SHARE_READ | FILE_SHARE_DELETE;
ut_a(name); ut_a(name);
...@@ -2652,6 +2660,12 @@ os_file_create_simple_no_error_handling_func( ...@@ -2652,6 +2660,12 @@ os_file_create_simple_no_error_handling_func(
access = GENERIC_READ; access = GENERIC_READ;
/*!< A backup program has to give mysqld the maximum
freedom to do what it likes with the file */
share_mode |= FILE_SHARE_DELETE | FILE_SHARE_WRITE
| FILE_SHARE_READ;
} else { } else {
ib::error() ib::error()
......
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