[Box Backup-dev] COMMIT r896 - box/chris/merge/lib/raidfile
Ben Summers
boxbackup-dev at fluffy.co.uk
Fri Sep 1 09:15:24 BST 2006
On 31 Aug 2006, at 23:50, subversion at fluffy.co.uk wrote:
> Author: chris
> Date: 2006-08-31 23:50:02 +0100 (Thu, 31 Aug 2006)
> New Revision: 896
>
> Modified:
> box/chris/merge/lib/raidfile/RaidFileWrite.cpp
> Log:
> (refs #3)
>
> Open files in binary mode (Win32)
Can that go in the base classes instead? I can't think of any reason
why we'd want to open a file in anything other than binary mode.
>
> Disable the lock failure block when we don't have any locking
> mechanism
Win32 does have locks! Why not add an emulated flock() for Win32?
>
> Close and delete files before renaming over them on Win32. This breaks
> Ben's desired recovery semantics, so it's not done on other platforms,
> but Win32 requires it.
When something bad is done on Win32 which shouldn't be done on more
capable platforms, please comment so noone goes "oh, that #ifdef is
redundant, I'll remove it" or something.
Ben
>
>
> Modified: box/chris/merge/lib/raidfile/RaidFileWrite.cpp
> ===================================================================
> --- box/chris/merge/lib/raidfile/RaidFileWrite.cpp 2006-08-31
> 22:44:18 UTC (rev 895)
> +++ box/chris/merge/lib/raidfile/RaidFileWrite.cpp 2006-08-31
> 22:50:02 UTC (rev 896)
> @@ -104,7 +104,8 @@
> writeFilename += 'X';
>
> // Attempt to open
> - mOSFileHandle = ::open(writeFilename.c_str(), O_WRONLY | O_CREAT,
> + mOSFileHandle = ::open(writeFilename.c_str(),
> + O_WRONLY | O_CREAT | O_BINARY,
> S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
> if(mOSFileHandle == -1)
> {
> @@ -115,7 +116,7 @@
> #ifdef HAVE_FLOCK
> int errnoBlock = EWOULDBLOCK;
> if(::flock(mOSFileHandle, LOCK_EX | LOCK_NB) != 0)
> -#else
> +#elif HAVE_DECL_F_SETLK
> int errnoBlock = EAGAIN;
> struct flock desc;
> desc.l_type = F_WRLCK;
> @@ -123,6 +124,9 @@
> desc.l_start = 0;
> desc.l_len = 0;
> if(::fcntl(mOSFileHandle, F_SETLK, &desc) != 0)
> +#else
> + int errnoBlock = ENOSYS;
> + if (0)
> #endif
> {
> // Lock was not obtained.
> @@ -242,23 +246,46 @@
> }
>
> // Rename it into place -- BEFORE it's closed so lock remains
> +
> +#ifdef WIN32
> + // Except on Win32 which doesn't allow renaming open files
> + // Close file...
> + if(::close(mOSFileHandle) != 0)
> + {
> + THROW_EXCEPTION(RaidFileException, OSError)
> + }
> + mOSFileHandle = -1;
> +#endif // WIN32
> +
> RaidFileController &rcontroller(RaidFileController::GetController
> ());
> RaidFileDiscSet rdiscSet(rcontroller.GetDiscSet(mSetNumber));
> // Get the filename for the write file
> std::string renameTo(RaidFileUtil::MakeWriteFileName(rdiscSet,
> mFilename));
> // And the current name
> std::string renameFrom(renameTo + 'X');
> +
> +#ifdef WIN32
> + // need to delete the target first
> + if(::unlink(renameTo.c_str()) != 0 &&
> + GetLastError() != ERROR_FILE_NOT_FOUND)
> + {
> + THROW_EXCEPTION(RaidFileException, OSError)
> + }
> +#endif
> +
> if(::rename(renameFrom.c_str(), renameTo.c_str()) != 0)
> {
> THROW_EXCEPTION(RaidFileException, OSError)
> }
>
> +#ifndef WIN32
> // Close file...
> if(::close(mOSFileHandle) != 0)
> {
> THROW_EXCEPTION(RaidFileException, OSError)
> }
> mOSFileHandle = -1;
> +#endif // !WIN32
>
> // Raid it?
> if(ConvertToRaidNow)
> @@ -292,8 +319,15 @@
> writeFilename += 'X';
>
> // Unlink and close it
> - if((::unlink(writeFilename.c_str()) != 0)
> - || (::close(mOSFileHandle) != 0))
> +
> +#ifdef WIN32
> + // On Win32 we must close it first
> + if (::close(mOSFileHandle) != 0 ||
> + ::unlink(writeFilename.c_str()) != 0)
> +#else // !WIN32
> + if (::unlink(writeFilename.c_str()) != 0 ||
> + ::close(mOSFileHandle) != 0)
> +#endif // !WIN32
> {
> THROW_EXCEPTION(RaidFileException, OSError)
> }
> @@ -388,13 +422,13 @@
> try
> {
> #if HAVE_DECL_O_EXLOCK
> - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK)> stripe1
> (stripe1FilenameW.c_str());
> - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK)> stripe2
> (stripe2FilenameW.c_str());
> - FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK)> parity
> (parityFilenameW.c_str());
> + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK |
> O_BINARY)> stripe1(stripe1FilenameW.c_str());
> + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK |
> O_BINARY)> stripe2(stripe2FilenameW.c_str());
> + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK |
> O_BINARY)> parity(parityFilenameW.c_str());
> #else
> - 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());
> + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_BINARY)> stripe1
> (stripe1FilenameW.c_str());
> + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_BINARY)> stripe2
> (stripe2FilenameW.c_str());
> + FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL | O_BINARY)> parity
> (parityFilenameW.c_str());
> #endif
>
> // Then... read in data...
> @@ -530,6 +564,22 @@
> parity.Close();
> stripe2.Close();
> stripe1.Close();
> +
> +#ifdef WIN32
> + // Must delete before renaming
> + if (::unlink(stripe1Filename.c_str()) != 0 && errno != ENOENT)
> + {
> + THROW_EXCEPTION(RaidFileException, OSError);
> + }
> + if (::unlink(stripe2Filename.c_str()) != 0 && errno != ENOENT)
> + {
> + THROW_EXCEPTION(RaidFileException, OSError);
> + }
> + if (::unlink(parityFilename.c_str()) != 0 && errno != ENOENT)
> + {
> + THROW_EXCEPTION(RaidFileException, OSError);
> + }
> +#endif
>
> // Rename them into place
> if(::rename(stripe1FilenameW.c_str(), stripe1Filename.c_str()) != 0
>
> _______________________________________________
> Boxbackup-dev mailing list
> Boxbackup-dev at fluffy.co.uk
> http://lists.warhead.org.uk/mailman/listinfo/boxbackup-dev
More information about the Boxbackup-dev
mailing list