diff --git a/src/aux_funcs.cpp b/src/aux_funcs.cpp index d8c9061..f1a929f 100644 --- a/src/aux_funcs.cpp +++ b/src/aux_funcs.cpp @@ -25,7 +25,9 @@ uint64_t cachekey2id(const std::string& key) { size_t align_iobuf(const butil::IOBuf& buf, void** aligned_data) { size_t aligned_unit = config::FLAGS_io_align_unit_size; size_t aligned_size = round_up(buf.size(), aligned_unit); - posix_memalign(aligned_data, aligned_unit, aligned_size); + if (posix_memalign(aligned_data, aligned_unit, aligned_size) != 0) { + return 0; + } butil::IOBuf tmp_buf(buf); // IOBufCutter is a specialized utility to cut from IOBuf faster than using corresponding diff --git a/src/block_file.cpp b/src/block_file.cpp index 829cf28..f223197 100644 --- a/src/block_file.cpp +++ b/src/block_file.cpp @@ -48,7 +48,7 @@ Status BlockFile::close() { } Status BlockFile::write(off_t offset, const IOBuf& buf) { - ssize_t ret = 0; + ssize_t ret = -1; void* aligned_data = nullptr; size_t aligned_size = buf.size(); @@ -57,15 +57,19 @@ Status BlockFile::write(off_t offset, const IOBuf& buf) { auto data = buf.backing_block(0).data(); if (mem_need_align(data, buf.size())) { aligned_size = align_iobuf(buf, &aligned_data); - ret = ::pwrite(_fd, aligned_data, aligned_size, offset); - free(aligned_data); + if (aligned_size > 0) { + ret = ::pwrite(_fd, aligned_data, aligned_size, offset); + free(aligned_data); + } } else { ret = ::pwrite(_fd, data, aligned_size, offset); } } else if (!config::FLAGS_enable_os_page_cache) { aligned_size = align_iobuf(buf, &aligned_data); - ret = ::pwrite(_fd, aligned_data, aligned_size, offset); - free(aligned_data); + if (aligned_size > 0) { + ret = ::pwrite(_fd, aligned_data, aligned_size, offset); + free(aligned_data); + } } else { struct iovec iov[block_num]; for (size_t i = 0; i < block_num; ++i) { @@ -73,10 +77,13 @@ Status BlockFile::write(off_t offset, const IOBuf& buf) { } ret = ::pwritev(_fd, iov, block_num, offset); } + if (ret < 0) { + if (aligned_size == 0) { + errno = ENOMEM; + } return _report_io_error("fail to write block file"); } - STAR_VLOG << "write block file success, fd: " << _fd << ", path: " << _file_path << ", offset: " << offset << ", buf size: " << buf.size() << ", aligned_size: " << aligned_size << ", buf block num: " << block_num; return Status::OK(); diff --git a/src/cache_item.h b/src/cache_item.h index d061de0..a3c2df0 100644 --- a/src/cache_item.h +++ b/src/cache_item.h @@ -15,6 +15,7 @@ #pragma once #include +#include #include #include "block_item.h" diff --git a/src/mem_space_manager.h b/src/mem_space_manager.h index 4aaa0f4..c432e2f 100644 --- a/src/mem_space_manager.h +++ b/src/mem_space_manager.h @@ -18,6 +18,7 @@ #include #include +#include #include namespace starrocks::starcache { diff --git a/src/sharded_lock_manager.h b/src/sharded_lock_manager.h index 4c05b8c..72ca222 100644 --- a/src/sharded_lock_manager.h +++ b/src/sharded_lock_manager.h @@ -16,6 +16,7 @@ #include +#include #include #include "aux_funcs.h" diff --git a/src/star_cache_impl.cpp b/src/star_cache_impl.cpp index 1631769..6388a80 100644 --- a/src/star_cache_impl.cpp +++ b/src/star_cache_impl.cpp @@ -151,6 +151,10 @@ Status StarCacheImpl::_write_block(CacheItemPtr cache_item, const BlockKey& bloc // We allocate an aligned buffer here to avoid repeatedlly copying data to a new aligned buffer // when flush to disk file in `O_DIRECT` mode. size = align_iobuf(buf, &data); + if (size == 0) { + LOG(ERROR) << "align io buffer failed when write block"; + return Status(ENOMEM, "align io buffer failed"); + } } else { data = malloc(buf.size()); buf.copy_to(data); diff --git a/src/tools/starcache_tester.cpp b/src/tools/starcache_tester.cpp index 593d68a..e43b18b 100644 --- a/src/tools/starcache_tester.cpp +++ b/src/tools/starcache_tester.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include "star_cache.h"