int64_t run_housekeeping(BackupStoreAccountDatabase::Entry& rAccount) { std::string rootDir = BackupStoreAccounts::GetAccountRoot(rAccount); int discSet = rAccount.GetDiscSet(); // Do housekeeping on this account HousekeepStoreAccount housekeeping(rAccount.GetID(), rootDir, discSet, NULL); housekeeping.DoHousekeeping(HousekeepStoreAccount::DefaultAction, true /* keep trying forever */); return housekeeping.GetErrorCount(); }
std::string BackupStoreRefCountDatabase::GetFilename(const BackupStoreAccountDatabase::Entry& rAccount, bool Temporary) { std::string RootDir = BackupStoreAccounts::GetAccountRoot(rAccount); ASSERT(RootDir[RootDir.size() - 1] == '/' || RootDir[RootDir.size() - 1] == DIRECTORY_SEPARATOR_ASCHAR); std::string fn(RootDir + REFCOUNT_FILENAME ".rdb"); if(Temporary) { fn += "X"; } RaidFileController &rcontroller(RaidFileController::GetController()); RaidFileDiscSet rdiscSet(rcontroller.GetDiscSet(rAccount.GetDiscSet())); return RaidFileUtil::MakeWriteFileName(rdiscSet, fn); }
// -------------------------------------------------------------------------- // // Function // Name: BackupStoreRefCountDatabase::Create(int32_t, // const std::string &, int, bool) // Purpose: Create a blank database, using a temporary file that // you must Discard() or Commit() to make permanent. // Created: 2003/08/28 // // -------------------------------------------------------------------------- std::auto_ptr<BackupStoreRefCountDatabase> BackupStoreRefCountDatabase::Create (const BackupStoreAccountDatabase::Entry& rAccount) { // Initial header refcount_StreamFormat hdr; hdr.mMagicValue = htonl(REFCOUNT_MAGIC_VALUE); hdr.mAccountID = htonl(rAccount.GetID()); std::string Filename = GetFilename(rAccount, true); // temporary // Open the file for writing if (FileExists(Filename)) { BOX_WARNING(BOX_FILE_MESSAGE(Filename, "Overwriting existing " "temporary reference count database")); if (unlink(Filename.c_str()) != 0) { THROW_SYS_FILE_ERROR("Failed to delete old temporary " "reference count database file", Filename, CommonException, OSFileError); } } int flags = O_CREAT | O_BINARY | O_RDWR | O_EXCL; std::auto_ptr<FileStream> DatabaseFile(new FileStream(Filename, flags)); // Write header DatabaseFile->Write(&hdr, sizeof(hdr)); // Make new object std::auto_ptr<BackupStoreRefCountDatabase> refcount( new BackupStoreRefCountDatabase(rAccount, false, true, DatabaseFile)); // The root directory must always have one reference for a database // to be valid, so set that now on the new database. This will leave // mIsModified set to true. refcount->SetRefCount(BACKUPSTORE_ROOT_DIRECTORY_ID, 1); // return it to caller return refcount; }
// -------------------------------------------------------------------------- // // Function // Name: BackupStoreRefCountDatabase::Load(int32_t AccountID, // BackupStoreAccountDatabase& rAccountDatabase, // bool ReadOnly); // Purpose: Loads the info from disc, given the root // information. Can be marked as read only. // Created: 2003/08/28 // // -------------------------------------------------------------------------- std::auto_ptr<BackupStoreRefCountDatabase> BackupStoreRefCountDatabase::Load( const BackupStoreAccountDatabase::Entry& rAccount, bool ReadOnly) { // Generate the filename. Cannot open a temporary database, so it must // be a permanent one. std::string Filename = GetFilename(rAccount, false); int flags = ReadOnly ? O_RDONLY : O_RDWR; // Open the file for read/write std::auto_ptr<FileStream> dbfile(new FileStream(Filename, flags | O_BINARY)); // Read in a header refcount_StreamFormat hdr; if(!dbfile->ReadFullBuffer(&hdr, sizeof(hdr), 0 /* not interested in bytes read if this fails */)) { THROW_FILE_ERROR("Failed to read refcount database: " "short read", Filename, BackupStoreException, CouldNotLoadStoreInfo); } // Check it if(ntohl(hdr.mMagicValue) != REFCOUNT_MAGIC_VALUE || (int32_t)ntohl(hdr.mAccountID) != rAccount.GetID()) { THROW_FILE_ERROR("Failed to read refcount database: " "bad magic number", Filename, BackupStoreException, BadStoreInfoOnLoad); } // Make new object std::auto_ptr<BackupStoreRefCountDatabase> refcount( new BackupStoreRefCountDatabase(rAccount, ReadOnly, false, dbfile)); // return it to caller return refcount; }