[Box Backup-commit] COMMIT r2728 - in box/trunk: bin/bbstored lib/common lib/raidfile

subversion at boxbackup.org subversion at boxbackup.org
Mon Sep 13 18:58:19 BST 2010


Author: chris
Date: 2010-09-13 18:58:18 +0100 (Mon, 13 Sep 2010)
New Revision: 2728

Added:
   box/trunk/lib/common/BufferedWriteStream.cpp
   box/trunk/lib/common/BufferedWriteStream.h
Modified:
   box/trunk/bin/bbstored/BackupStoreContext.cpp
   box/trunk/lib/common/BufferedStream.cpp
   box/trunk/lib/common/BufferedStream.h
   box/trunk/lib/raidfile/RaidFileWrite.cpp
Log:
Implement write buffering on directories.


Modified: box/trunk/bin/bbstored/BackupStoreContext.cpp
===================================================================
--- box/trunk/bin/bbstored/BackupStoreContext.cpp	2010-08-31 13:59:29 UTC (rev 2727)
+++ box/trunk/bin/bbstored/BackupStoreContext.cpp	2010-09-13 17:58:18 UTC (rev 2728)
@@ -11,21 +11,22 @@
 
 #include <stdio.h>
 
+#include "BackupConstants.h"
 #include "BackupStoreContext.h"
-#include "RaidFileWrite.h"
-#include "RaidFileRead.h"
+#include "BackupStoreDaemon.h"
 #include "BackupStoreDirectory.h"
 #include "BackupStoreException.h"
+#include "BackupStoreFile.h"
 #include "BackupStoreInfo.h"
-#include "BackupConstants.h"
-#include "BackupStoreFile.h"
 #include "BackupStoreObjectMagic.h"
-#include "StoreStructure.h"
-#include "BackupStoreDaemon.h"
-#include "RaidFileController.h"
+#include "BufferedStream.h"
+#include "BufferedWriteStream.h"
 #include "FileStream.h"
 #include "InvisibleTempFileStream.h"
-#include "BufferedStream.h"
+#include "RaidFileController.h"
+#include "RaidFileRead.h"
+#include "RaidFileWrite.h"
+#include "StoreStructure.h"
 
 #include "MemLeakFindOn.h"
 
