summaryrefslogtreecommitdiff
path: root/lib/raidfile
diff options
context:
space:
mode:
authorMartin Ebourne <martin@ebourne.me.uk>2005-11-30 23:14:40 +0000
committerMartin Ebourne <martin@ebourne.me.uk>2005-11-30 23:14:40 +0000
commit01ca97865fa9d6ed1a967e970927265f1c348289 (patch)
tree5e7e1f70b38b156994c3802ba3e77fbf288fe937 /lib/raidfile
parent99f8ce096bc5569adbfea1911dbcda24c28d8d8b (diff)
Merged martin/solaris at r9 to trunk
Diffstat (limited to 'lib/raidfile')
-rwxr-xr-xlib/raidfile/RaidFileRead.cpp30
-rwxr-xr-xlib/raidfile/RaidFileUtil.cpp8
-rwxr-xr-xlib/raidfile/RaidFileWrite.cpp23
3 files changed, 34 insertions, 27 deletions
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))