20 #include "RConfigure.h"
28 #include <sys/types.h>
29 #include <netinet/in.h>
51 #include "compiledata.h"
60 static volatile Int_t gProofServDebug = 1;
65 class TXProofServSigPipeHandler :
public TSignalHandler {
68 TXProofServSigPipeHandler(TXProofServ *s) : TSignalHandler(kSigInterrupt, kFALSE)
75 Bool_t TXProofServSigPipeHandler::Notify()
77 fServ->HandleSigPipe();
84 class TXProofServTerminationHandler :
public TSignalHandler {
87 TXProofServTerminationHandler(TXProofServ *s)
88 : TSignalHandler(kSigTermination, kFALSE) { fServ = s; }
94 Bool_t TXProofServTerminationHandler::Notify()
96 Printf(
"Received SIGTERM: terminating");
98 fServ->HandleTermination();
105 class TXProofServSegViolationHandler :
public TSignalHandler {
108 TXProofServSegViolationHandler(TXProofServ *s)
109 : TSignalHandler(kSigSegmentationViolation, kFALSE) { fServ = s; }
115 Bool_t TXProofServSegViolationHandler::Notify()
118 Printf(
"**** Segmentation violation: terminating ****");
120 fServ->HandleTermination();
127 class TXProofServInputHandler :
public TFileHandler {
130 TXProofServInputHandler(TXProofServ *s, Int_t fd) : TFileHandler(fd, 1)
133 Bool_t ReadNotify() {
return Notify(); }
138 Bool_t TXProofServInputHandler::Notify()
140 fServ->HandleSocketInput();
142 ((TXUnixSocket *) fServ->GetSocket())->RemoveClientID();
146 ClassImp(TXProofServ);
151 TApplication *GetTXProofServ(Int_t *argc,
char **argv, FILE *flog)
152 {
return new TXProofServ(argc, argv, flog); }
158 TXProofServ::TXProofServ(Int_t *argc,
char **argv, FILE *flog)
159 : TProofServ(argc, argv, flog)
161 fInterruptHandler = 0;
163 fTerminated = kFALSE;
181 Int_t TXProofServ::CreateServer()
183 Bool_t xtest = (Argc() > 3 && !strcmp(Argv(3),
"test")) ? kTRUE : kFALSE;
185 if (gProofDebugLevel > 0)
186 Info(
"CreateServer",
"starting%s server creation", (xtest ?
" test" :
""));
191 if ((fLogFileDes = fileno(fLogFile)) < 0) {
192 Error(
"CreateServer",
"resolving the log file description number");
196 if (gProofDebugLevel <= 0)
197 lseek(fLogFileDes, (off_t) 0, SEEK_END);
201 TXSocket::SetLocation((IsMaster()) ?
"master" :
"slave");
204 EnvPutInt(NAME_DEBUG, gEnv->GetValue(
"XNet.Debug", 0));
210 if (!(fSockPath = gSystem->Getenv(
"ROOTOPENSOCK"))) {
211 Error(
"CreateServer",
"test: socket setup by xpd undefined");
214 Int_t fpw = (Int_t) strtol(fSockPath.Data(), 0, 10);
215 int proto = htonl(kPROOF_Protocol);
217 if (write(fpw, &proto,
sizeof(proto)) !=
sizeof(proto)) {
218 Error(
"CreateServer",
"test: sending protocol number");
223 fSockPath = gEnv->GetValue(
"ProofServ.OpenSock",
"");
224 if (fSockPath.Length() <= 0) {
225 Error(
"CreateServer",
"socket setup by xpd undefined");
228 TString entity = gEnv->GetValue(
"ProofServ.Entity",
"");
229 if (entity.Length() > 0)
230 fSockPath.Insert(0,Form(
"%s/", entity.Data()));
235 const char *opensock = gSystem->Getenv(
"ROOTOPENSOCK");
236 if (opensock && strlen(opensock) > 0) {
237 TSystem::ResetErrno();
238 sockfd = (Int_t) strtol(opensock, 0, 10);
239 if (TSystem::GetErrno() == ERANGE) {
241 Warning(
"CreateServer",
"socket descriptor: wrong conversion from '%s'", opensock);
243 if (sockfd > 0 && gProofDebugLevel > 0)
244 Info(
"CreateServer",
"using open connection (descriptor %d)", sockfd);
248 Int_t psid = gEnv->GetValue(
"ProofServ.SessionID", -1);
250 Error(
"CreateServer",
"Session ID undefined");
255 fSocket =
new TXUnixSocket(fSockPath, psid, -1,
this, sockfd);
256 if (!fSocket || !(fSocket->IsValid())) {
257 Error(
"CreateServer",
"Failed to open connection to XrdProofd coordinator");
261 fSocket->SetCompressionSettings(fCompressMsg);
264 TString tgt(
"client");
265 if (fOrdinal !=
"0") {
267 if (tgt.Last(
'.') != kNPOS) tgt.Remove(tgt.Last(
'.'));
269 fSocket->SetTitle(tgt);
272 ((TXSocket *)fSocket)->fReference =
this;
275 Int_t sock = fSocket->GetDescriptor();
279 TXSocketHandler::GetSocketHandler(
new TXProofServInputHandler(
this, sock), fSocket);
280 gSystem->AddFileHandler(fInputHandler);
283 Int_t cid = gEnv->GetValue(
"ProofServ.ClientID", -1);
285 Error(
"CreateServer",
"Client ID undefined");
289 ((TXSocket *)fSocket)->SetClientID(cid);
294 if (gEnv->GetValue(
"Proof.GdbHook",0) == 1) {
295 while (gProofServDebug)
300 if (gEnv->GetValue(
"Proof.GdbHook",0) == 2) {
301 while (gProofServDebug)
306 if (gProofDebugLevel > 0)
307 Info(
"CreateServer",
"Service: %s, ConfDir: %s, IsMaster: %d",
308 fService.Data(), fConfDir.Data(), (Int_t)fMasterServ);
322 if (!fLogFile || (fLogFileDes = fileno(fLogFile)) < 0) {
332 if (CatMotd() == -1) {
341 ProcessLine(
"#include <iostream>", kTRUE);
342 ProcessLine(
"#include <string>",kTRUE);
346 logon = gEnv->GetValue(
"Proof.Load", (
char *)0);
348 char *mac = gSystem->Which(TROOT::GetMacroPath(), logon, kReadPermission);
350 ProcessLine(Form(
".L %s", logon), kTRUE);
355 logon = gEnv->GetValue(
"Proof.Logon", (
char *)0);
356 if (logon && !NoLogOpt()) {
357 char *mac = gSystem->Which(TROOT::GetMacroPath(), logon, kReadPermission);
364 gInterpreter->SaveContext();
365 gInterpreter->SaveGlobalsContext();
371 if (fConfFile.BeginsWith(
"lite:")) {
374 master.Form(
"proof://%s@__master__", fUser.Data());
377 Int_t port = gEnv->GetValue(
"ProofServ.XpdPort", -1);
386 gEnv->SetValue(
"Proof.ParallelStartup", 0);
389 TPluginManager *pm = gROOT->GetPluginManager();
391 Error(
"CreateServer",
"no plugin manager found");
398 TPluginHandler *h = pm->FindHandler(
"TProof", fConfFile);
400 Error(
"CreateServer",
"no plugin found for TProof with a"
401 " config file of '%s'", fConfFile.Data());
408 if (h->LoadPlugin() == -1) {
409 Error(
"CreateServer",
"plugin for TProof could not be loaded");
416 if (fConfFile.BeginsWith(
"lite:")) {
419 gSystem->RemoveFileHandler(fInputHandler);
420 fProof =
reinterpret_cast<TProof*
>(h->ExecPlugin(6, master.Data(),
423 fSessionDir.Data(), 0));
425 gSystem->AddFileHandler(fInputHandler);
427 fProof =
reinterpret_cast<TProof*
>(h->ExecPlugin(5, master.Data(),
431 fTopSessionTag.Data()));
435 if (fProof) fProof->SaveWorkerInfo();
437 if (!fProof || (fProof && !fProof->IsValid())) {
438 Error(
"CreateServer",
"plugin for TProof could not be executed");
447 fEndMaster = fProof->IsEndMaster();
453 if (!fShutdownTimer) {
455 fShutdownTimer =
new TShutdownTimer(
this, 300000);
456 fShutdownTimer->Start(-1, kFALSE);
461 if (fProtocol <= 17) {
463 msg.Form(
"Warning: client version is too old: automatic schema evolution is ineffective.\n"
464 " This may generate compatibility problems between streamed objects.\n"
465 " The advise is to move to ROOT >= 5.21/02 .");
466 SendAsynMessage(msg.Data());
470 if (IsMaster() && !fIdleTOTimer) {
472 Int_t idle_to = gEnv->GetValue(
"ProofServ.IdleTimeout", -1);
474 fIdleTOTimer =
new TIdleTOTimer(
this, idle_to * 1000);
475 fIdleTOTimer->Start(-1, kTRUE);
476 if (gProofDebugLevel > 0)
477 Info(
"CreateServer",
" idle timer started (%d secs)", idle_to);
478 }
else if (gProofDebugLevel > 0) {
479 Info(
"CreateServer",
" idle timer not started (no idle timeout requested)");
491 TXProofServ::~TXProofServ()
499 void TXProofServ::HandleUrgentData()
502 TProofServLogHandlerGuard hg(fLogFile, fSocket,
"", fRealTimeLog);
506 Int_t iLev = ((TXSocket *)fSocket)->GetInterrupt(fw);
508 Error(
"HandleUrgentData",
"error receiving interrupt");
513 Info("HandleUrgentData", "got interrupt: %d\n", iLev);
522 Info("HandleUrgentData", "*** Ping");
525 if (fw && IsMaster()) {
526 Int_t nbad = fProof->fActiveSlaves->GetSize() - fProof->Ping();
528 Info(
"HandleUrgentData",
"%d slaves did not reply to ping",nbad);
533 if (fAdminPath.IsNull()) {
534 fAdminPath = gEnv->GetValue(
"ProofServ.AdminPath",
"");
537 if (!fAdminPath.IsNull()) {
538 if (!fAdminPath.EndsWith(
".status")) {
540 if (utime(fAdminPath.Data(), 0) != 0)
541 Info(
"HandleUrgentData",
"problems touching path: %s", fAdminPath.Data());
544 Info("HandleUrgentData", "touching path: %s", fAdminPath.Data());
552 Int_t uss_rc = UpdateSessionStatus(-1);
554 Error(
"HandleUrgentData",
"problems updating status path: %s (errno: %d)", fAdminPath.Data(), -uss_rc);
557 Info(
"HandleUrgentData",
"admin path undefined");
562 case TProof::kHardInterrupt:
563 Info(
"HandleUrgentData",
"*** Hard Interrupt");
566 if (fw && IsMaster())
567 fProof->Interrupt(TProof::kHardInterrupt);
570 ((TXSocket *)fSocket)->Flush();
577 case TProof::kSoftInterrupt:
578 Info(
"HandleUrgentData",
"Soft Interrupt");
581 if (fw && IsMaster())
582 fProof->Interrupt(TProof::kSoftInterrupt);
592 case TProof::kShutdownInterrupt:
593 Info(
"HandleUrgentData",
"Shutdown Interrupt");
601 Error(
"HandleUrgentData",
"unexpected type: %d", iLev);
606 if (fProof) fProof->SetActive(kFALSE);
612 void TXProofServ::HandleSigPipe()
616 Info(
"HandleSigPipe",
"got sigpipe ... do nothing");
622 void TXProofServ::HandleTermination()
631 fWaitingQueries->Delete();
633 fProof->InterruptCurrentMonitor();
635 Long_t timeout = gEnv->GetValue(
"Proof.ShutdownTimeout", 60);
636 timeout = (timeout > 20) ? timeout : 20;
638 fProof->StopProcess(kTRUE, (Long_t) (timeout / 2));
640 fProof->Collect(TProof::kActive, timeout);
643 Warning(
"HandleTermination",
"processing could not be stopped");
657 Int_t TXProofServ::Setup()
662 snprintf(str, 512,
"**** Welcome to the PROOF server @ %s ****", gSystem->HostName());
664 snprintf(str, 512,
"**** PROOF worker server @ %s started ****", gSystem->HostName());
667 if (fSocket->Send(str) != 1+
static_cast<Int_t
>(strlen(str))) {
668 Error(
"Setup",
"failed to send proof server startup message");
673 if ((fProtocol = gEnv->GetValue(
"ProofServ.ClientVersion", -1)) < 0) {
674 Error(
"Setup",
"remote proof protocol missing");
679 fUser = gEnv->GetValue(
"ProofServ.Entity",
"");
680 if (fUser.Length() >= 0) {
681 if (fUser.Contains(
":"))
682 fUser.Remove(fUser.Index(
":"));
683 if (fUser.Contains(
"@"))
684 fUser.Remove(fUser.Index(
"@"));
686 UserGroup_t *pw = gSystem->GetUserInfo();
695 TString cf = gEnv->GetValue(
"ProofServ.ProofConfFile",
"");
699 fWorkDir = gEnv->GetValue(
"ProofServ.Sandbox", Form(
"~/%s", kPROOF_WorkDir));
702 if ((fSessionTag = gEnv->GetValue(
"ProofServ.SessionTag",
"-1")) ==
"-1") {
703 Error(
"Setup",
"Session tag missing");
707 if ((fTopSessionTag = gEnv->GetValue(
"ProofServ.TopSessionTag",
"-1")) ==
"-1") {
710 if (gSystem->Getenv(
"ROOTPROOFLOGFILE")) {
711 fTopSessionTag = gSystem->DirName(gSystem->Getenv(
"ROOTPROOFLOGFILE"));
713 if ((lstl = fTopSessionTag.Last(
'/')) != kNPOS) fTopSessionTag.Remove(0, lstl + 1);
714 if (fTopSessionTag.BeginsWith(
"session-")) {
715 fTopSessionTag.Remove(0, strlen(
"session-"));
720 if (fTopSessionTag.IsNull()) {
721 Error(
"Setup",
"top session tag missing");
727 TString spid = Form(
"-%d", gSystem->GetPid());
728 if (!fSessionTag.EndsWith(spid)) {
730 if ((nd = fSessionTag.CountChar(
'-')) >= 2) {
731 Int_t
id = fSessionTag.Index(
"-", fSessionTag.Index(
"-") + 1);
732 if (
id != kNPOS) fSessionTag.Remove(
id);
733 }
else if (nd != 1) {
734 Warning(
"Setup",
"Wrong number of '-' in session tag: protocol error? %s", fSessionTag.Data());
739 if (gProofDebugLevel > 0)
740 Info(
"Setup",
"session tags: %s, %s", fTopSessionTag.Data(), fSessionTag.Data());
743 if ((fSessionDir = gEnv->GetValue(
"ProofServ.SessionDir",
"-1")) ==
"-1") {
744 Error(
"Setup",
"Session dir missing");
749 char *workdir = gSystem->ExpandPathName(fWorkDir.Data());
752 if (gProofDebugLevel > 0)
753 Info(
"Setup",
"working directory set to %s", fWorkDir.Data());
756 if (SetupCommon() != 0) {
757 Error(
"Setup",
"common setup failed");
762 fSocket->SetOption(kNoDelay, 1);
765 fSocket->SetOption(kKeepAlive, 1);
768 gSystem->AddSignalHandler(
new TXProofServSigPipeHandler(
this));
771 gSystem->AddSignalHandler(
new TXProofServTerminationHandler(
this));
774 gSystem->AddSignalHandler(
new TXProofServSegViolationHandler(
this));
776 if (gProofDebugLevel > 0)
777 Info(
"Setup",
"successfully completed");
787 TProofServ::EQueryAction TXProofServ::GetWorkers(TList *workers,
791 TProofServ::EQueryAction rc = kQueryStop;
794 if (gEnv->GetValue(
"ProofServ.UseUserCfg", 0) != 0) {
796 return TProofServ::GetWorkers(workers, pc);
800 Bool_t dynamicStartup = gEnv->GetValue(
"Proof.DynamicStartup", kFALSE);
801 TString seqnum = (dynamicStartup) ?
"" : XPD_GW_Static;
802 if (!fWaitingQueries->IsEmpty()) {
804 seqnum += ((TProofQueryResult *)(fWaitingQueries->First()))->GetSeqNum();
806 seqnum += ((TProofQueryResult *)(fWaitingQueries->Last()))->GetSeqNum();
811 if (dynamicStartup) {
813 Int_t dynto = gEnv->GetValue(
"Proof.DynamicStartupTimeout", -1);
814 Bool_t doto = (dynto > 0) ? kTRUE : kFALSE;
815 while (!(os = ((TXSocket *)fSocket)->SendCoordinator(kGetWorkers, seqnum.Data()))) {
816 if (doto > 0 && --dynto < 0)
break;
818 gSystem->Sleep(1000);
821 os = ((TXSocket *)fSocket)->SendCoordinator(kGetWorkers, seqnum.Data());
828 TString fl(os->GetName());
829 if (fl.BeginsWith(XPD_GW_QueryEnqueued)) {
830 SendAsynMessage(
"+++ Query cannot be processed now: enqueued");
831 return kQueryEnqueued;
836 Bool_t pernode = kFALSE;
837 if (gSystem->Getenv(
"PROOF_NWORKERS")) {
838 TString s(gSystem->Getenv(
"PROOF_NWORKERS"));
839 if (s.EndsWith(
"x")) {
841 s.ReplaceAll(
"x",
"");
845 if (!dynamicStartup && (nwrks > 0)) {
849 msg.Form(
"+++ Starting max %d workers per node following the setting of PROOF_NWORKERS", nwrks);
851 msg.Form(
"+++ Starting max %d workers following the setting of PROOF_NWORKERS", nwrks);
853 SendAsynMessage(msg);
864 TList *nodecnt = (pernode) ?
new TList : 0 ;
865 if (fl.Tokenize(tok, from,
"&")) {
867 TProofNodeInfo *master =
new TProofNodeInfo(tok);
869 Error(
"GetWorkers",
"no appropriate master line got from coordinator");
873 if (fImage.IsNull() && strlen(master->GetImage()) > 0)
874 fImage = master->GetImage();
878 while (fl.Tokenize(tok, from,
"&")) {
880 if (nwrks == -1 || nwrks > 0) {
883 if (pernode && nodecnt) {
884 TProofNodeInfo *ni =
new TProofNodeInfo(tok);
885 TParameter<Int_t> *p = 0;
887 if (!(p = (TParameter<Int_t> *) nodecnt->FindObject(ni->GetNodeName().Data()))) {
888 p =
new TParameter<Int_t>(ni->GetNodeName().Data(), nw);
893 Info(
"GetWorkers",
"%p: name: %s (%s) val: %d (nwrks: %d)",
894 p, p->GetName(), ni->GetNodeName().Data(), nw, nwrks);
896 if (workers) workers->Add(ni);
905 workers->Add(
new TProofNodeInfo(tok));
907 if (nwrks != -1) nwrks--;
912 TProofNodeInfo *ni =
new TProofNodeInfo(tok);
913 ReleaseWorker(ni->GetOrdinal().Data());
921 nodecnt->SetOwner(kTRUE);
933 Bool_t TXProofServ::HandleError(
const void *)
936 if (fSocket && !fSocket->IsValid()) {
938 fSocket->Reconnect();
939 if (fSocket && fSocket->IsValid()) {
942 "%p: connection to local coordinator re-established",
this);
947 Printf(
"TXProofServ::HandleError: %p: got called ...",
this);
955 if (fSocket) ((TXSocket *)fSocket)->SetSessionID(-1);
959 Printf(
"TXProofServ::HandleError: %p: DONE ... ",
this);
968 Bool_t TXProofServ::HandleInput(
const void *in)
971 Printf(
"TXProofServ::HandleInput %p, in: %p",
this, in);
973 XHandleIn_t *hin = (XHandleIn_t *) in;
974 Int_t acod = (hin) ? hin->fInt1 : kXPD_msg;
977 if (acod == kXPD_ping || acod == kXPD_interrupt) {
981 }
else if (acod == kXPD_flush) {
983 Info(
"HandleInput",
"kXPD_flush: flushing log file (stdout)");
986 }
else if (acod == kXPD_urgent) {
988 Int_t type = hin->fInt2;
990 case TXSocket::kStopProcess:
993 Bool_t abort = (hin->fInt3 != 0) ? kTRUE : kFALSE;
995 Int_t timeout = hin->fInt4;
998 fProof->StopProcess(abort, timeout);
1001 fPlayer->StopProcess(abort, timeout);
1005 Info(
"HandleInput",
"kXPD_urgent: unknown type: %d", type);
1008 }
else if (acod == kXPD_inflate) {
1011 Warning(
"HandleInput",
"kXPD_inflate: obsolete message type");
1013 }
else if (acod == kXPD_priority) {
1016 fGroupPriority = hin->fInt2;
1018 fProof->BroadcastGroupPriority(fGroup, fGroupPriority);
1020 Info(
"HandleInput",
"kXPD_priority: group %s priority set to %f",
1021 fGroup.Data(), (Float_t) fGroupPriority / 100.);
1023 }
else if (acod == kXPD_clusterinfo) {
1026 fTotSessions = hin->fInt2;
1027 fActSessions = hin->fInt3;
1028 fEffSessions = (hin->fInt4)/1000.;
1030 Info(
"HandleInput",
"kXPD_clusterinfo: tot: %d, act: %d, eff: %f",
1031 fTotSessions, fActSessions, fEffSessions);
1035 HandleSocketInput();
1037 ((TXSocket *)fSocket)->RemoveClientID();
1047 void TXProofServ::DisableTimeout()
1050 ((TXSocket *)fSocket)->DisableTimeout();
1056 void TXProofServ::EnableTimeout()
1059 ((TXSocket *)fSocket)->EnableTimeout();
1065 void TXProofServ::Terminate(Int_t status)
1070 fTerminated = kTRUE;
1073 Info(
"Terminate",
"starting session termination operations ...");
1074 if (fgLogToSysLog > 0) {
1076 s.Form(
"%s -1 %.3f %.3f", fgSysLogEntity.Data(), fRealTime, fCpuTime);
1077 gSystem->Syslog(kLogNotice, s.Data());
1082 if (!gSystem->GetProcInfo(&pi)){
1083 Info(
"Terminate",
"process memory footprint: %ld/%ld kB virtual, %ld/%ld kB resident ",
1084 pi.fMemVirtual, fgVirtMemMax, pi.fMemResident, fgResMemMax);
1089 fProof->SetMonitor(0, kFALSE);
1094 gSystem->ChangeDirectory(
"/");
1096 gSystem->MakeDirectory(fSessionDir+
"/.delete");
1097 gSystem->Exec(Form(
"%s %s", kRM, fSessionDir.Data()));
1102 if (!(fQMgr && fQMgr->Queries() && fQMgr->Queries()->GetSize())) {
1104 gSystem->ChangeDirectory(
"/");
1106 gSystem->MakeDirectory(fQueryDir+
"/.delete");
1107 gSystem->Exec(Form(
"%s %s", kRM, fQueryDir.Data()));
1110 gSystem->Unlink(fQueryLock->GetName());
1115 fQueryLock->Unlock();
1118 Bool_t abort = (status == 0) ? kFALSE : kTRUE;
1119 if (!fIdle && fPlayer)
1120 fPlayer->StopProcess(abort,1);
1121 gSystem->Sleep(2000);
1125 if (!fDataDir.IsNull() && !gSystem->AccessPathName(fDataDir, kWritePermission)) {
1126 if (UnlinkDataDir(fDataDir))
1127 Info(
"Terminate",
"data directory '%s' has been removed", fDataDir.Data());
1132 gSystem->RemoveFileHandler(fInputHandler);
1135 gSystem->ExitLoop();
1140 TXSocket::fgPipe.Post((TXSocket *)fSocket);
1143 Printf(
"Terminate: termination operations ended: quitting!");
1151 Int_t TXProofServ::LockSession(
const char *sessiontag, TProofLockPath **lck)
1154 if (strstr(sessiontag, fTopSessionTag))
1158 Info(
"LockSession",
"locker space undefined");
1164 TString stag = sessiontag;
1165 TRegexp re(
"session-.*-.*-.*");
1166 Int_t i1 = stag.Index(re);
1168 Info(
"LockSession",
"bad format: %s", sessiontag);
1171 stag.ReplaceAll(
"session-",
"");
1174 Int_t i2 = stag.Index(
":q");
1179 TString parlog = fSessionDir;
1180 parlog = parlog.Remove(parlog.Index(
"master-")+strlen(
"master-"));
1182 if (!gSystem->AccessPathName(parlog)) {
1183 Info(
"LockSession",
"parent still running: do nothing");
1188 TString qlock = fQueryLock->GetName();
1189 qlock.ReplaceAll(fTopSessionTag, stag);
1191 if (!gSystem->AccessPathName(qlock)) {
1192 *lck =
new TProofLockPath(qlock);
1193 if (((*lck)->Lock()) < 0) {
1194 Info(
"LockSession",
"problems locking query lock file");
1208 void TXProofServ::ReleaseWorker(
const char *ord)
1210 if (gDebug > 2) Info(
"ReleaseWorker",
"releasing: %s", ord);
1212 ((TXSocket *)fSocket)->SendCoordinator(kReleaseWorker, ord);