TLM.cxx

Go to the documentation of this file.
00001 // @(#)root/clarens:$Id: TLM.cxx 20882 2007-11-19 11:31:26Z rdm $
00002 // Author: Maarten Ballintijn   21/10/2004
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2005, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 //////////////////////////////////////////////////////////////////////////
00013 //                                                                      //
00014 // TLM                                                                  //
00015 //                                                                      //
00016 //                                                                      //
00017 //////////////////////////////////////////////////////////////////////////
00018 
00019 #include "TLM.h"
00020 
00021 #include "memory"
00022 #include <stdlib.h>
00023 #include "xmlrpc.h"
00024 #include "xmlrpc_client.h"
00025 
00026 
00027 #include "Riostream.h"
00028 #include "TClass.h"
00029 #include "TList.h"
00030 #include "TString.h"
00031 #include "TXmlRpc.h"
00032 
00033 
00034 ClassImp(TLM)
00035 ClassImp(TLM::TSlaveParams)
00036 
00037 
00038 //______________________________________________________________________________
00039 TLM::TLM(TXmlRpc *rpc)
00040    : TClProxy("LM", rpc)
00041 {
00042 }
00043 
00044 
00045 //______________________________________________________________________________
00046 Bool_t TLM::GetVersion(TString &version)
00047 {
00048    xmlrpc_env *env = fRpc->GetEnv();
00049 
00050    xmlrpc_value *retval = fRpc->Call("version", 0);
00051    if (RpcFailed("GetVersion", "call")) return kFALSE;
00052 
00053    if (gDebug>0) fRpc->PrintValue(retval);
00054 
00055    char *rc;
00056    xmlrpc_value *val;
00057    xmlrpc_parse_value(env, retval, "(sV)", &rc, &val);
00058    if (RpcFailed("GetVersion", "decode")) return kFALSE;
00059 
00060    if (strcmp(rc, "SUCCESS") != 0) {
00061       char *errmsg;
00062       xmlrpc_parse_value(env, val, "s", &errmsg);
00063       if (RpcFailed("GetVersion", "decode errmsg")) return kFALSE;
00064 
00065       Error("GetVersion", "%s", errmsg);
00066       return kFALSE;
00067    }
00068 
00069    char *v;
00070    xmlrpc_parse_value(env, val, "s", &v);
00071    if (RpcFailed("GetVersion", "decode version")) return kFALSE;
00072 
00073    version = v;
00074 
00075    xmlrpc_DECREF (retval);
00076    return kTRUE;
00077 }
00078 
00079 
00080 //______________________________________________________________________________
00081 Bool_t TLM::StartSession(const Char_t *sessionid, TList *&config, Int_t &hbf)
00082 {
00083    xmlrpc_env *env = fRpc->GetEnv();
00084 
00085    xmlrpc_value *arg = xmlrpc_build_value(env, "(s)", sessionid);
00086    if (RpcFailed("StartSession", "encode argument")) return kFALSE;
00087 
00088    xmlrpc_value *retval = fRpc->Call("get_config", arg);
00089    if (RpcFailed("StartSession", "call")) return kFALSE;
00090 
00091    char *rc;
00092    xmlrpc_value *val;
00093    xmlrpc_parse_value(env, retval, "(sV)", &rc, &val);
00094    if (RpcFailed("StartSession", "decode reply")) return kFALSE;
00095 
00096    if (strcmp(rc, "SUCCESS") != 0) {
00097       char *errmsg;
00098       xmlrpc_parse_value(env, val, "s", &errmsg);
00099       if (RpcFailed("StartSession", "decode errmsg")) return kFALSE;
00100 
00101       Error("StartSession", "%s", errmsg);
00102       return kFALSE;
00103    }
00104 
00105    char *hbfs;
00106    xmlrpc_value *nodearray;
00107    xmlrpc_parse_value(env, val, "(sA)", &hbfs, &nodearray);
00108    if (RpcFailed("StartSession", "decode results")) return kFALSE;
00109 
00110    hbf = atol(hbfs);
00111    int n = xmlrpc_array_size (env, nodearray);
00112    if (RpcFailed("StartSession", "array size")) return kFALSE;
00113 
00114    std::auto_ptr<TList> ntemp(new TList);
00115    ntemp->SetOwner();
00116    // skip entry zero with the labels
00117    for(int i=1; i < n; i++) {
00118       xmlrpc_value *entry = xmlrpc_array_get_item(env, nodearray, i);
00119       if (RpcFailed("StartSession", "get entry")) return kFALSE;
00120 
00121 //fields=['name','cpu_speed_Ghz','specint','image','start_mechanism',
00122 //   'authentication_type','maximum_slaves']
00123 
00124       char *name, *img, *startup, *auth, *max;
00125       double mhz;
00126       int specint;
00127       xmlrpc_parse_value(env, entry, "(sdisssi)", &name, &mhz, &specint,
00128                          &img, &startup, &auth, &max);
00129       if (RpcFailed("StartSession", "decode entry")) return kFALSE;
00130 
00131       TSlaveParams *sl = new TSlaveParams;
00132 
00133       sl->fNode      = name;
00134       sl->fPerfidx   = specint;
00135       sl->fImg       = img;
00136       sl->fAuth      = auth;
00137       sl->fAccount   = "nobody";
00138       sl->fType      = startup;
00139 
00140       ntemp->Add(sl);
00141    }
00142 
00143    config = ntemp.release();
00144    xmlrpc_DECREF (arg);
00145    xmlrpc_DECREF (retval);
00146 
00147    return kTRUE;
00148 }
00149 
00150 
00151 //______________________________________________________________________________
00152 Bool_t TLM::Heartbeat(const Char_t *sessionid)
00153 {
00154    xmlrpc_env *env = fRpc->GetEnv();
00155 
00156    xmlrpc_value *arg = xmlrpc_build_value(env, "(s)", sessionid);
00157    if (RpcFailed("Heartbeat", "encode argument")) return kFALSE;
00158 
00159    xmlrpc_value *retval = fRpc->Call("alive", arg);
00160    if (RpcFailed("Heartbeat", "call")) return kFALSE;
00161 
00162    char *rc;
00163    xmlrpc_value *val;
00164    xmlrpc_parse_value(env, retval, "(sV)", &rc, &val);
00165    if (RpcFailed("Heartbeat", "decode reply")) return kFALSE;
00166 
00167    if (strcmp(rc, "SUCCESS") != 0) {
00168       char *errmsg;
00169       xmlrpc_parse_value(env, val, "s", &errmsg);
00170       if (RpcFailed("Heartbeat", "decode errmsg")) return kFALSE;
00171 
00172       Error("Heartbeat", "%s", errmsg);
00173       return kFALSE;
00174    }
00175 
00176    return kTRUE;
00177 }
00178 
00179 
00180 //______________________________________________________________________________
00181 Bool_t TLM::DataReady(const Char_t *sessionid, Long64_t & bytesready,
00182                       Long64_t & bytestotal)
00183 {
00184    xmlrpc_env *env = fRpc->GetEnv();
00185 
00186    xmlrpc_value *arg = xmlrpc_build_value(env, "(s)", sessionid);
00187    if (RpcFailed("DataReady", "encode argument")) return kFALSE;
00188 
00189    xmlrpc_value *retval = fRpc->Call("data_ready", arg);
00190    if (RpcFailed("DataReady", "call")) return kFALSE;
00191 
00192    char *rc;
00193    xmlrpc_value *val;
00194    xmlrpc_parse_value(env, retval, "(sV)", &rc, &val);
00195    if (RpcFailed("DataReady", "decode reply")) return kFALSE;
00196 
00197    if (strcmp(rc, "SUCCESS") != 0) {
00198       char *errmsg;
00199       xmlrpc_parse_value(env, val, "s", &errmsg);
00200       if (RpcFailed("DataReady", "decode errmsg")) return kFALSE;
00201 
00202       Error("DataReady", "%s", errmsg);
00203       return kFALSE;
00204    }
00205 
00206    Int_t isReady;
00207    Double_t ready, total;
00208    xmlrpc_parse_value(env, val, "(bdd)", &isReady, &ready, &total);
00209    if (RpcFailed("DataReady", "decode results")) return kFALSE;
00210 
00211    bytesready = (Long64_t) ready;
00212    bytestotal = (Long64_t) total;
00213    return isReady;
00214 }
00215 
00216 
00217 //______________________________________________________________________________
00218 Bool_t TLM::EndSession(const Char_t *sessionid)
00219 {
00220    xmlrpc_env *env = fRpc->GetEnv();
00221 
00222    xmlrpc_value *arg = xmlrpc_build_value(env, "(s)", sessionid);
00223    if (RpcFailed("EndSession", "encode argument")) return kFALSE;
00224 
00225    xmlrpc_value *retval = fRpc->Call("destroy_job", arg);
00226    if (RpcFailed("EndSession", "call")) return kFALSE;
00227 
00228    char *rc;
00229    xmlrpc_value *val;
00230    xmlrpc_parse_value(env, retval, "(sV)", &rc, &val);
00231    if (RpcFailed("EndSession", "decode reply")) return kFALSE;
00232 
00233    if (strcmp(rc, "SUCCESS") != 0) {
00234       char *errmsg;
00235       xmlrpc_parse_value(env, val, "s", &errmsg);
00236       if (RpcFailed("EndSession", "decode errmsg")) return kFALSE;
00237 
00238       Error("EndSession", "%s", errmsg);
00239       return kFALSE;
00240    }
00241    return kTRUE;
00242 }
00243 
00244 
00245 
00246 //______________________________________________________________________________
00247 void TLM::TSlaveParams::Print(Option_t * /*option*/) const
00248 {
00249    cout << IsA()->GetName()
00250       << ":  " << fNode
00251       << ", " << fPerfidx
00252       << ", " << fImg
00253       << ", " << fAuth
00254       << ", " << fAccount
00255       << ", " << fType
00256       << endl;
00257 }

Generated on Tue Jul 5 14:50:49 2011 for ROOT_528-00b_version by  doxygen 1.5.1