[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