61extern XrdScheduler*
schedP;
63extern XrdOssArcConfig
Config;
78std::deque<XrdOssArcBackupTask*>
79 XrdOssArcBackup::dsBkpQ;
80XrdSysCondVar2 XrdOssArcBackup::dsBkpQCV(XrdOssArcBackup::dsBkpQMtx);
81int XrdOssArcBackup::numRunning = 0;
82int XrdOssArcBackup::maxRunning = 0;
101 Owner.dsBkpSetMtx.Lock();
103 Owner.dsBkpSetMtx.UnLock();
128 char dsnDir[MAXPATHLEN], manPFN[MAXPATHLEN];
138 n = snprintf(dsnDir,
sizeof(dsnDir),
"%s%s/",
Owner.Arena(),
140 if (n >= (
int)
sizeof(dsnDir))
141 {
Elog.Emsg(
"Backup",ENAMETOOLONG,
"create arena path for dataset",
theDSN);
148 {
Elog.Emsg(
"Backup", rc,
"create dataset backup arena", dsnDir);
155 n = snprintf(manPFN,
sizeof(manPFN),
"%sManifest", dsnDir);
156 if (n >= (
int)
sizeof(manPFN))
157 {
Elog.Emsg(
"Backup",ENAMETOOLONG,
"create bkp manifest for dataset",
166 int supArgc =
sizeof(supArgv)/
sizeof(
char*);
170 DEBUG(
"Running "<<
Config.BkpUtilName<<
' '<<supArgv[0]<<
' '<<supArgv[1]<<
171 ' '<<supArgv[2]<<
' '<<supArgv[3]<<
' '<<supArgv[4]<<
172 ' '<<supArgv[5]<<
' '<<supArgv[6]);
177 if (!(rc =
Config.BkpUtilProg->Run(&cmdSup, supArgv, supArgc)))
178 {
char *lp, *retStr = 0;
182 while((lp = cmdSup.
GetLine()))
if (!retStr) retStr = strdup(lp);
185 {n = sscanf(retStr,
"%d %zu", &vf, &vb);
187 else {
char etxt[1024];
188 snprintf(etxt,
sizeof(etxt),
189 "%s setup returned bad output '",
191 Elog.Emsg(
"Backup", etxt, retStr,
"'");
195 Elog.Emsg(
"Backup",
Config.BkpUtilName,
"setup returned no output");
199 Config.BkpUtilProg->RunDone(cmdSup);
200 if (!isOK)
return false;
202 Elog.Emsg(
"Backup",rc,
"run setup via",
Config.BkpUtilName);
210 while(!
fsMon.Permit(
this))
212 snprintf(buff,
sizeof(buff),
"Insufficient free space; defering "
214 Elog.Emsg(
"BkpXeq", buff);
218 snprintf(buff,
sizeof(buff),
"Retrying to archive %s:%s",
227 const char* prpArgv[] = {
"prepare",
theScope, manPFN};
228 int prpArgc =
sizeof(prpArgv)/
sizeof(
char*);
230 DEBUG(
"Running "<<
Config.PrepArcName<<
' '<<prpArgv[0]<<
' '<<prpArgv[1]
233 if (!(rc =
Config.PrepArcProg->Run(&prpSup, prpArgv, prpArgc)))
235 while((lp = prpSup.
GetLine())) {}
236 Config.PrepArcProg->RunDone(prpSup);
238 Elog.Emsg(
"Backup", rc,
"run preparc",
Config.PrepArcName);
251 const char* pstArgv[] = {
"dispose",
theScope, manPFN};
252 int pstArgc =
sizeof(pstArgv)/
sizeof(
char*);
254 DEBUG(
"Running "<<
Config.PrepArcName<<
' '<<pstArgv[0]<<
' '<<pstArgv[1]
257 if (!(rc =
Config.PostArcProg->Run(&pstSup, pstArgv, pstArgc)))
259 while((lp = pstSup.
GetLine())) {}
260 Config.PostArcProg->RunDone(pstSup);
262 Elog.Emsg(
"Backup", rc,
"run postarc",
Config.PostArcName);
272 int finArgc =
sizeof(finArgv)/
sizeof(
char*);
280 DEBUG(
"Running "<<
Config.BkpUtilName<<
' '<<finArgv[0]<<
' '<<finArgv[1]<<
281 ' '<<finArgv[2]<<
' '<<finArgv[3]<<
' '<<
282 (*finArgv[4] ? finArgv[4] :
"n/d")<<
283 ' '<<finArgv[5]<<
' '<<finArgv[6]);
287 if (!(rc =
Config.BkpUtilProg->Run(&cmdFin, finArgv, finArgc)))
289 Config.BkpUtilProg->RunDone(cmdFin);
291 Elog.Emsg(
"Backup",rc,
"run finish via",
Config.BkpUtilName);
315do{
if (!dsBkpQ.empty())
319 bool isOK = bTask->
BkpXeq();
323 snprintf(buff,
sizeof(buff),
"%s:%s",bTask->
theScope,bTask->
theDSN);
324 if (isOK)
Elog.Emsg(
"BkpWorker", buff,
"backed up!");
325 else Elog.Emsg(
"BkpWorker", buff,
"backup failed; will retry later");
343 :
XrdJob(
"Backup"), Scope(scp)
350 snprintf(abuff,
sizeof(abuff),
"%s%s/",
Config.dsetRepoPFN,scp);
353 {
Elog.Emsg(
"Backup", rc,
"create arena", abuff);
356 myArena = strdup(abuff);
365bool XrdOssArcBackup::Add2Bkp(
const char* dsn)
368 char* theDSN = strdup(dsn);
374 auto rslt = dsBkpSet.insert(theDSN);
375 if (!rslt.second) free(theDSN);
378 dsBkpQ.push_back(theTask);
379 if (numRunning < maxRunning) dsBkpQCV.
Signal();
393 char tapPath[MAXPATHLEN];
413 const char* argV[] = {dsDir, tapPath,
Config.arFName,
Config.ArchiverSave};
416 {n = snprintf(tapPath,
sizeof(tapPath),
"%s/%s/%s",
417 Config.tapePath, Scope, dsName);
420 n = snprintf(tapPath,
sizeof(tapPath),
"%s/%s", Scope, dsName);
421 argV[3] =
Config.ArchiverSave;
428 if (n >= (
int)
sizeof(tapPath))
430 snprintf(tapPath,
sizeof(tapPath),
"%s:%s", Scope, dsName);
431 Elog.Emsg(
"Archive", rc,
"generate tape path for dataset", tapPath);
432 Elog.Emsg(
"Archive",
"Dataset",dsName,
"needs manual intervention!!!");
438 DEBUG(
"Running "<<
Config.ArchiverName<<
' '<<argV[0]<<
' '
439 <<argV[1]<<
' '<<argV[2]<<
' '<<argV[3]);
443 n =
sizeof(argV)/
sizeof(
char*);
444 if (!(rc =
Config.ArchiverProg->Run(&cmdOut, argV, n)))
446 while((lp = cmdOut.
GetLine())) {}
447 rc =
Config.ArchiverProg->RunDone(cmdOut);
454 snprintf(rcVal,
sizeof(rcVal),
"%d",rc);
455 Elog.Emsg(
"Archive",
"Archive script failed with rc=", rcVal);
456 Elog.Emsg(
"Archive",
"Dataset", dsName,
"needs manual intervention!!!");
480int XrdOssArcBackup::GetManifest()
482 static const char* manEOL =
"%%%";
483 static const char* lsbArgv[] = {
"list",
Config.metaBKP,
Config.needBKP,
485 static int lsbArgc =
sizeof(lsbArgv)/
sizeof(
char*);
486 static XrdSysMutex manMutex;
490 int rc, dsCnt, dsNew = 0;
505 ' '<<lsbArgv[2]<<
' '<<lsbArgv[3]<<
' '<<lsbArgv[4]);
517 {
if (*lp == *manEOL && !strcmp(lp, manEOL))
521 if (Add2Bkp(lp)) dsNew++;
534 snprintf(buff,
sizeof(buff),
"%d",rc);
535 Elog.
Emsg(
"GetManifest",
"Premature EOF when reading manifest; rc=",buff);
541 dsCnt = dsBkpSet.size();
542 dsBkpSetMtx.UnLock();
546 DEBUG(
"Scope "<<Scope<<
" has "<<dsCnt
547 <<
" dataset(s) needing backup of which "<<dsNew<<
" are new");
561 numRunning = maxRunning = maxw;
566 for (
int i = 0; i < maxw; i++)
567 {
XrdJob* bJob =
new BkpWorker();
573 DEBUG(
"Started "<<maxw<<
" backup workers.");
XrdJob(const char *desc="")
XrdOssArcBackupTask(XrdOssArcBackup &who, char *dsn)
XrdOssArcBackup(const char *scp, bool &isOK)
bool Archive(const char *dsName, const char *dsDir)
friend class XrdOssArcBackupTask
static void StartWorkers(int maxw)
static std::string DSN2Dir(const char *dsn)
int RunDone(XrdOucStream &cmd) const
int Run(XrdOucStream *Sp, const char *argV[], int argc=0, const char *envV[]=0) const
static int makePath(char *path, mode_t mode, bool reset=false)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
XrdSysTrace ArcTrace("OssArc")
XrdSysError Elog(0, "OssArc_")