Array of bits introduced to control better the "atomic" operations of the plugin...
authoragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 17 May 2010 06:24:22 +0000 (06:24 +0000)
committeragheata <agheata@f7af4fe6-9843-0410-8265-dc069ae4e863>
Mon, 17 May 2010 06:24:22 +0000 (06:24 +0000)
ANALYSIS/AliAnalysisAlien.cxx
ANALYSIS/AliAnalysisAlien.h
ANALYSIS/AliAnalysisGrid.cxx
ANALYSIS/AliAnalysisGrid.h

index e957acb..4370fcf 100644 (file)
@@ -358,11 +358,6 @@ Bool_t AliAnalysisAlien::Connect()
 {
 // Try to connect to AliEn. User needs a valid token and /tmp/gclient_env_$UID sourced.
    if (gGrid && gGrid->IsConnected()) return kTRUE;
-   if (!gSystem->Getenv("alien_API_USER")) {
-      Error("Connect", "Make sure you:\n 1. Have called: alien-token-init <username> today\n 2. Have sourced /tmp/gclient_env_%s",
-            gSystem->Getenv("UID"));
-      return kFALSE;
-   }         
    if (!gGrid) {
       Info("Connect", "Trying to connect to AliEn ...");
       TGrid::Connect("alien://");
@@ -403,6 +398,52 @@ void AliAnalysisAlien::CdWork()
 }
 
 //______________________________________________________________________________
+Bool_t AliAnalysisAlien::CheckFileCopy(const char *alienpath)
+{
+// Check if file copying is possible.
+   if (!Connect()) {
+      Error("CheckFileCopy", "Not connected to AliEn. File copying cannot be tested.");
+      return kFALSE;
+   }
+   // Check if alien_CLOSE_SE is defined
+   TString closeSE = gSystem->Getenv("alien_CLOSE_SE");
+   if (!closeSE.IsNull()) {
+      Info("CheckFileCopy", "Your current close storage is pointing to: \
+           \n      alien_CLOSE_SE = \"%s\"", closeSE.Data());
+   } else {
+      Warning("CheckFileCopy", "Your current close storage is empty ! Depending on your location, file copying may fail.");
+   }        
+   // Check if grid directory exists.
+   if (!DirectoryExists(alienpath)) {
+      Error("CheckFileCopy", "Alien path %s does not seem to exist", alienpath);
+      return kFALSE;
+   }
+   TFile f("plugin_test_copy.root", "RECREATE");
+   // User may not have write permissions to current directory 
+   if (f.IsZombie()) {
+      Error("CheckFileCopy", "Cannot create local test file. Do you have write access to current directory: <%s> ?",
+            gSystem->WorkingDirectory());
+      return kFALSE;
+   }
+   f.Close();
+   TString s = f.GetUUID().AsString();
+   s.ReplaceAll("-",""); // AliEn copy does not like too many '-'
+   if (!TFile::Cp(f.GetName(), Form("alien://%s/%s",alienpath, s.Data()))) {
+      Error("CheckFileCopy", "Cannot copy files to Alien destination: %s \
+           \n# 1. Make sure you have write permissions there. If this is the case: \
+           \n# 2. Check the storage availability at: http://alimonitor.cern.ch/stats?page=SE/table \
+           \n#    Do:           export alien_CLOSE_SE=\"working_disk_SE\" \
+           \n#    To make this permanent put in in your .bashrc (in .alienshrc is not enough) \
+           \n#    Redo token:   rm /tmp/x509up_u$UID then: alien-token-init <username>", alienpath);
+      gSystem->Unlink(f.GetName());
+      return kFALSE;
+   }   
+   gSystem->Unlink(f.GetName());
+   gGrid->Rm(Form("%s%s",alienpath,s.Data()));
+   return kTRUE;
+}   
+
+//______________________________________________________________________________
 Bool_t AliAnalysisAlien::CheckInputData()
 {
 // Check validity of input data. If necessary, create xml files.
@@ -1399,6 +1440,8 @@ void AliAnalysisAlien::Print(Option_t *) const
 {
 // Print current plugin settings.
    printf("### AliEn analysis plugin current settings ###\n");
+   printf("=   Copy files to grid: __________________________ %s\n", (IsUseCopy())?"YES":"NO");
+   printf("=   Check if files can be copied to grid: ________ %s\n", (IsCheckCopy())?"YES":"NO");
    printf("=   Production mode:______________________________ %d\n", fProductionMode);
    printf("=   Version of API requested: ____________________ %s\n", fAPIVersion.Data());
    printf("=   Version of ROOT requested: ___________________ %s\n", fROOTVersion.Data());
@@ -1507,6 +1550,8 @@ void AliAnalysisAlien::SetDefaults()
    fJobTag                     = "Automatically generated analysis JDL";
    fMergeExcludes              = "";
    fMergeViaJDL                = 0;
+   SetUseCopy(kTRUE);
+   SetCheckCopy(kTRUE);
 }   
 
 //______________________________________________________________________________
@@ -1744,11 +1789,12 @@ Bool_t AliAnalysisAlien::StartAnalysis(Long64_t /*nentries*/, Long64_t /*firstEn
       Info("StartAnalysis","\n##### FULL ANALYSIS MODE ##### Producing needed files and submitting your analysis job...");   
    }   
       
+   Print();   
    if (!Connect()) {
       Error("StartAnalysis", "Cannot start grid analysis without grid connection");
       return kFALSE;
    }
-   Print();   
+   if (IsCheckCopy()) CheckFileCopy(gGrid->GetHomeDirectory());
    if (!CheckInputData()) {
       Error("StartAnalysis", "There was an error in preprocessing your requested input data");
       return kFALSE;
index 75e7144..d988c55 100644 (file)
@@ -82,6 +82,7 @@ public:
    TGridJDL           *GetMergingJDL() const {return fMergingJDL;}
    const char         *GetGridOutputDir() const                          {return fGridOutputDir;}
 //Utilities
+   Bool_t              CheckFileCopy(const char *alienpath);
    virtual Bool_t      CreateDataset(const char *pattern);
    virtual Bool_t      CreateJDL();
    virtual void        EnablePackage(const char *package);
index 5b7165e..9adb72f 100644 (file)
@@ -27,7 +27,7 @@ ClassImp(AliAnalysisGrid)
 
 //______________________________________________________________________________
 AliAnalysisGrid::AliAnalysisGrid(const AliAnalysisGrid& other)
-                :TNamed(other)
+                :TNamed(other), fSpecialBits(0)
 {
 // Copy ctor.
 }
@@ -38,6 +38,7 @@ AliAnalysisGrid &AliAnalysisGrid::operator=(const AliAnalysisGrid& other)
 // Assignment.
    if (this != &other) {
       TNamed::operator=(other);
+      fSpecialBits = other.fSpecialBits;
    }
    return *this;
 }
@@ -143,6 +144,8 @@ void AliAnalysisGrid::SetRunMode(const char *mode)
    }
    if (smode.Contains("offline")) {
       TObject::SetBit(kOffline, kTRUE);
+      SetUseCopy(kFALSE);
+      SetCheckCopy(kFALSE);
       return;
    }
    if (smode.Contains("submit")) {
index 454c4bf..6f15888 100644 (file)
@@ -31,9 +31,14 @@ enum EPluginRunMode {
    kUsePars  = BIT(22),
    kDefaultOutputs = BIT(23)
 };   
+enum EPluginBits {
+   kBitMask32  = 0xffffffff,
+   kUseCopy    = BIT(0),
+   kCheckCopy  = BIT(1)
+};
 
-   AliAnalysisGrid() {}
-   AliAnalysisGrid(const char *name) : TNamed(name,"") {}
+   AliAnalysisGrid() : TNamed(), fSpecialBits(0) {}
+   AliAnalysisGrid(const char *name) : TNamed(name,""), fSpecialBits(0) {}
    virtual ~AliAnalysisGrid() {}
    AliAnalysisGrid(const AliAnalysisGrid& other); 
    AliAnalysisGrid& operator=(const AliAnalysisGrid& other);
@@ -94,9 +99,27 @@ enum EPluginRunMode {
    virtual void        WriteExecutable()                                 = 0;
    virtual void        WriteValidationScript(Bool_t merge=kFALSE)        = 0;
 
+// Flags
+   Bool_t              IsUseCopy() const {return TestSpecialBit(kUseCopy);}
+   void                SetUseCopy(Bool_t flag=kTRUE) {SetSpecialBit(kUseCopy,flag);}
+   Bool_t              IsCheckCopy() const {return TestSpecialBit(kCheckCopy);}
+   void                SetCheckCopy(Bool_t flag=kTRUE) {SetSpecialBit(kCheckCopy,flag);}
+
 protected:
+// Methods
    virtual Bool_t      Connect()                                         = 0;
-   virtual void        SetDefaults()                                     = 0;   
-   ClassDef(AliAnalysisGrid, 1)   // Base class for GRID utilities
+   virtual void        SetDefaults()                                     = 0;
+   void     SetSpecialBit(UInt_t f) { fSpecialBits |= f & kBitMask32; }
+   void     ResetSpecialBit(UInt_t f) { fSpecialBits &= ~(f & kBitMask32); }
+   void     SetSpecialBit(UInt_t f, Bool_t set) {(set)?SetSpecialBit(f):ResetSpecialBit(f);}
+   Bool_t   TestSpecialBit(UInt_t f) const { return (Bool_t) ((fSpecialBits & f) != 0); }
+   Int_t    TestSpecialBits(UInt_t f) const { return (Int_t) (fSpecialBits & f); }
+   void     InvertSpecialBit(UInt_t f) { fSpecialBits ^= f & kBitMask32; }
+
+protected:
+   UInt_t              fSpecialBits; // special bits
+  
+
+   ClassDef(AliAnalysisGrid, 2)   // Base class for GRID utilities
 };
 #endif