Format fixed in Logs lines.
[u/mrichter/AliRoot.git] / SHUTTLE / DCSClient / AliDCSClient.cxx
index f20801bca4a82fe453616eaf6b624d6f19452725..bb8d3096de4c6f703c0b8e2ef403671118e18a43 100644 (file)
 
 /*
 $Log$
+Revision 1.8  2007/10/17 17:43:02  acolla
+nextMessage removed from client
+
+Revision 1.7  2007/10/16 15:02:20  jgrosseo
+fixed bug if zero values collected
+
+Revision 1.6  2007/10/16 14:37:16  jgrosseo
+changing to AMANDA protocol version 2
+
+Revision 1.5  2007/10/05 12:40:55  acolla
+
+Result error code added to AliDCSClient data members (it was "lost" with the new implementation of TMap* GetAliasValues and GetDPValues).
+
 Revision 1.4  2007/09/14 16:46:14  jgrosseo
 1) Connect and Close are called before and after each query, so one can
 keep the same AliDCSClient object.
@@ -94,6 +107,7 @@ some more descriptions added
 #include <TMap.h>
 #include <TObjString.h>
 #include <TSystem.h>
+#include <TTimeStamp.h>
 
 ClassImp(AliDCSClient)
 
@@ -103,6 +117,7 @@ const char* AliDCSClient::fgkTimeoutString = "Timeout";
 const char* AliDCSClient::fgkBadMessageString = "BadMessage";
 const char* AliDCSClient::fgkCommErrorString = "CommunicationError";
 const char* AliDCSClient::fgkServerErrorString = "ServerError";
+const char* AliDCSClient::fgkUnknownDPString = "UnknownAlias/DP";
 
 //______________________________________________________________________
 AliDCSClient::AliDCSClient(const char* host, Int_t port, UInt_t timeout,
@@ -135,23 +150,27 @@ Bool_t AliDCSClient::Connect()
        
        Close();
        
-       Int_t tries = 0;        
+       Int_t tries = 0;
+       Int_t sleeptime=300;
+       
        while (tries < fRetries) 
        {
                fSocket = new TSocket(fHost, fPort);
-               if (fSocket->IsValid()) 
+                       
+               if (fSocket && fSocket->IsValid()) 
                {
-                       AliDebug(1, Form("Connected to %s:%d", fHost.Data(), fPort));
+                       AliDebug(1, Form("%s  *** Connected to %s:%d", TTimeStamp(time(0)).AsString("s"), fHost.Data(), fPort));
                        fSocket->SetOption(kNoBlock, 1);
                        return kTRUE;
                }
 
-               AliDebug(1, Form("Connection timeout! tries <%d> ...", tries));
+               AliError(Form(" *** Connection to AMANDA server failed Tried <%d> times ...", tries+1));
+               if(tries<fRetries-1) AliInfo(Form(" *** Waiting %d seconds before next retry.", sleeptime));
 
                delete fSocket;
                fSocket = NULL;
 
-               gSystem->Sleep(fTimeout);
+               gSystem->Sleep(sleeptime);
                tries ++;
        }
        
@@ -168,7 +187,7 @@ Int_t AliDCSClient::SendBuffer(const char* buffer, Int_t size)
 
         while (sentSize < size && tries < fRetries) {
 
-                Int_t sResult = fSocket->Select(TSocket::kWrite, fTimeout);
+                Int_t sResult = fSocket->Select(TSocket::kWrite, fTimeout*1000); //timeout for TSocket::Select is in msec
 
                 if (sResult == 0) {
                        AliDebug(1, Form("Timeout! tries <%d> ...", tries));
@@ -210,9 +229,10 @@ Int_t AliDCSClient::ReceiveBuffer(char* buffer, Int_t size)
 
         while (receivedSize < size && tries < fRetries) {
 
-                Int_t sResult = fSocket->Select(TSocket::kRead, fTimeout);
+                Int_t sResult = fSocket->Select(TSocket::kRead, fTimeout*1000); //timeout for TSocket::Select is in msec
 
                 if (sResult == 0) {
+                       AliDebug(1, Form("Time when timing out: %s   Timeout value: %d seconds",TTimeStamp(time(0)).AsString("s"),fTimeout));
                         AliDebug(1, Form("Timeout! tries <%d> ...", tries));
                         tries ++;
                         continue;
@@ -256,7 +276,7 @@ Int_t AliDCSClient::SendMessage(AliDCSMessage& message)
 }
 
 //______________________________________________________________________
-Int_t AliDCSClient::ReceiveMessage(AliDCSMessage& message) 
+Int_t AliDCSClient::ReceiveMessage(AliDCSMessage& message)
 {
 // receive message from the DCS server
        
@@ -318,11 +338,20 @@ Int_t AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
                return sResult;
        }
 
-       sResult = ReceiveValueSet(result);
+       Int_t receivedValues = 0;
+
+       while (1)
+       {
+               Int_t tmp = 0;
+               sResult = ReceiveValueSet(result, tmp);
+               if (sResult <= 0)
+                       break;
+               receivedValues += sResult;
+       }
 
        Close();
 
-       return sResult;
+       return receivedValues;
 }
 
 //______________________________________________________________________
@@ -344,15 +373,15 @@ TMap* AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
 
        for (Int_t subsetBegin = startIndex; subsetBegin < endIndex; subsetBegin += fMultiSplit)
        {
-               Connect();
-       
-               if (!IsConnected()) 
+               Connect();
+
+               if (!IsConnected())
                {
-                       AliError("Not connected!");
-                       delete result;
+                       AliError("Not connected!");
+                       delete result;
                        fResultErrorCode = fgkBadState;
-                       return 0;
-               }
+                       return 0;
+               }
 
                Int_t subsetEnd = subsetBegin + fMultiSplit;
                if (subsetEnd > endIndex)
@@ -361,17 +390,17 @@ TMap* AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
                AliDCSMessage requestMessage;
                if (fMultiSplit == 1)
                {
-                   // single dp request
-            
-                       TObjString* aRequest = (TObjString*) list->At(subsetBegin);
-                       requestMessage.CreateRequestMessage(reqType, startTime, endTime, aRequest->String());
+                       // single dp request
+
+                       TObjString* aRequest = (TObjString*) list->At(subsetBegin);
+                       requestMessage.CreateRequestMessage(reqType, startTime, endTime, aRequest->String());
                }
                else
                {
-                   // multi dp request
-            
-                   requestMessage.CreateMultiRequestMessage(reqType,
-                               startTime, endTime);
+                       // multi dp request
+
+                       requestMessage.CreateMultiRequestMessage(reqType,
+                               startTime, endTime);
 
                        for (Int_t i=subsetBegin; i<subsetEnd; i++)
                        {
@@ -382,127 +411,132 @@ TMap* AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
                                        fResultErrorCode = fgkBadMessage;
                                        return 0;
                                }
-                       }
-               }
-       
-               if ((fResultErrorCode = SendMessage(requestMessage)) < 0)
-               {
-                    AliError(Form("Can't send request message! Reason: %s",
-                            GetErrorString(fResultErrorCode)));
-                    Close();
-                    delete result;
-                    return 0;
+                       }
+               }
+
+               if ((fResultErrorCode = SendMessage(requestMessage)) < 0)
+               {
+                       AliError(Form("Can't send request message! Reason: %s",
+                               GetErrorString(fResultErrorCode)));
+                       Close();
+                       delete result;
+                       return 0;
                }
-    
-               for (Int_t i=subsetBegin; i<subsetEnd; i++)
-               {
-                       TObjString* aRequest = (TObjString*) list->At(i);
-               
-                       TObjArray* resultSet = new TObjArray();
+
+               while (1)
+               {
+                       TObjArray* resultSet = new TObjArray();
                        resultSet->SetOwner(1);
-    
-                       if ((fResultErrorCode = ReceiveValueSet(resultSet)) < 0) 
+
+                       Int_t ownerIndex = -1;
+                       fResultErrorCode = ReceiveValueSet(resultSet, ownerIndex);
+
+                       if (fResultErrorCode < 0)
                        {
-                               AliError(Form("Can't get values for %s!" ,
-                               aRequest->String().Data()));
-    
-                               delete resultSet;
-                               result->DeleteValues();
-                               delete result;
-                               return 0;
-                       }
-
-                       result->Add(aRequest, resultSet);
-                  }
-
-              Close();
-
-                  AliInfo(Form("Retrieved entries %d..%d (total %d..%d); E.g. %s has %d values collected",
-                                       subsetBegin, subsetEnd, startIndex, endIndex, list->At(subsetBegin)->GetName(), ((TObjArray*)
-                                       result->GetValue(list->At(subsetBegin)->GetName()))->GetEntriesFast()));
-               
-           }
+                               if (fResultErrorCode == fgkUnknownDP)
+                               {
+                                       AliError(Form("%s",fServerError.Data()));
+                               }
+                               
+                               AliError("Can't get values");
+
+                               delete resultSet;
+                               result->DeleteValues();
+                               delete result;
+                               return 0;
+                       }
+
+                       if (ownerIndex < 0)
+                       {
+                               // no more values
+                               delete resultSet;
+                               break;
+                       }
+
+                       TObjString* aRequest = (TObjString*) list->At(ownerIndex + subsetBegin);
+                       //AliInfo(Form("Received %d values for entry %d, that is %s", resultSet->GetEntries(),
+                       //      ownerIndex + subsetBegin, aRequest->String().Data()));
+
+                       TObjArray* target = dynamic_cast<TObjArray*> (result->GetValue(aRequest));
+                       if (target)
+                       {
+                               target->AddAll(resultSet);
+                               //AliInfo(Form("Now we have %d entries", target->GetEntries()));
+                               resultSet->SetOwner(0);
+                               delete resultSet;
+                       }
+                       else
+                               result->Add(aRequest, resultSet);
+               }
+
+               Close();
+
+               Int_t nValues = 0;
+               TObjArray* example = (TObjArray*) result->GetValue(list->At(subsetBegin));
+               if (example)
+                       nValues = example->GetEntries();
+               AliInfo(Form("Retrieved entries %d..%d (total %d..%d); E.g. %s has %d values collected",
+                       subsetBegin, subsetEnd-1, startIndex, endIndex-1, list->At(subsetBegin)->GetName(), nValues));
+       }
 
        return result;
 }
        
 //______________________________________________________________________
-Int_t AliDCSClient::ReceiveValueSet(TObjArray* result)
+Int_t AliDCSClient::ReceiveValueSet(TObjArray* result, Int_t& ownerIndex)
 {
-// receive set of values 
+       // receive set of values
 
-       Int_t sResult;
-
-       AliDCSMessage responseMessage;
-       if ((sResult = ReceiveMessage(responseMessage)) < 0) {
-               AliError(Form("Can't receive response message! Reason: %s",
-                       GetErrorString(sResult)));
+       AliDCSMessage message;
+       Int_t sResult = ReceiveMessage(message);
+       if (sResult < 0)
+       {
+               AliError(Form("Can't receive message! Reason: %s", GetErrorString(sResult)));
                return sResult;
-       }       
-
-       UInt_t valueCount;
+       }
 
-       if (responseMessage.GetType() == AliDCSMessage::kCount) {
-               valueCount = responseMessage.GetCount();
+       if (message.GetType() == AliDCSMessage::kResultSet)
+       {
+               // this was the last message
+               ownerIndex = message.GetOwnerIndex();
+               if (ownerIndex < 0)
+                       return 0;
+
+               sResult = message.GetValues(result);
+
+//             AliDCSMessage nextMessage;
+//             nextMessage.CreateNextMessage();
+// 
+//             if ((fResultErrorCode = SendMessage(nextMessage)) < 0)
+//             {
+//                     AliError(Form("Can't send next message! Reason: %s",
+//                             GetErrorString(fResultErrorCode)));
+//                     Close();
+//                     return AliDCSClient::fgkCommError;
+//             }
 
-       } else if (responseMessage.GetType() == AliDCSMessage::kError) {
-               fServerErrorCode = responseMessage.GetErrorCode();
-               fServerError = responseMessage.GetErrorString();
+               return sResult;
+       }
+       else if (message.GetType() == AliDCSMessage::kError)
+       {
+               fServerErrorCode = message.GetErrorCode();
+               fServerError = message.GetErrorString();
 
                return AliDCSClient::fgkServerError;
-
-       } else {
-               AliError("Bad message type received!"); 
-               return AliDCSClient::fgkBadMessage;
        }
+       
+       else if (message.GetType() == AliDCSMessage::kUnknownDP)
+       {
+               fServerError = message.GetErrorString();
 
-       UInt_t receivedValues = 0;
-
-       AliDCSValue::Type valueType = AliDCSValue::kInvalid;
-
-       while (receivedValues < valueCount) {
-
-                AliDCSMessage message;
-
-                if ((sResult = ReceiveMessage(message)) < 0) {
-                        AliError(Form("Can't receive message! Reason: %s",
-                               GetErrorString(sResult)));
-                        return sResult;
-                }
-
-                if (message.GetType() == AliDCSMessage::kResultSet) {
-
-                       if (valueType == AliDCSValue::kInvalid) {
-                               valueType = message.GetValueType();
-                       } else {
-                               if (valueType != message.GetValueType()) {
-                                       AliError("Unexpected value type!");
-                                       return AliDCSClient::fgkBadMessage;
-                               }
-                       }
-
-                       receivedValues += message.GetValues(result);
-
-                       if (receivedValues > valueCount) {
-                               AliError("Message contains more values than expected!");
-                               return AliDCSClient::fgkBadMessage;
-                       }
-
-               } else if (message.GetType() == AliDCSMessage::kError) {
-                               fServerErrorCode = 
-                                       responseMessage.GetErrorCode();
-                               fServerError = responseMessage.GetErrorString();
-
-                               return AliDCSClient::fgkServerError;
-               } else {
-                        AliError("Bad message type received!");
-                        return AliDCSClient::fgkBadMessage;
-                }       
-        }       
+               return AliDCSClient::fgkUnknownDP;
+       }
        
-       return receivedValues;
+
+       AliError("Bad message type received!");
+       return AliDCSClient::fgkBadMessage;
 }
-               
+
 //______________________________________________________________________
 Int_t AliDCSClient::GetDPValues(const char* dpName, UInt_t startTime,
                                UInt_t endTime, TObjArray* result)
@@ -599,6 +633,7 @@ void AliDCSClient::Close()
        //
 
        if (fSocket) {
+               AliDebug(1, Form("%s  *** Closing connection to %s:%d", TTimeStamp(time(0)).AsString("s"), fHost.Data(), fPort));
                fSocket->Close();
                delete fSocket;
                fSocket = 0;
@@ -632,6 +667,9 @@ const char* AliDCSClient::GetErrorString(Int_t code)
 
                case AliDCSClient::fgkServerError:
                        return AliDCSClient::fgkServerErrorString;
+               
+               case AliDCSClient::fgkUnknownDP:
+                       return AliDCSClient::fgkUnknownDPString;
 
                default:
                        AliErrorGeneral("AliDCSClient::GetErrorString",