}
//_____________________________________________________________________________
-Bool_t AliCDBDump::PutEntry(AliCDBEntry* entry) {
+Bool_t AliCDBDump::PutEntry(AliCDBEntry* entry, const char* mirrors) {
// put an AliCDBEntry object into the database
TDirectory::TContext context(gDirectory, fFile);
return kFALSE;
}
+ TString mirrorsString(mirrors);
+ if(!mirrorsString.IsNull())
+ AliError("AliCDBDump storage cannot take mirrors into account.");
+
AliCDBId& id = entry->GetId();
if (!gDirectory->cd(id.GetPath())) {
virtual AliCDBEntry* GetEntry(const AliCDBId& query);
virtual AliCDBId* GetEntryId(const AliCDBId& query);
virtual TList* GetEntries(const AliCDBId& query);
- virtual Bool_t PutEntry(AliCDBEntry* entry);
+ virtual Bool_t PutEntry(AliCDBEntry* entry, const char* mirrors="");
virtual TList* GetIdListFromFile(const char* fileName);
private:
}
//_____________________________________________________________________________
-Bool_t AliCDBGrid::PutEntry(AliCDBEntry* entry) {
+Bool_t AliCDBGrid::PutEntry(AliCDBEntry* entry, const char* mirrors) {
// put an AliCDBEntry object into the database
AliCDBId& id = entry->GetId();
TDirectory* saveDir = gDirectory;
TString fullFilename = Form("/alien%s", filename.Data());
+ TString seMirrors(mirrors);
// specify SE to filename
- if (fSE != "default") fullFilename += Form("?se=%s",fSE.Data());
+ // if a list of SEs was passed, set the first as SE for opening the file. The others will be used in cascade in case of
+ // failure in opening the file. The remaining will be used to create replicas.
+ TObjArray *arraySEs = seMirrors.Tokenize(',');
+ Int_t nSEs = arraySEs->GetEntries();
+ Int_t remainingSEs = 1;
+ if(nSEs == 0){
+ if (fSE != "default") fullFilename += Form("?se=%s",fSE.Data());
+ }else{
+ remainingSEs = nSEs;
+ }
- Int_t nsleep = fInitRetrySeconds;
// open file
TFile *file=0;
AliDebug(2, Form("fNretry = %d, fInitRetrySeconds = %d",fNretry,fInitRetrySeconds));
- for(Int_t i=0; i<=fNretry; ++i) {
- AliDebug(2, Form("Putting the file in the OCDB: Retry n. %d",i));
+ TString targetSE("");
+ while(remainingSEs>0){
+ if(nSEs!=0){
+ TObjString *target = (TObjString*) arraySEs->At(nSEs-remainingSEs);
+ targetSE=target->String();
+ if ( !(targetSE.BeginsWith("ALICE::") && targetSE.CountChar(':')==4) ) {
+ AliError(Form("\"%s\" is an invalid storage element identifier.",targetSE.Data()));
+ continue;
+ }
+ fullFilename.Remove(fullFilename.Last('?'));
+ fullFilename += Form("?se=%s",targetSE.Data());
+ }
+ Int_t remainingAttempts=fNretry;
+ Int_t nsleep = fInitRetrySeconds; // number of seconds between attempts. We let it increase exponentially
+ while(remainingAttempts > 0) {
+ AliDebug(2, Form("Putting the file in the OCDB - Attempt n. %d",fNretry-remainingAttempts+1));
file = TFile::Open(fullFilename,"CREATE");
+ remainingAttempts--;
if(!file || !file->IsWritable()){
- AliError(Form("Can't open file <%s>!", filename.Data()));
- if(file && !file->IsWritable()) file->Close(); delete file; file=0;
- if(i==fNretry) {
- AliError(Form("After %d retries, failing putting the object in the OCDB - returning...",i));
- return kFALSE;
- }
- else {
- AliDebug(2,Form("Retry %d failed, sleeping for %d seconds",i,nsleep));
- sleep(nsleep);
- }
- }
- else {
- AliDebug(2, " Successful!");
- break;
+ AliError(Form("Can't open file <%s>!", filename.Data()));
+ if(file && !file->IsWritable()) file->Close(); delete file; file=0;
+ AliDebug(2,Form("Attempt %d failed, sleeping for %d seconds",fNretry-remainingAttempts+1,nsleep));
+ if(remainingAttempts>0) sleep(nsleep);
+ }else{
+ remainingAttempts=0;
}
nsleep*=fInitRetrySeconds;
+ }
+ remainingSEs--;
+ if(file) break;
+ }
+ if(!file){
+ AliError(Form("All %d attempts have failed on all %d SEs. Returning...",fNretry,nSEs));
+ return kFALSE;
}
+
file->cd();
//SetTreeToFile(entry, file);
}
AliInfo(Form("CDB object stored into file %s", filename.Data()));
- AliInfo(Form("Storage Element: %s", fSE.Data()));
+ if(nSEs==0)
+ AliInfo(Form("Storage Element: %s", fSE.Data()));
+ else
+ AliInfo(Form("Storage Element: %s", targetSE.Data()));
+
+ //In case of other SEs specified by the user, mirror the file to the remaining SEs
+ while(remainingSEs>0){
+ TString mirrorCmd("mirror ");
+ mirrorCmd += filename;
+ mirrorCmd += " ";
+ TObjString *target = (TObjString*) arraySEs->At(nSEs-remainingSEs);
+ TString mirrorSE(target->String());
+ mirrorCmd += mirrorSE;
+ AliDebug(5,Form("mirror command: \"%s\"",mirrorCmd.Data()));
+ AliInfo(Form("Mirroring to storage element: %s", mirrorSE.Data()));
+ gGrid->Command(mirrorCmd.Data());
+ remainingSEs--;
+ }
+
return result;
}
//_____________________________________________________________________________
virtual AliCDBEntry* GetEntry(const AliCDBId& queryId);
virtual AliCDBId* GetEntryId(const AliCDBId& queryId);
virtual TList* GetEntries(const AliCDBId& queryId);
- virtual Bool_t PutEntry(AliCDBEntry* entry);
+ virtual Bool_t PutEntry(AliCDBEntry* entry, const char* mirrors="");
virtual TList* GetIdListFromFile(const char* fileName);
private:
}
//_____________________________________________________________________________
-Bool_t AliCDBLocal::PutEntry(AliCDBEntry* entry) {
+Bool_t AliCDBLocal::PutEntry(AliCDBEntry* entry, const char* mirrors) {
// put an AliCDBEntry object into the database
AliCDBId& id = entry->GetId();
return kFALSE;
}
+ TString mirrorsString(mirrors);
+ if(!mirrorsString.IsNull())
+ AliError("AliCDBLocal storage cannot take mirrors into account.");
+
// open file
TFile file(filename, "CREATE");
if (!file.IsOpen()) {
virtual AliCDBEntry* GetEntry(const AliCDBId& queryId);
virtual AliCDBId* GetEntryId(const AliCDBId& queryId);
virtual TList* GetEntries(const AliCDBId& queryId);
- virtual Bool_t PutEntry(AliCDBEntry* entry);
+ virtual Bool_t PutEntry(AliCDBEntry* entry, const char* mirrors="");
virtual TList* GetIdListFromFile(const char* fileName);
private:
}
AliCDBEntry anEntry(object, id, metaData);
- return Put(&anEntry, type);
+ return Put(&anEntry, "", type);
}
//_____________________________________________________________________________
-Bool_t AliCDBManager::Put(AliCDBEntry* entry, DataType type){
+Bool_t AliCDBManager::Put(AliCDBEntry* entry, const char* mirrors, DataType type){
// store an AliCDBEntry object into the database
if(type == kPrivate && !fDefaultStorage) {
AliDebug(2,Form("Storing object into storage: %s", aStorage->GetURI().Data()));
- Bool_t result = aStorage->Put(entry, type);
+ Bool_t result = aStorage->Put(entry, mirrors, type);
if(fRun >= 0) QueryCDB();
Bool_t Put(TObject* object, const AliCDBId& id,
AliCDBMetaData* metaData, const DataType type=kPrivate);
- Bool_t Put(AliCDBEntry* entry, DataType type=kPrivate);
+ Bool_t Put(AliCDBEntry* entry, const char* mirrors="", DataType type=kPrivate);
void SetCacheFlag(Bool_t cacheFlag) {fCache=cacheFlag;}
Bool_t GetCacheFlag() const {return fCache;}
AliCDBEntry anEntry(object, id, metaData);
- return Put(&anEntry, type);
+ return Put(&anEntry, "", type);
}
//_____________________________________________________________________________
-Bool_t AliCDBStorage::Put(AliCDBEntry* entry, AliCDBManager::DataType type) {
+Bool_t AliCDBStorage::Put(AliCDBEntry* entry, const char* mirrors, AliCDBManager::DataType type) {
// store an AliCDBEntry object into the database
if (!entry){
return 0;
}
- return PutEntry(entry);
+ return PutEntry(entry,mirrors);
}
//_____________________________________________________________________________
Bool_t Put(TObject* object, AliCDBId& id, AliCDBMetaData* metaData,
AliCDBManager::DataType type=AliCDBManager::kPrivate);
- Bool_t Put(AliCDBEntry* entry, AliCDBManager::DataType type=AliCDBManager::kPrivate);
+ Bool_t Put(AliCDBEntry* entry, const char* mirrors="", AliCDBManager::DataType type=AliCDBManager::kPrivate);
virtual Bool_t IsReadOnly() const = 0;
virtual Bool_t HasSubVersion() const = 0;
virtual AliCDBEntry* GetEntry(const AliCDBId& query) = 0;
virtual AliCDBId* GetEntryId(const AliCDBId& query) = 0;
virtual TList* GetEntries(const AliCDBId& query) = 0;
- virtual Bool_t PutEntry(AliCDBEntry* entry) = 0;
+ virtual Bool_t PutEntry(AliCDBEntry* entry, const char* mirrors="") = 0;
virtual TList *GetIdListFromFile(const char* fileName)=0;
virtual void QueryValidFiles() = 0;
void LoadTreeFromFile(AliCDBEntry* entry) const;