Skip to content

Commit

Permalink
fix memory alignment with logical sector size
Browse files Browse the repository at this point in the history
Summary:
we align the buffer with logical sector size and should not test it with page size, which is usually 4k.
Closes facebook#2245

Differential Revision: D5001842

Pulled By: lightmark

fbshipit-source-id: a7135fcf6351c6db363e8908956b1e193a4a6291
  • Loading branch information
lightmark authored and facebook-github-bot committed May 4, 2017
1 parent e7ae4a3 commit 6b99dbe
Showing 1 changed file with 21 additions and 14 deletions.
35 changes: 21 additions & 14 deletions env/io_posix.cc
Original file line number Diff line number Diff line change
Expand Up @@ -118,18 +118,13 @@ size_t GetLogicalBufferSize(int __attribute__((__unused__)) fd) {
*/
#ifndef NDEBUG
namespace {
#ifdef OS_LINUX
const size_t kPageSize = sysconf(_SC_PAGESIZE);
#else
const size_t kPageSize = 4 * 1024;
#endif

bool IsSectorAligned(const size_t off, size_t sector_size) {
return off % sector_size == 0;
}

static bool IsPageAligned(const void* ptr) {
return uintptr_t(ptr) % (kPageSize) == 0;
bool IsSectorAligned(const void* ptr, size_t sector_size) {
return uintptr_t(ptr) % sector_size == 0;
}

}
Expand Down Expand Up @@ -185,6 +180,11 @@ Status PosixSequentialFile::Read(size_t n, Slice* result, char* scratch) {

Status PosixSequentialFile::PositionedRead(uint64_t offset, size_t n,
Slice* result, char* scratch) {
if (use_direct_io()) {
assert(IsSectorAligned(offset, GetRequiredBufferAlignment()));
assert(IsSectorAligned(n, GetRequiredBufferAlignment()));
assert(IsSectorAligned(scratch, GetRequiredBufferAlignment()));
}
Status s;
ssize_t r = -1;
size_t left = n;
Expand Down Expand Up @@ -309,6 +309,11 @@ PosixRandomAccessFile::~PosixRandomAccessFile() { close(fd_); }

Status PosixRandomAccessFile::Read(uint64_t offset, size_t n, Slice* result,
char* scratch) const {
if (use_direct_io()) {
assert(IsSectorAligned(offset, GetRequiredBufferAlignment()));
assert(IsSectorAligned(n, GetRequiredBufferAlignment()));
assert(IsSectorAligned(scratch, GetRequiredBufferAlignment()));
}
Status s;
ssize_t r = -1;
size_t left = n;
Expand Down Expand Up @@ -707,9 +712,10 @@ PosixWritableFile::~PosixWritableFile() {
}

Status PosixWritableFile::Append(const Slice& data) {
assert(!use_direct_io() ||
(IsSectorAligned(data.size(), GetRequiredBufferAlignment()) &&
IsPageAligned(data.data())));
if (use_direct_io()) {
assert(IsSectorAligned(data.size(), GetRequiredBufferAlignment()));
assert(IsSectorAligned(data.data(), GetRequiredBufferAlignment()));
}
const char* src = data.data();
size_t left = data.size();
while (left != 0) {
Expand All @@ -728,10 +734,11 @@ Status PosixWritableFile::Append(const Slice& data) {
}

Status PosixWritableFile::PositionedAppend(const Slice& data, uint64_t offset) {
assert(use_direct_io() &&
IsSectorAligned(offset, GetRequiredBufferAlignment()) &&
IsSectorAligned(data.size(), GetRequiredBufferAlignment()) &&
IsPageAligned(data.data()));
if (use_direct_io()) {
assert(IsSectorAligned(offset, GetRequiredBufferAlignment()));
assert(IsSectorAligned(data.size(), GetRequiredBufferAlignment()));
assert(IsSectorAligned(data.data(), GetRequiredBufferAlignment()));
}
assert(offset <= std::numeric_limits<off_t>::max());
const char* src = data.data();
size_t left = data.size();
Expand Down

0 comments on commit 6b99dbe

Please sign in to comment.