From bb98ca3c80cedb42d58e309a6836c355e3af43c4 Mon Sep 17 00:00:00 2001 From: krad Date: Wed, 18 May 2016 16:21:29 -0700 Subject: [PATCH] Implement GetUniqueId for Mac Summary: Persistent read cache relies on the accuracy of the GetUniqueIdFromFile to generate a unique key for a given block of data. Currently we don't have an implementation for Mac. This patch adds an implementation. Test Plan: Run unit tests Reviewers: sdong Subscribers: andrewkr, dhruba, leveldb Differential Revision: https://reviews.facebook.net/D58413 --- util/io_posix.cc | 25 ++++++++++++++++++++++++- util/io_posix.h | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/util/io_posix.cc b/util/io_posix.cc index 18238f900..df1a6b6e7 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 39b7b8fdf..fb0c93fbf 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; -- GitLab