summaryrefslogtreecommitdiff
path: root/lib/raidfile
diff options
context:
space:
mode:
Diffstat (limited to 'lib/raidfile')
-rw-r--r--lib/raidfile/RaidFileController.cpp17
-rw-r--r--lib/raidfile/RaidFileRead.cpp8
-rw-r--r--lib/raidfile/RaidFileUtil.cpp58
-rw-r--r--lib/raidfile/RaidFileWrite.cpp11
4 files changed, 64 insertions, 30 deletions
diff --git a/lib/raidfile/RaidFileController.cpp b/lib/raidfile/RaidFileController.cpp
index 0cc2ede7..2cc6976b 100644
--- a/lib/raidfile/RaidFileController.cpp
+++ b/lib/raidfile/RaidFileController.cpp
@@ -70,11 +70,14 @@ void RaidFileController::Initialise(const std::string& rConfigFilename)
static const ConfigurationVerifyKey verifykeys[] =
{
- {"SetNumber", 0, ConfigTest_Exists | ConfigTest_IsInt, 0},
- {"BlockSize", 0, ConfigTest_Exists | ConfigTest_IsInt, 0},
- {"Dir0", 0, ConfigTest_Exists, 0},
- {"Dir1", 0, ConfigTest_Exists, 0},
- {"Dir2", 0, ConfigTest_Exists | ConfigTest_LastEntry, 0}
+ ConfigurationVerifyKey("SetNumber",
+ ConfigTest_Exists | ConfigTest_IsInt),
+ ConfigurationVerifyKey("BlockSize",
+ ConfigTest_Exists | ConfigTest_IsInt),
+ ConfigurationVerifyKey("Dir0", ConfigTest_Exists),
+ ConfigurationVerifyKey("Dir1", ConfigTest_Exists),
+ ConfigurationVerifyKey("Dir2",
+ ConfigTest_Exists | ConfigTest_LastEntry)
};
static const ConfigurationVerify subverify =
@@ -105,6 +108,10 @@ void RaidFileController::Initialise(const std::string& rConfigFilename)
BOX_ERROR("RaidFile configuration file errors: " << err);
THROW_EXCEPTION(RaidFileException, BadConfigFile)
}
+
+ // Allow reinitializing the controller by remove any existing
+ // disc sets. Used by Boxi unit tests.
+ mSetList.clear();
// Use the values
int expectedSetNum = 0;
diff --git a/lib/raidfile/RaidFileRead.cpp b/lib/raidfile/RaidFileRead.cpp
index 187270f9..0a79be57 100644
--- a/lib/raidfile/RaidFileRead.cpp
+++ b/lib/raidfile/RaidFileRead.cpp
@@ -25,10 +25,11 @@
#include <dirent.h>
#endif
-#include <stdio.h>
-#include <string.h>
-#include <memory>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
#include <map>
+#include <memory>
#include "RaidFileRead.h"
#include "RaidFileException.h"
@@ -1021,6 +1022,7 @@ std::auto_ptr<RaidFileRead> RaidFileRead::Open(int SetNumber, const std::string
RaidFileUtil::ExistType existance = RaidFileUtil::RaidFileExists(rdiscSet, Filename, &startDisc, &existingFiles, pRevisionID);
if(existance == RaidFileUtil::NoFile)
{
+ BOX_ERROR("Expected raidfile " << Filename << " does not exist");
THROW_EXCEPTION(RaidFileException, RaidFileDoesntExist)
}
else if(existance == RaidFileUtil::NonRaid)
diff --git a/lib/raidfile/RaidFileUtil.cpp b/lib/raidfile/RaidFileUtil.cpp
index da23cef5..7c6299ec 100644
--- a/lib/raidfile/RaidFileUtil.cpp
+++ b/lib/raidfile/RaidFileUtil.cpp
@@ -22,17 +22,21 @@
// --------------------------------------------------------------------------
//
// Function
-// Name: RaidFileUtil::RaidFileExists(RaidFileDiscSet &, const std::string &)
-// Purpose: Check to see the state of a RaidFile on disc (doesn't look at contents,
-// just at existense of files)
+// Name: RaidFileUtil::RaidFileExists(RaidFileDiscSet &,
+// const std::string &, int *, int *, int64_t *)
+// Purpose: Check to see the state of a RaidFile on disc
+// (doesn't look at contents, just at existence of
+// files)
// Created: 2003/07/11
//
// --------------------------------------------------------------------------
-RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, const std::string &rFilename, int *pStartDisc, int *pExisitingFiles, int64_t *pRevisionID)
+RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet,
+ const std::string &rFilename, int *pStartDisc, int *pExistingFiles,
+ int64_t *pRevisionID)
{
- if(pExisitingFiles)
+ if(pExistingFiles)
{
- *pExisitingFiles = 0;
+ *pExistingFiles = 0;
}
// For stat call, although the results are not examined
@@ -53,11 +57,20 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet,
// Get unique ID
if(pRevisionID != 0)
{
- (*pRevisionID) = FileModificationTime(st);
-#ifndef HAVE_STRUCT_STAT_ST_MTIMESPEC
- // 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.
+ #ifdef WIN32
+ *pRevisionID = st.st_mtime;
+ #else
+ *pRevisionID = FileModificationTime(st);
+ #endif
+
+#ifdef BOX_RELEASE_BUILD
+ // The resolution of timestamps may be very
+ // low, e.g. 1 second. So add the size to it
+ // to give a bit more chance of it changing.
// TODO: Make this better.
+ // Disabled in debug mode, to simulate
+ // filesystem with 1-second timestamp
+ // resolution, e.g. MacOS X HFS, Linux.
(*pRevisionID) += st.st_size;
#endif
}
@@ -71,10 +84,10 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet,
int64_t revisionID = 0;
int setSize = rDiscSet.size();
int rfCount = 0;
-#ifndef HAVE_STRUCT_STAT_ST_MTIMESPEC
+
// TODO: replace this with better linux revision ID detection
int64_t revisionIDplus = 0;
-#endif
+
for(int f = 0; f < setSize; ++f)
{
std::string componentFile(RaidFileUtil::MakeRaidComponentName(rDiscSet, rFilename, (f + startDisc) % setSize));
@@ -83,25 +96,34 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet,
// Component file exists, add to count
rfCount++;
// Set flags for existance?
- if(pExisitingFiles)
+ if(pExistingFiles)
{
- (*pExisitingFiles) |= (1 << f);
+ (*pExistingFiles) |= (1 << f);
}
// Revision ID
if(pRevisionID != 0)
{
- int64_t rid = FileModificationTime(st);
+ #ifdef WIN32
+ int64_t rid = st.st_mtime;
+ #else
+ int64_t rid = FileModificationTime(st);
+ #endif
+
if(rid > revisionID) revisionID = rid;
-#ifndef HAVE_STRUCT_STAT_ST_MTIMESPEC
revisionIDplus += st.st_size;
-#endif
}
}
}
if(pRevisionID != 0)
{
(*pRevisionID) = revisionID;
-#ifndef HAVE_STRUCT_STAT_ST_MTIMESPEC
+#ifdef BOX_RELEASE_BUILD
+ // The resolution of timestamps may be very low, e.g.
+ // 1 second. So add the size to it to give a bit more
+ // chance of it changing.
+ // TODO: Make this better.
+ // Disabled in debug mode, to simulate filesystem with
+ // 1-second timestamp resolution, e.g. MacOS X HFS, Linux.
(*pRevisionID) += revisionIDplus;
#endif
}
diff --git a/lib/raidfile/RaidFileWrite.cpp b/lib/raidfile/RaidFileWrite.cpp
index 66ab81c8..efec43a2 100644
--- a/lib/raidfile/RaidFileWrite.cpp
+++ b/lib/raidfile/RaidFileWrite.cpp
@@ -96,7 +96,8 @@ void RaidFileWrite::Open(bool AllowOverwrite)
RaidFileUtil::ExistType existance = RaidFileUtil::RaidFileExists(rdiscSet, mFilename);
if(existance != RaidFileUtil::NoFile)
{
- TRACE2("Trying to overwrite raidfile %d %s\n", mSetNumber, mFilename.c_str());
+ BOX_ERROR("Attempted to overwrite raidfile " <<
+ mSetNumber << " " << mFilename);
THROW_EXCEPTION(RaidFileException, CannotOverwriteExistingFile)
}
}
@@ -178,7 +179,8 @@ void RaidFileWrite::Write(const void *pBuffer, int Length)
int written = ::write(mOSFileHandle, pBuffer, Length);
if(written != Length)
{
- TRACE3("RaidFileWrite::Write: Write failure, Length = %d, written = %d, errno = %d\n", Length, written, errno);
+ BOX_LOG_SYS_ERROR("RaidFileWrite failed, Length = " <<
+ Length << ", written = " << written);
THROW_EXCEPTION(RaidFileException, OSError)
}
}
@@ -272,6 +274,7 @@ void RaidFileWrite::Commit(bool ConvertToRaidNow)
if(::unlink(renameTo.c_str()) != 0 &&
GetLastError() != ERROR_FILE_NOT_FOUND)
{
+ BOX_LOG_WIN_ERROR("failed to delete file: " << renameTo);
THROW_EXCEPTION(RaidFileException, OSError)
}
#endif
@@ -387,7 +390,7 @@ void RaidFileWrite::TransformToRaidStorage()
// // DEBUG MODE -- check file system size block size is same as block size for files
// // doesn't really apply, as space benefits of using fragment size are worth efficiency,
// // and anyway, it'll be buffered eventually so it won't matter.
-// #ifndef NDEBUG
+// #ifndef BOX_RELEASE_BUILD
// {
// if(writeFileStat.st_blksize != blockSize)
// {
@@ -779,7 +782,7 @@ int RaidFileWrite::Read(void *pBuffer, int NBytes, int Timeout)
// --------------------------------------------------------------------------
void RaidFileWrite::Close()
{
- TRACE0("Warning: RaidFileWrite::Close() called, discarding file\n");
+ BOX_WARNING("RaidFileWrite::Close() called, discarding file");
if(mOSFileHandle != -1)
{
Discard();