@@ -942,8 +943,11 @@
 		{
 			RaidFileWrite writeDir(mStoreDiscSet, dirfn);
 			writeDir.Open(true /* allow overwriting */);
-			rDir.WriteToStream(writeDir);
 
+			BufferedWriteStream buffer(writeDir);
+			rDir.WriteToStream(buffer);
+			buffer.Flush();
+
 			// get the disc usage (must do this before commiting it)
 			int64_t dirSize = writeDir.GetDiscUsageInBlocks();
 

Modified: box/trunk/lib/common/BufferedStream.cpp
===================================================================
--- box/trunk/lib/common/BufferedStream.cpp	2010-08-31 13:59:29 UTC (rev 2727)
+++ box/trunk/lib/common/BufferedStream.cpp	2010-09-13 17:58:18 UTC (rev 2728)
@@ -2,7 +2,7 @@
 //
 // File
 //		Name:    BufferedStream.cpp
-//		Purpose: Buffering wrapper around IOStreams
+//		Purpose: Buffering read-only wrapper around IOStreams
 //		Created: 2007/01/16
 //
 // --------------------------------------------------------------------------

Modified: box/trunk/lib/common/BufferedStream.h
===================================================================
--- box/trunk/lib/common/BufferedStream.h	2010-08-31 13:59:29 UTC (rev 2727)
+++ box/trunk/lib/common/BufferedStream.h	2010-09-13 17:58:18 UTC (rev 2728)
@@ -2,7 +2,7 @@
 //
 // File
 //		Name:    BufferedStream.h
-//		Purpose: Buffering wrapper around IOStreams
+//		Purpose: Buffering read-only wrapper around IOStreams
 //		Created: 2007/01/16
 //
 // --------------------------------------------------------------------------

Copied: box/trunk/lib/common/BufferedWriteStream.cpp (from rev 2727, box/trunk/lib/common/BufferedStream.cpp)
===================================================================
--- box/trunk/lib/common/BufferedWriteStream.cpp	                        (rev 0)
+++ box/trunk/lib/common/BufferedWriteStream.cpp	2010-09-13 17:58:18 UTC (rev 2728)
@@ -0,0 +1,181 @@
+// --------------------------------------------------------------------------
+//
+// File
+//		Name:    BufferedWriteStream.cpp
+//		Purpose: Buffering write-only wrapper around IOStreams
+//		Created: 2010/09/13
+//
+// --------------------------------------------------------------------------
+
+#include "Box.h"
+#include "BufferedWriteStream.h"
+#include "CommonException.h"
+
+#include <string.h>
+
+#include "MemLeakFindOn.h"
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::BufferedWriteStream(const char *, int, int)
+//		Purpose: Constructor, set up buffer
+//		Created: 2007/01/16
+//
+// --------------------------------------------------------------------------
+BufferedWriteStream::BufferedWriteStream(IOStream& rSink)
+: mrSink(rSink), mBufferPosition(0)
+{ }
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::Read(void *, int)
+//		Purpose: Reads bytes from the file - throws exception
+//		Created: 2007/01/16
+//
+// --------------------------------------------------------------------------
+int BufferedWriteStream::Read(void *pBuffer, int NBytes, int Timeout)
+{
+	THROW_EXCEPTION(CommonException, NotSupported);
+}
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::BytesLeftToRead()
+//		Purpose: Returns number of bytes to read (may not be most efficient function ever)
+//		Created: 2007/01/16
+//
+// --------------------------------------------------------------------------
+IOStream::pos_type BufferedWriteStream::BytesLeftToRead()
+{
+	THROW_EXCEPTION(CommonException, NotSupported);
+}
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::Write(void *, int)
+//		Purpose: Writes bytes to the underlying stream (not supported)
+//		Created: 2003/07/31
+//
+// --------------------------------------------------------------------------
+void BufferedWriteStream::Write(const void *pBuffer, int NBytes)
+{
+	int numBytesRemain = NBytes;
+
+	do
+	{
+		int maxWritable = sizeof(mBuffer) - mBufferPosition;
+		int numBytesToWrite = (NBytes < maxWritable) ? NBytes :
+			maxWritable;
+
+		if(numBytesToWrite > 0)
+		{
+			memcpy(mBuffer + mBufferPosition, pBuffer,
+				numBytesToWrite);
+			mBufferPosition += numBytesToWrite;
+			pBuffer = ((const char *)pBuffer) + numBytesToWrite;
+			numBytesRemain -= numBytesToWrite;
+		}
+
+		if(numBytesRemain > 0)
+		{
+			Flush();
+		}
+	}
+	while(numBytesRemain > 0);
+}
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::GetPosition()
+//		Purpose: Get position in stream
+//		Created: 2003/08/21
+//
+// --------------------------------------------------------------------------
+IOStream::pos_type BufferedWriteStream::GetPosition() const
+{
+	return mrSink.GetPosition() + mBufferPosition;
+}
+
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::Seek(pos_type, int)
+//		Purpose: Seeks within file, as lseek, invalidate buffer
+//		Created: 2003/07/31
+//
+// --------------------------------------------------------------------------
+void BufferedWriteStream::Seek(IOStream::pos_type Offset, int SeekType)
+{
+	// Always flush the buffer before seeking
+	Flush();
+
+	mrSink.Seek(Offset, SeekType);
+}
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::Flush();
+//		Purpose: Write out current buffer contents and invalidate
+//		Created: 2010/09/13
+//
+// --------------------------------------------------------------------------
+void BufferedWriteStream::Flush(int Timeout)
+{
+	if(mBufferPosition > 0)
+	{
+		mrSink.Write(mBuffer, mBufferPosition);
+	}
+
+	mBufferPosition = 0;
+}
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::Close()
+//		Purpose: Closes the underlying stream (not needed)
+//		Created: 2003/07/31
+//
+// --------------------------------------------------------------------------
+void BufferedWriteStream::Close()
+{
+	Flush();
+	mrSink.Close();
+}
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::StreamDataLeft()
+//		Purpose: Any data left to write?
+//		Created: 2003/08/02
+//
+// --------------------------------------------------------------------------
+bool BufferedWriteStream::StreamDataLeft()
+{
+	THROW_EXCEPTION(CommonException, NotSupported);
+}
+
+// --------------------------------------------------------------------------
+//
+// Function
+//		Name:    BufferedWriteStream::StreamClosed()
+//		Purpose: Is the stream closed?
+//		Created: 2003/08/02
+//
+// --------------------------------------------------------------------------
+bool BufferedWriteStream::StreamClosed()
+{
+	return mrSink.StreamClosed();
+}
+

Copied: box/trunk/lib/common/BufferedWriteStream.h (from rev 2727, box/trunk/lib/common/BufferedStream.h)
===================================================================
--- box/trunk/lib/common/BufferedWriteStream.h	                        (rev 0)
+++ box/trunk/lib/common/BufferedWriteStream.h	2010-09-13 17:58:18 UTC (rev 2728)
@@ -0,0 +1,44 @@
+// --------------------------------------------------------------------------
+//
+// File
+//		Name:    BufferedWriteStream.h
+//		Purpose: Buffering write-only wrapper around IOStreams
+//		Created: 2010/09/13
+//
+// --------------------------------------------------------------------------
+
+#ifndef BUFFEREDWRITESTREAM__H
+#define BUFFEREDWRITESTREAM__H
+
+#include "IOStream.h"
+
+class BufferedWriteStream : public IOStream
+{
+private:
+	IOStream& mrSink;
+	char mBuffer[4096];
+	int  mBufferPosition;
+
+public:
+	BufferedWriteStream(IOStream& rSource);
+	virtual ~BufferedWriteStream() { Close(); }
+	
+	virtual int Read(void *pBuffer, int NBytes, int Timeout = IOStream::TimeOutInfinite);
+	virtual pos_type BytesLeftToRead();
+	virtual void Write(const void *pBuffer, int NBytes);
+	virtual pos_type GetPosition() const;
+	virtual void Seek(IOStream::pos_type Offset, int SeekType);
+	virtual void Flush(int Timeout = IOStream::TimeOutInfinite);
+	virtual void Close();
+	
+	virtual bool StreamDataLeft();
+	virtual bool StreamClosed();
+
+private:
+	BufferedWriteStream(const BufferedWriteStream &rToCopy) 
+	: mrSink(rToCopy.mrSink) { /* do not call */ }
+};
+
+#endif // BUFFEREDWRITESTREAM__H
+
+

Modified: box/trunk/lib/raidfile/RaidFileWrite.cpp
===================================================================
--- box/trunk/lib/raidfile/RaidFileWrite.cpp	2010-08-31 13:59:29 UTC (rev 2727)
+++ box/trunk/lib/raidfile/RaidFileWrite.cpp	2010-09-13 17:58:18 UTC (rev 2728)
@@ -836,9 +836,9 @@
 // --------------------------------------------------------------------------
 void RaidFileWrite::Close()
 {
-	BOX_WARNING("RaidFileWrite::Close() called, discarding file");
 	if(mOSFileHandle != -1)
 	{
+		BOX_WARNING("RaidFileWrite::Close() called, discarding file");
 		Discard();
 	}
 }




More information about the Boxbackup-commit mailing list