diff options
Diffstat (limited to 'bin/bbackupd/BackupClientContext.cpp')
-rw-r--r-- | bin/bbackupd/BackupClientContext.cpp | 171 |
1 files changed, 85 insertions, 86 deletions
diff --git a/bin/bbackupd/BackupClientContext.cpp b/bin/bbackupd/BackupClientContext.cpp index 6b51b9e8..26df04be 100644 --- a/bin/bbackupd/BackupClientContext.cpp +++ b/bin/bbackupd/BackupClientContext.cpp @@ -25,9 +25,10 @@ #include "BackupStoreConstants.h" #include "BackupStoreException.h" #include "BackupDaemon.h" -#include "autogen_BackupProtocolClient.h" +#include "autogen_BackupProtocol.h" #include "BackupStoreFile.h" #include "Logging.h" +#include "TcpNice.h" #include "MemLeakFindOn.h" @@ -49,29 +50,30 @@ BackupClientContext::BackupClientContext bool ExtendedLogging, bool ExtendedLogToFile, std::string ExtendedLogFile, - ProgressNotifier& rProgressNotifier + ProgressNotifier& rProgressNotifier, + bool TcpNiceMode ) - : mrResolver(rResolver), - mrTLSContext(rTLSContext), - mHostname(rHostname), - mPort(Port), - mAccountNumber(AccountNumber), - mpSocket(0), - mpConnection(0), - mExtendedLogging(ExtendedLogging), - mExtendedLogToFile(ExtendedLogToFile), - mExtendedLogFile(ExtendedLogFile), - mpExtendedLogFileHandle(NULL), - mClientStoreMarker(ClientStoreMarker_NotKnown), - mpDeleteList(0), - mpCurrentIDMap(0), - mpNewIDMap(0), - mStorageLimitExceeded(false), - mpExcludeFiles(0), - mpExcludeDirs(0), - mKeepAliveTimer(0, "KeepAliveTime"), - mbIsManaged(false), - mrProgressNotifier(rProgressNotifier) +: mExperimentalSnapshotMode(false), + mrResolver(rResolver), + mrTLSContext(rTLSContext), + mHostname(rHostname), + mPort(Port), + mAccountNumber(AccountNumber), + mExtendedLogging(ExtendedLogging), + mExtendedLogToFile(ExtendedLogToFile), + mExtendedLogFile(ExtendedLogFile), + mpExtendedLogFileHandle(NULL), + mClientStoreMarker(ClientStoreMarker_NotKnown), + mpDeleteList(0), + mpCurrentIDMap(0), + mpNewIDMap(0), + mStorageLimitExceeded(false), + mpExcludeFiles(0), + mpExcludeDirs(0), + mKeepAliveTimer(0, "KeepAliveTime"), + mbIsManaged(false), + mrProgressNotifier(rProgressNotifier), + mTcpNiceMode(TcpNiceMode) { } @@ -107,40 +109,44 @@ BackupClientContext::~BackupClientContext() BackupProtocolClient &BackupClientContext::GetConnection() { // Already got it? Just return it. - if(mpConnection != 0) + if(mapConnection.get()) { - return *mpConnection; + return *mapConnection; } - // Get a socket connection - if(mpSocket == 0) - { - mpSocket = new SocketStreamTLS; - ASSERT(mpSocket != 0); // will have exceptioned if this was a problem - } + // there shouldn't be a connection open + ASSERT(mapSocket.get() == 0); + // Defensive. Must close connection before releasing any old socket. + mapConnection.reset(); + mapSocket.reset(new SocketStreamTLS); try { // Defensive. - if(mpConnection != 0) - { - delete mpConnection; - mpConnection = 0; - } + mapConnection.reset(); // Log intention BOX_INFO("Opening connection to server '" << mHostname << "'..."); // Connect! - mpSocket->Open(mrTLSContext, Socket::TypeINET, - mHostname.c_str(), mPort); + ((SocketStreamTLS *)(mapSocket.get()))->Open(mrTLSContext, + Socket::TypeINET, mHostname, mPort); - // And create a procotol object - mpConnection = new BackupProtocolClient(*mpSocket); + if(mTcpNiceMode) + { + // Pass control of mapSocket to NiceSocketStream, + // which will take care of destroying it for us. + mapNice.reset(new NiceSocketStream(mapSocket)); + mapConnection.reset(new BackupProtocolClient(*mapNice)); + } + else + { + mapConnection.reset(new BackupProtocolClient(*mapSocket)); + } // Set logging option - mpConnection->SetLogToSysLog(mExtendedLogging); + mapConnection->SetLogToSysLog(mExtendedLogging); if (mExtendedLogToFile) { @@ -156,16 +162,17 @@ BackupProtocolClient &BackupClientContext::GetConnection() } else { - mpConnection->SetLogToFile(mpExtendedLogFileHandle); + mapConnection->SetLogToFile(mpExtendedLogFileHandle); } } // Handshake - mpConnection->Handshake(); + mapConnection->Handshake(); // Check the version of the server { - std::auto_ptr<BackupProtocolClientVersion> serverVersion(mpConnection->QueryVersion(BACKUP_STORE_SERVER_VERSION)); + std::auto_ptr<BackupProtocolVersion> serverVersion( + mapConnection->QueryVersion(BACKUP_STORE_SERVER_VERSION)); if(serverVersion->GetVersion() != BACKUP_STORE_SERVER_VERSION) { THROW_EXCEPTION(BackupStoreException, WrongServerVersion) @@ -173,7 +180,8 @@ BackupProtocolClient &BackupClientContext::GetConnection() } // Login -- if this fails, the Protocol will exception - std::auto_ptr<BackupProtocolClientLoginConfirmed> loginConf(mpConnection->QueryLogin(mAccountNumber, 0 /* read/write */)); + std::auto_ptr<BackupProtocolLoginConfirmed> loginConf( + mapConnection->QueryLogin(mAccountNumber, 0 /* read/write */)); // Check that the client store marker is the one we expect if(mClientStoreMarker != ClientStoreMarker_NotKnown) @@ -183,9 +191,9 @@ BackupProtocolClient &BackupClientContext::GetConnection() // Not good... finish the connection, abort, etc, ignoring errors try { - mpConnection->QueryFinished(); - mpSocket->Shutdown(); - mpSocket->Close(); + mapConnection->QueryFinished(); + mapNice.reset(); + mapSocket.reset(); } catch(...) { @@ -213,14 +221,13 @@ BackupProtocolClient &BackupClientContext::GetConnection() catch(...) { // Clean up. - delete mpConnection; - mpConnection = 0; - delete mpSocket; - mpSocket = 0; + mapConnection.reset(); + mapNice.reset(); + mapSocket.reset(); throw; } - return *mpConnection; + return *mapConnection; } // -------------------------------------------------------------------------- @@ -233,7 +240,7 @@ BackupProtocolClient &BackupClientContext::GetConnection() // -------------------------------------------------------------------------- void BackupClientContext::CloseAnyOpenConnection() { - if(mpConnection) + if(mapConnection.get()) { try { @@ -244,14 +251,14 @@ void BackupClientContext::CloseAnyOpenConnection() box_time_t marker = GetCurrentBoxTime(); // Set it on the store - mpConnection->QuerySetClientStoreMarker(marker); + mapConnection->QuerySetClientStoreMarker(marker); // Record it so that it can be picked up later. mClientStoreMarker = marker; } // Quit nicely - mpConnection->QueryFinished(); + mapConnection->QueryFinished(); } catch(...) { @@ -259,26 +266,18 @@ void BackupClientContext::CloseAnyOpenConnection() } // Delete it anyway. - delete mpConnection; - mpConnection = 0; + mapConnection.reset(); } - - if(mpSocket) + + try { - try - { - // Be nice about closing the socket - mpSocket->Shutdown(); - mpSocket->Close(); - } - catch(...) - { - // Ignore errors - } - - // Delete object - delete mpSocket; - mpSocket = 0; + // Be nice about closing the socket + mapNice.reset(); + mapSocket.reset(); + } + catch(...) + { + // Ignore errors } // Delete any pending list @@ -307,9 +306,9 @@ void BackupClientContext::CloseAnyOpenConnection() // -------------------------------------------------------------------------- int BackupClientContext::GetTimeout() const { - if(mpConnection) + if(mapConnection.get()) { - return mpConnection->GetTimeout(); + return mapConnection->GetTimeout(); } return (15*60*1000); @@ -419,20 +418,20 @@ bool BackupClientContext::FindFilename(int64_t ObjectID, int64_t ContainingDirec // Request filenames from the server, in a "safe" manner to ignore errors properly { - BackupProtocolClientGetObjectName send(ObjectID, ContainingDirectory); + BackupProtocolGetObjectName send(ObjectID, ContainingDirectory); connection.Send(send); } - std::auto_ptr<BackupProtocolObjectCl> preply(connection.Receive()); + std::auto_ptr<BackupProtocolMessage> preply(connection.Receive()); // Is it of the right type? - if(preply->GetType() != BackupProtocolClientObjectName::TypeID) + if(preply->GetType() != BackupProtocolObjectName::TypeID) { // Was an error or something return false; } // Cast to expected type. - BackupProtocolClientObjectName *names = (BackupProtocolClientObjectName *)(preply.get()); + BackupProtocolObjectName *names = (BackupProtocolObjectName *)(preply.get()); // Anything found? int32_t numElements = names->GetNumNameElements(); @@ -482,10 +481,10 @@ bool BackupClientContext::FindFilename(int64_t ObjectID, int64_t ContainingDirec } // Is it a directory? - rIsDirectoryOut = ((names->GetFlags() & BackupProtocolClientListDirectory::Flags_Dir) == BackupProtocolClientListDirectory::Flags_Dir); + rIsDirectoryOut = ((names->GetFlags() & BackupProtocolListDirectory::Flags_Dir) == BackupProtocolListDirectory::Flags_Dir); // Is it the current version? - rIsCurrentVersionOut = ((names->GetFlags() & (BackupProtocolClientListDirectory::Flags_OldVersion | BackupProtocolClientListDirectory::Flags_Deleted)) == 0); + rIsCurrentVersionOut = ((names->GetFlags() & (BackupProtocolListDirectory::Flags_OldVersion | BackupProtocolListDirectory::Flags_Deleted)) == 0); // And other information which may be required if(pModTimeOnServer) *pModTimeOnServer = names->GetModificationTime(); @@ -509,7 +508,7 @@ void BackupClientContext::SetKeepAliveTime(int iSeconds) { mKeepAliveTime = iSeconds < 0 ? 0 : iSeconds; BOX_TRACE("Set keep-alive time to " << mKeepAliveTime << " seconds"); - mKeepAliveTimer = Timer(mKeepAliveTime, "KeepAliveTime"); + mKeepAliveTimer.Reset(mKeepAliveTime * MILLI_SEC_IN_SEC); } // -------------------------------------------------------------------------- @@ -551,7 +550,7 @@ void BackupClientContext::UnManageDiffProcess() // -------------------------------------------------------------------------- void BackupClientContext::DoKeepAlive() { - if (!mpConnection) + if (!mapConnection.get()) { return; } @@ -567,9 +566,9 @@ void BackupClientContext::DoKeepAlive() } BOX_TRACE("KeepAliveTime reached, sending keep-alive message"); - mpConnection->QueryGetIsAlive(); + mapConnection->QueryGetIsAlive(); - mKeepAliveTimer = Timer(mKeepAliveTime, "KeepAliveTime"); + mKeepAliveTimer.Reset(mKeepAliveTime * MILLI_SEC_IN_SEC); } int BackupClientContext::GetMaximumDiffingTime() |