Changeset 2179

Show
Ignore:
Timestamp:
28/05/2008 15:37:13 (22 months ago)
Author:
chris
Message:

Catch exception on reading a directory that doesn't exist, and return a
protocol error message instead.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • box/trunk/bin/bbstored/BackupCommands.cpp

    r1783 r2179  
    1414 
    1515#include "autogen_BackupProtocolServer.h" 
     16#include "autogen_RaidFileException.h" 
    1617#include "BackupConstants.h" 
    1718#include "BackupContext.h" 
    18 #include "CollectInBufferStream.h" 
     19#include "BackupStoreConstants.h" 
    1920#include "BackupStoreDirectory.h" 
    2021#include "BackupStoreException.h" 
    2122#include "BackupStoreFile.h" 
    22 #include "StreamableMemBlock.h" 
    23 #include "BackupStoreConstants.h" 
    24 #include "RaidFileController.h" 
    2523#include "BackupStoreInfo.h" 
    26 #include "RaidFileController.h" 
     24#include "BufferedStream.h" 
     25#include "CollectInBufferStream.h" 
    2726#include "FileStream.h" 
    2827#include "InvisibleTempFileStream.h" 
    29 #include "BufferedStream.h" 
     28#include "RaidFileController.h" 
     29#include "StreamableMemBlock.h" 
    3030 
    3131#include "MemLeakFindOn.h" 
     
    182182        CHECK_PHASE(Phase_Commands) 
    183183 
    184         // Ask the context for a directory 
    185         const BackupStoreDirectory &rdir(rContext.GetDirectory(mObjectID)); 
    186          
    187184        // Store the listing to a stream 
    188185        std::auto_ptr<CollectInBufferStream> stream(new CollectInBufferStream); 
    189         rdir.WriteToStream(*stream, mFlagsMustBeSet, mFlagsNotToBeSet, mSendAttributes, 
    190                 false /* never send dependency info to the client */); 
     186 
     187        try 
     188        { 
     189                // Ask the context for a directory 
     190                const BackupStoreDirectory &rdir( 
     191                        rContext.GetDirectory(mObjectID)); 
     192                rdir.WriteToStream(*stream, mFlagsMustBeSet,  
     193                        mFlagsNotToBeSet, mSendAttributes, 
     194                        false /* never send dependency info to the client */); 
     195        } 
     196        catch (RaidFileException &e) 
     197        { 
     198                if (e.GetSubType() == RaidFileException::RaidFileDoesntExist) 
     199                { 
     200                        return std::auto_ptr<ProtocolObject>( 
     201                                new BackupProtocolServerError( 
     202                                        BackupProtocolServerError::ErrorType, 
     203                                        BackupProtocolServerError::Err_DoesNotExist)); 
     204                } 
     205                throw; 
     206        } 
     207 
    191208        stream->SetForReading(); 
    192209         
     
    194211        rProtocol.SendStreamAfterCommand(stream.release()); 
    195212 
    196         return std::auto_ptr<ProtocolObject>(new BackupProtocolServerSuccess(mObjectID)); 
     213        return std::auto_ptr<ProtocolObject>( 
     214                new BackupProtocolServerSuccess(mObjectID)); 
    197215} 
    198216