25 ClassImp(TProofNodes);
30 TProofNodes::TProofNodes(TProof* proof)
31 : fProof(proof), fNodes(0), fActiveNodes(0),
32 fMaxWrksNode(-1), fMinWrksNode(-1),
33 fNNodes(0), fNWrks(0), fNActiveWrks(0), fNCores(0)
41 TProofNodes::~TProofNodes()
44 fNodes->SetOwner(kTRUE);
55 void TProofNodes::Build()
57 if (!fProof || !fProof->IsValid()) {
58 Warning(
"Build",
"the PROOF instance is undefined or invalid! Cannot continue");
63 fNodes->SetOwner(kTRUE);
67 fNodes->SetOwner(kTRUE);
69 TList *slaves = fProof->GetListOfSlaveInfos();
70 TIter nxtslave(slaves);
74 while ((si = (TSlaveInfo *)(nxtslave()))) {
75 TSlaveInfo *si_copy = (TSlaveInfo *)(si->Clone());
76 if (!(pair = (TPair *) fNodes->FindObject(si->GetName()))) {
79 node->SetOwner(kTRUE);
80 node->SetName(si_copy->GetName());
82 fNodes->Add(
new TObjString(si->GetName()), node);
84 node = (TList *) pair->Value();
90 fActiveNodes->SetOwner(kTRUE);
91 SafeDelete(fActiveNodes);
93 fActiveNodes =
new TMap;
94 fActiveNodes->SetOwner(kTRUE);
103 while ((key = nxk()) != 0) {
104 node =
dynamic_cast<TList *
>(fNodes->GetValue(key));
108 si = (TSlaveInfo *) node->First();
109 fNCores += si->fSysInfo.fCpus;
111 fNWrks += node->GetSize();
112 if (fMinWrksNode == -1 || (node->GetSize() < fMinWrksNode)) {
113 fMinWrksNode = node->GetSize();
115 if (fMaxWrksNode == -1 || (node->GetSize() > fMaxWrksNode)) {
116 fMaxWrksNode = node->GetSize();
119 while ((si = (TSlaveInfo *) nxw())) {
120 if (si->fStatus == TSlaveInfo::kActive) {
122 TSlaveInfo *si_copy = (TSlaveInfo *)(si->Clone());
123 actnode =
dynamic_cast<TList *
>(fActiveNodes->GetValue(key));
125 actnode->Add(si_copy);
128 actnode->SetOwner(kTRUE);
129 actnode->SetName(si_copy->GetName());
130 actnode->Add(si_copy);
131 fActiveNodes->Add(
new TObjString(si->GetName()), actnode);
136 Warning(
"Build",
"could not get list for node '%s'", key->GetName());
150 Int_t TProofNodes::ActivateWorkers(Int_t nwrks)
152 Int_t nw = fProof->SetParallel(nwrks);
155 Warning(
"ActivateWorkers",
"requested %d got %d", nwrks, nw);
169 Int_t TProofNodes::ActivateWorkers(
const char *workers)
172 TString todeactivate;
176 Bool_t protocol33 = kTRUE;
177 if (fProof->GetRemoteProtocol() < 33 || fProof->GetClientProtocol() < 33) {
180 fProof->SetParallel(0);
186 TString sworkers = TString(workers).Strip(TString::kTrailing,
'x');
187 if (!sworkers.IsDigit()) {
188 Error(
"ActivateWorkers",
"wrongly formatted argument: %s - cannot continue", workers);
191 Int_t nworkersnode = sworkers.Atoi();
192 Int_t ret = nworkersnode;
198 while ((key = nxk()) != 0) {
199 if ((node = dynamic_cast<TList *>(fNodes->GetValue(key)))) {
200 TIter nxtworker(node);
201 Int_t nactiveworkers = 0;
202 while ((si = (TSlaveInfo *)(nxtworker()))) {
203 if (nactiveworkers < nworkersnode) {
204 if (si->fStatus == TSlaveInfo::kNotActive) {
206 toactivate += TString::Format(
"%s,", si->GetOrdinal());
208 fProof->ActivateWorker(si->GetOrdinal());
213 if (si->fStatus == TSlaveInfo::kActive) {
215 todeactivate += TString::Format(
"%s,", si->GetOrdinal());
217 fProof->DeactivateWorker(si->GetOrdinal());
223 Warning(
"ActivateWorkers",
"could not get list for node '%s'", key->GetName());
227 if (!todeactivate.IsNull()) {
228 todeactivate.Remove(TString::kTrailing,
',');
229 if (fProof->DeactivateWorker(todeactivate) < 0) ret = -1;
231 if (!toactivate.IsNull()) {
232 toactivate.Remove(TString::kTrailing,
',');
233 if (fProof->ActivateWorker(toactivate) < 0) ret = -1;
236 Warning(
"ActivateWorkers",
"could not get the requested number of workers per node (%d)",
246 while ((key = nxkn()) != 0) {
247 if ((node = dynamic_cast<TList *>(fNodes->GetValue(key)))) {
248 TIter nxtworker(node);
249 Int_t nactiveworkers = 0;
250 while ((si = (TSlaveInfo *)(nxtworker()))) {
251 if (si->fStatus == TSlaveInfo::kActive) nactiveworkers++;
253 if (nactiveworkers != nworkersnode) {
254 Warning(
"ActivateWorkers",
"only %d (out of %d requested) workers "
255 "were activated on node %s",
256 nactiveworkers, nworkersnode, node->GetName());
260 Warning(
"ActivateWorkers",
"could not get list for node '%s'", key->GetName());
271 void TProofNodes::Print(Option_t* option)
const
275 while ((key = nxk()) != 0) {
276 TList *node =
dynamic_cast<TList *
>(fNodes->GetValue(key));
280 Warning(
"Print",
"could not get list for node '%s'", key->GetName());