diff --git a/util/io_posix.cc b/util/io_posix.cc index 18238f900118f7b666d7a8e5e1a57c7cd3ecc13f..df1a6b6e71e709c534ab9cfbd9f14d68bd83c931 100644 --- a/util/io_posix.cc +++ b/util/io_posix.cc @@ -132,7 +132,30 @@ static size_t GetUniqueIdFromFile(int fd, char* id, size_t max_size) { assert(rid >= id); return static_cast(rid - id); } +} // namespace +#endif + +#if defined(OS_MACOSX) +namespace { +static size_t GetUniqueIdFromFile(int fd, char* id, size_t max_size) { + if (max_size < kMaxVarint64Length * 3) { + return 0; + } + + struct stat buf; + int result = fstat(fd, &buf); + if (result == -1) { + return 0; + } + + char* rid = id; + rid = EncodeVarint64(rid, buf.st_dev); + rid = EncodeVarint64(rid, buf.st_ino); + rid = EncodeVarint64(rid, buf.st_gen); + assert(rid >= id); + return static_cast(rid - id); } +} // namespace #endif /* @@ -181,7 +204,7 @@ Status PosixRandomAccessFile::Read(uint64_t offset, size_t n, Slice* result, return s; } -#ifdef OS_LINUX +#if defined(OS_LINUX) || defined(OS_MACOSX) size_t PosixRandomAccessFile::GetUniqueId(char* id, size_t max_size) const { return GetUniqueIdFromFile(fd_, id, max_size); } diff --git a/util/io_posix.h b/util/io_posix.h index 39b7b8fdf07709f61254383cdcf9794fab47c28d..fb0c93fbf25fcbd287f702c4e0faa006e2688c85 100644 --- a/util/io_posix.h +++ b/util/io_posix.h @@ -56,7 +56,7 @@ class PosixRandomAccessFile : public RandomAccessFile { virtual Status Read(uint64_t offset, size_t n, Slice* result, char* scratch) const override; -#ifdef OS_LINUX +#if defined(OS_LINUX) || defined(OS_MACOSX) virtual size_t GetUniqueId(char* id, size_t max_size) const override; #endif virtual void Hint(AccessPattern pattern) override;