From 01ca97865fa9d6ed1a967e970927265f1c348289 Mon Sep 17 00:00:00 2001 From: Martin Ebourne Date: Wed, 30 Nov 2005 23:14:40 +0000 Subject: Merged martin/solaris at r9 to trunk --- lib/raidfile/RaidFileRead.cpp | 30 +++++++++++++++++------------- lib/raidfile/RaidFileUtil.cpp | 8 ++++---- lib/raidfile/RaidFileWrite.cpp | 23 +++++++++++++---------- 3 files changed, 34 insertions(+), 27 deletions(-) (limited to 'lib/raidfile') diff --git a/lib/raidfile/RaidFileRead.cpp b/lib/raidfile/RaidFileRead.cpp index fed22ac0..6314ba90 100755 --- a/lib/raidfile/RaidFileRead.cpp +++ b/lib/raidfile/RaidFileRead.cpp @@ -317,11 +317,7 @@ RaidFileRead_Raid::RaidFileRead_Raid(int SetNumber, const std::string &Filename, mEOF(false) { // Make sure size of the IOStream::pos_type matches the pos_type used -#ifdef PLATFORM_LINUX ASSERT(sizeof(pos_type) >= sizeof(off_t)); -#else - ASSERT(sizeof(pos_type) == sizeof(off_t)); -#endif // Sanity check handles if(mStripe1Handle != -1 && mStripe2Handle != -1) @@ -1546,18 +1542,22 @@ bool RaidFileRead::ReadDirectoryContents(int SetNumber, const std::string &rDirN continue; } + // Entry... + std::string name; + unsigned int countToAdd = 1; + // stat the file to find out what type it is -/* struct stat st; +#ifdef PLATFORM_SUNOS + struct stat st; std::string fullName(dn + DIRECTORY_SEPARATOR + en->d_name); - if(::stat(fullName.c_str(), &st) != 0) + if(::lstat(fullName.c_str(), &st) != 0) { THROW_EXCEPTION(RaidFileException, OSError) - }*/ - - // Entry... - std::string name; - unsigned int countToAdd = 1; - if(DirReadType == DirReadType_FilesOnly && en->d_type == DT_REG) // (st.st_mode & S_IFDIR) == 0) + } + if(DirReadType == DirReadType_FilesOnly && (st.st_mode & S_IFDIR) == 0) +#else + if(DirReadType == DirReadType_FilesOnly && en->d_type == DT_REG) +#endif { // File. Complex, need to check the extension int dot = -1; @@ -1585,7 +1585,11 @@ bool RaidFileRead::ReadDirectoryContents(int SetNumber, const std::string &rDirN } } } - if(DirReadType == DirReadType_DirsOnly && en->d_type == DT_DIR) // (st.st_mode & S_IFDIR)) +#ifdef PLATFORM_SUNOS + if(DirReadType == DirReadType_DirsOnly && (st.st_mode & S_IFDIR)) +#else + if(DirReadType == DirReadType_DirsOnly && en->d_type == DT_DIR) +#endif { // Directory, and we want directories name = en->d_name; diff --git a/lib/raidfile/RaidFileUtil.cpp b/lib/raidfile/RaidFileUtil.cpp index 9177c8ba..c71bb2df 100755 --- a/lib/raidfile/RaidFileUtil.cpp +++ b/lib/raidfile/RaidFileUtil.cpp @@ -54,7 +54,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, if(pRevisionID != 0) { (*pRevisionID) = FileModificationTime(st); -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime // On linux, the time resolution is very low for modification times. // So add the size to it to give a bit more chance of it changing. // TODO: Make this better. @@ -71,7 +71,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, int64_t revisionID = 0; int setSize = rDiscSet.size(); int rfCount = 0; -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime // TODO: replace this with better linux revision ID detection int64_t revisionIDplus = 0; #endif @@ -92,7 +92,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, { int64_t rid = FileModificationTime(st); if(rid > revisionID) revisionID = rid; -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime revisionIDplus += st.st_size; #endif } @@ -101,7 +101,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, if(pRevisionID != 0) { (*pRevisionID) = revisionID; -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime (*pRevisionID) += revisionIDplus; #endif } diff --git a/lib/raidfile/RaidFileWrite.cpp b/lib/raidfile/RaidFileWrite.cpp index 414f24e6..987aa22c 100755 --- a/lib/raidfile/RaidFileWrite.cpp +++ b/lib/raidfile/RaidFileWrite.cpp @@ -112,10 +112,21 @@ void RaidFileWrite::Open(bool AllowOverwrite) } // Get a lock on the write file +#ifdef PLATFORM_open_USE_fcntl + int errnoBlock = EAGAIN; + struct flock desc; + desc.l_type = F_WRLCK; + desc.l_whence = SEEK_SET; + desc.l_start = 0; + desc.l_len = 0; + if(::fcntl(mOSFileHandle, F_SETLK, &desc) != 0) +#else + int errnoBlock = EWOULDBLOCK; if(::flock(mOSFileHandle, LOCK_EX | LOCK_NB) != 0) +#endif { // Lock was not obtained. - bool wasLocked = (errno == EWOULDBLOCK); + bool wasLocked = (errno == errnoBlock); // Close the file ::close(mOSFileHandle); mOSFileHandle = -1; @@ -376,7 +387,7 @@ void RaidFileWrite::TransformToRaidStorage() // Then open them all for writing (in strict order) try { -#ifdef PLATFORM_LINUX +#if defined(PLATFORM_open_USE_flock) || defined(PLATFORM_open_USE_fcntl) FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> stripe1(stripe1FilenameW.c_str()); FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> stripe2(stripe2FilenameW.c_str()); FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> parity(parityFilenameW.c_str()); @@ -448,11 +459,7 @@ void RaidFileWrite::TransformToRaidStorage() { // XOR in the size at the end of the parity block ASSERT(sizeof(RaidFileRead::FileSizeType) == (2*sizeof(unsigned int))); -#ifdef PLATFORM_LINUX ASSERT(sizeof(RaidFileRead::FileSizeType) >= sizeof(off_t)); -#else - ASSERT(sizeof(RaidFileRead::FileSizeType) == sizeof(off_t)); -#endif int sizePos = (blockSize/sizeof(unsigned int)) - 2; RaidFileRead::FileSizeType sw = hton64(writeFileStat.st_size); unsigned int *psize = (unsigned int *)(&sw); @@ -509,11 +516,7 @@ void RaidFileWrite::TransformToRaidStorage() // if it can't be worked out some other means -- size is required to rebuild the file if one of the stripe files is missing if(sizeRecordRequired) { -#ifdef PLATFORM_LINUX ASSERT(sizeof(writeFileStat.st_size) <= sizeof(RaidFileRead::FileSizeType)); -#else - ASSERT(sizeof(writeFileStat.st_size) == sizeof(RaidFileRead::FileSizeType)); -#endif RaidFileRead::FileSizeType sw = hton64(writeFileStat.st_size); ASSERT((::lseek(parity, 0, SEEK_CUR) % blockSize) == 0); if(::write(parity, &sw, sizeof(sw)) != sizeof(sw)) -- cgit v1.2.3