From 7dc943e30d566d0800e5ef1faa9b0d45400cedaf Mon Sep 17 00:00:00 2001 From: Fons Rademakers <Fons.Rademakers@cern.ch> Date: Wed, 2 May 2007 19:20:59 +0000 Subject: [PATCH] From Gerri: - Use basic tracing (i.e. w/o mutex locking) in the child after forking and before execv; this is to avoid problems with locks during fork. - fix a problem with the default image definition in reading a 'worker/slave' line from the config file when a user name is defined (i.e. worker user@wrkhost). git-svn-id: http://root.cern.ch/svn/root/trunk@18636 27541ba8-7e3a-0410-8455-c3a389f83636 --- proofd/src/XrdProofdProtocol.cxx | 106 +++++++++++++++++-------------- 1 file changed, 60 insertions(+), 46 deletions(-) diff --git a/proofd/src/XrdProofdProtocol.cxx b/proofd/src/XrdProofdProtocol.cxx index 77a726008ca..c794c00565d 100644 --- a/proofd/src/XrdProofdProtocol.cxx +++ b/proofd/src/XrdProofdProtocol.cxx @@ -1,4 +1,4 @@ -// @(#)root/proofd:$Name: $:$Id: XrdProofdProtocol.cxx,v 1.44 2007/03/30 16:46:05 rdm Exp $ +// @(#)root/proofd:$Name: $:$Id: XrdProofdProtocol.cxx,v 1.45 2007/04/19 09:27:55 rdm Exp $ // Author: Gerardo Ganis 12/12/2005 /************************************************************************* @@ -3921,7 +3921,8 @@ int XrdProofdProtocol::SetProofServEnv(XrdROOT *r) char *ev = 0; - TRACE(REQ, "SetProofServEnv: enter: ROOT dir: "<< (r ? r->Dir() : "*** undef ***")); + MTRACE(REQ, "xpd:child: ", + "SetProofServEnv: enter: ROOT dir: "<< (r ? r->Dir() : "*** undef ***")); if (r) { char *rootsys = (char *) r->Dir(); @@ -3990,7 +3991,7 @@ int XrdProofdProtocol::SetProofServEnv(XrdROOT *r) } // Bad input - TRACE(REQ, "SetProofServEnv: XrdROOT instance undefined!"); + MTRACE(REQ, "xpd:child: ", "SetProofServEnv: XrdROOT instance undefined!"); return -1; } @@ -4001,31 +4002,35 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) char *ev = 0; - TRACEI(REQ, "SetProofServEnv: enter: psid: "<<psid<< + MTRACE(REQ, "xpd:child: ", "SetProofServEnv: enter: psid: "<<psid<< ", log: "<<loglevel); // Make sure the principal client is defined if (!fPClient) { - TRACEI(XERR, "SetProofServEnv: principal client undefined - cannot continue"); + MTRACE(XERR, "xpd:child: ", + "SetProofServEnv: principal client undefined - cannot continue"); return -1; } // Set basic environment for proofserv if (SetProofServEnv(fPClient->ROOT()) != 0) { - TRACEI(XERR, "SetProofServEnv: problems setting basic environment - exit"); + MTRACE(XERR, "xpd:child: ", + "SetProofServEnv: problems setting basic environment - exit"); return -1; } // Session proxy XrdProofServProxy *xps = fPClient->ProofServs()->at(psid); if (!xps) { - TRACEI(XERR, "SetProofServEnv: unable to get instance of proofserv proxy"); + MTRACE(XERR, "xpd:child: ", + "SetProofServEnv: unable to get instance of proofserv proxy"); return -1; } // Work directory XrdOucString udir = fPClient->Workdir(); - TRACEI(DBG, "SetProofServEnv: working dir for "<<fClientID<<" is: "<<udir); + MTRACE(DBG, "xpd:child: ", + "SetProofServEnv: working dir for "<<fClientID<<" is: "<<udir); // Session tag char hn[64], stag[512]; @@ -4049,10 +4054,11 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) logdir += "/"; logdir += xps->Tag(); } - TRACEI(DBG, "SetProofServEnv: log dir "<<logdir); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: log dir "<<logdir); // Make sure the directory exists if (AssertDir(logdir.c_str(), fUI) == -1) { - TRACEI(XERR, "SetProofServEnv: unable to create log dir: "<<logdir); + MTRACE(XERR, "xpd:child: ", + "SetProofServEnv: unable to create log dir: "<<logdir); return -1; } // The session dir (sandbox) depends on the role @@ -4067,38 +4073,40 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) ev = new char[strlen("ROOTPROOFSESSDIR=")+sessdir.length()+2]; sprintf(ev, "ROOTPROOFSESSDIR=%s", sessdir.c_str()); putenv(ev); - TRACEI(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); // Log level ev = new char[strlen("ROOTPROOFLOGLEVEL=")+5]; sprintf(ev, "ROOTPROOFLOGLEVEL=%d", loglevel); putenv(ev); - TRACEI(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); // Ordinal number ev = new char[strlen("ROOTPROOFORDINAL=")+strlen(xps->Ordinal())+2]; sprintf(ev, "ROOTPROOFORDINAL=%s", xps->Ordinal()); putenv(ev); - TRACEI(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); // ROOT Version tag if not the default one if (fPClient->ROOT() != fgROOT.front()) { ev = new char[strlen("ROOTVERSIONTAG=")+strlen(fPClient->ROOT()->Tag())+2]; sprintf(ev, "ROOTVERSIONTAG=%s", fPClient->ROOT()->Tag()); putenv(ev); - TRACE(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); } // Create the env file - TRACEI(DBG, "SetProofServEnv: creating env file"); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: creating env file"); XrdOucString envfile = sessdir; envfile += ".env"; FILE *fenv = fopen(envfile.c_str(), "w"); if (!fenv) { - TRACE(XERR, "SetProofServEnv: unable to open env file: "<<envfile); + MTRACE(XERR, "xpd:child: ", + "SetProofServEnv: unable to open env file: "<<envfile); return -1; } - TRACEI(DBG, "SetProofServEnv: environment file: "<< envfile); + MTRACE(DBG, "xpd:child: ", + "SetProofServEnv: environment file: "<< envfile); // Forwarded sec credentials, if any if (fAuthProt) { @@ -4117,7 +4125,7 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) ev[env.length()] = 0; putenv(ev); fprintf(fenv, "%s\n", ev); - TRACE(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); } } } @@ -4131,7 +4139,7 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) memcpy(ev+strlen("XrdSecCREDS="), creds->buffer, creds->size); ev[lev] = 0; putenv(ev); - TRACEI(DBG, "SetProofServEnv: XrdSecCREDS set"); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: XrdSecCREDS set"); // If 'pwd', save AFS key, if any if (!strncmp(fAuthProt->Entity.prot, "pwd", 3)) { @@ -4144,12 +4152,13 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) sprintf(ev, "ROOTPROOFAFSCREDS=%s/.afs", credsdir.c_str()); putenv(ev); fprintf(fenv, "ROOTPROOFAFSCREDS has been set\n"); - TRACEI(DBG, "SetProofServEnv: " << ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: " << ev); } else { - TRACEI(DBG, "SetProofServEnv: problems in saving AFS key"); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: problems in saving AFS key"); } } else { - TRACEI(XERR, "SetProofServEnv: unable to create creds dir: "<<credsdir); + MTRACE(XERR, "xpd:child: ", + "SetProofServEnv: unable to create creds dir: "<<credsdir); return -1; } } @@ -4228,7 +4237,7 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) ev[env.length()] = 0; putenv(ev); fprintf(fenv, "%s\n", ev); - TRACEI(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); } } } @@ -4247,7 +4256,7 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) ev[env.length()] = 0; putenv(ev); fprintf(fenv, "%s\n", ev); - TRACEI(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); env.erase(ieq); if (namelist.length() > 0) namelist += ','; @@ -4259,7 +4268,7 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) sprintf(ev, "PROOF_ALLVARS=%s", namelist.c_str()); putenv(ev); fprintf(fenv, "%s\n", ev); - TRACEI(DBG, "SetProofServEnv: "<<ev); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: "<<ev); } // Close file @@ -4273,12 +4282,13 @@ int XrdProofdProtocol::SetProofServEnv(int psid, int loglevel, const char *cfg) else syml += "/last-master-session"; if (SymLink(logdir.c_str(), syml.c_str()) != 0) { - TRACEI(XERR, "SetProofServEnv: problems creating symlink to " + MTRACE(XERR, "xpd:child: ", + "SetProofServEnv: problems creating symlink to " " last session (errno: "<<errno<<")"); } // We are done - TRACEI(DBG, "SetProofServEnv: done"); + MTRACE(DBG, "xpd:child: ", "SetProofServEnv: done"); return 0; } @@ -4383,11 +4393,12 @@ int XrdProofdProtocol::Create() int setupOK = 0; - TRACEP(FORK,"Child process"); + MTRACE(FORK, "xpd: ", "child process"); // We set to the user environment if (SetUserEnvironment() != 0) { - TRACEI(XERR,"Create: SetUserEnvironment did not return OK - EXIT"); + MTRACE(XERR, "xpd:child: ", + "Create: SetUserEnvironment did not return OK - EXIT"); write(fp[1], &setupOK, sizeof(setupOK)); close(fp[0]); close(fp[1]); @@ -4410,7 +4421,8 @@ int XrdProofdProtocol::Create() // Set environment for proofserv if (SetProofServEnv(psid, loglevel, cffile.c_str()) != 0) { - TRACEI(XERR, "Create: SetProofServEnv did not return OK - EXIT"); + MTRACE(XERR, "xpd:child: ", + "Create: SetProofServEnv did not return OK - EXIT"); write(fp[1], &setupOK, sizeof(setupOK)); close(fp[0]); close(fp[1]); @@ -4426,7 +4438,8 @@ int XrdProofdProtocol::Create() char *buf = (char *) xps->Fileout(); for (n = 0; n < lfout; n += ns) { if ((ns = write(fp[1], buf + n, lfout - n)) <= 0) { - TRACEI(XERR, "Create: SetProofServEnv did not return OK - EXIT"); + MTRACE(XERR, "xpd:child: ", + "Create: SetProofServEnv did not return OK - EXIT"); write(fp[1], &setupOK, sizeof(setupOK)); close(fp[0]); close(fp[1]); @@ -4439,13 +4452,13 @@ int XrdProofdProtocol::Create() close(fp[0]); close(fp[1]); - TRACEP(LOGIN,"Create: fClientID: "<<fClientID<< + MTRACE(LOGIN,"xpd:child: ", "Create: fClientID: "<<fClientID<< ", uid: "<<getuid()<<", euid:"<<geteuid()); // Run the program execv(xps->ROOT()->PrgmSrv(), argvv); // We should not be here!!! - XPDERR("Create: returned from execv: bad, bad sign !!!"); + MERROR("xpd:child: ", "Create: returned from execv: bad, bad sign !!!"); exit(1); } @@ -5675,7 +5688,7 @@ int XrdProofdProtocol::SetUserEnvironment() // dir to the sandbox. // Return 0 on success, -1 if enything goes wrong. - TRACEI(ACT, "SetUserEnvironment: enter"); + MTRACE(ACT, "xpd:child: ", "SetUserEnvironment: enter"); if (fPClient->Workdir() && strlen(fPClient->Workdir())) { TRACEI(DBG, "SetUserEnvironment: changing dir to : "<<fPClient->Workdir()); @@ -5683,18 +5696,18 @@ int XrdProofdProtocol::SetUserEnvironment() XrdSysPrivGuard pGuard((uid_t)0, (gid_t)0); if (!pGuard.Valid()) { - TRACEI(XERR, "SetUserEnvironment: could not get privileges"); + MTRACE(XERR, "xpd:child: ", "SetUserEnvironment: could not get privileges"); return -1; } if (chdir(fPClient->Workdir()) == -1) { - TRACEI(XERR, "SetUserEnvironment: can't change directory to "<< + MTRACE(XERR, "xpd:child: ", "SetUserEnvironment: can't change directory to "<< fPClient->Workdir()); return -1; } } else { if (chdir(fPClient->Workdir()) == -1) { - TRACEI(XERR, "SetUserEnvironment: can't change directory to "<< + MTRACE(XERR, "xpd:child: ", "SetUserEnvironment: can't change directory to "<< fPClient->Workdir()); return -1; } @@ -5704,20 +5717,20 @@ int XrdProofdProtocol::SetUserEnvironment() char *h = new char[8 + strlen(fPClient->Workdir())]; sprintf(h, "HOME=%s", fPClient->Workdir()); putenv(h); - TRACEI(XERR, "SetUserEnvironment: set "<<h); + MTRACE(XERR, "xpd:child: ", "SetUserEnvironment: set "<<h); } else { - TRACEI(XERR, "SetUserEnvironment: working directory undefined!"); + MTRACE(XERR, "xpd:child: ", "SetUserEnvironment: working directory undefined!"); } // Set access control list from /etc/initgroup // (super-user privileges required) - TRACEI(DBG, "SetUserEnvironment: setting ACLs"); + MTRACE(DBG, "xpd:child: ", "SetUserEnvironment: setting ACLs"); if ((int) geteuid() != fUI.fUid) { XrdSysPrivGuard pGuard((uid_t)0, (gid_t)0); if (!pGuard.Valid()) { - TRACEI(XERR, "SetUserEnvironment: could not get privileges"); + MTRACE(XERR, "xpd:child: ", "SetUserEnvironment: could not get privileges"); return -1; } @@ -5725,9 +5738,10 @@ int XrdProofdProtocol::SetUserEnvironment() } // acquire permanently target user privileges - TRACEI(DBG, "SetUserEnvironment: acquire target user identity"); + MTRACE(DBG, "xpd:child: ", "SetUserEnvironment: acquire target user identity"); if (XrdSysPriv::ChangePerm((uid_t)fUI.fUid, (gid_t)fUI.fGid) != 0) { - TRACEI(XERR, "SetUserEnvironment: can't acquire "<< fUI.fUser <<" identity"); + MTRACE(XERR, "xpd:child: ", + "SetUserEnvironment: can't acquire "<< fUI.fUser <<" identity"); return -1; } @@ -5736,7 +5750,7 @@ int XrdProofdProtocol::SetUserEnvironment() fPClient->SaveUNIXPath(); // We are done - TRACEI(DBG, "SetUserEnvironment: done"); + MTRACE(DBG, "xpd:child: ", "SetUserEnvironment: done"); return 0; } @@ -7432,7 +7446,7 @@ void XrdProofWorker::Reset(const char *str) // First token is the type XrdOucString tok; - XrdOucString typestr = "mastersubmasterworkerslave"; + XrdOucString typestr = "master|submaster|worker|slave"; int from = s.tokenize(tok, 0, ' '); if (from == STR_NPOS || typestr.find(tok) == STR_NPOS) return; @@ -7476,7 +7490,7 @@ void XrdProofWorker::Reset(const char *str) // Default image is the host name if (fImage.length() <= 0) - fImage.assign(fHost, fHost.find('@')); + fImage.assign(fHost, fHost.find('@')+1); } //__________________________________________________________________________ -- GitLab