48#define ENODATA ENOATTR
62 cUp() : ossP(0), buff(0), fd(-1) {}
63 ~cUp() {
if (ossP) ossP->Close();
65 if (fd >= 0)
close(fd);
88 if (cpFile.isActive())
return -EEXIST;
92 if ((rc = ossFile.Fstat(&
Stat)))
return rc;
97 if ((rc = cpFile.Create(lFN,
Stat)))
98 OfsEroute.Emsg(
"ChkPnt", rc,
"create checkpoint for", lFN);
102 OfsEroute.Emsg(
"ChkPnt", cpFile.FName(
true),
"checkpoint created for", lFN);
116 if (cpFile.isActive() && (rc = cpFile.Destroy()))
117 OfsEroute.Emsg(
"ChkPnt", rc,
"delete checkpoint", cpFile.FName());
128int XrdOfsChkPnt::Failed(
const char *opn,
int eRC,
bool *readok)
130 static const mode_t mRO = S_IRUSR | S_IRGRP;
131 const char *eWhat =
"still accessible!";
139 if (rc)
OfsEroute.Emsg(
"ChkPnt", rc,
"chmod 000", lFN);
140 else eWhat =
"made inaccessible";
141 if (readok) *readok =
false;
145 else eWhat =
"made read/only";
146 if (readok) *readok =
true;
152 if ((rc = cpFile.ErrState()))
153 OfsEroute.
Emsg(
"ChkPnt", rc,
"suspend chkpnt", cpFile.FName());
157 if (opn)
OfsEroute.
Emsg(
"ChkPnt", eRC, opn, (lFN ? lFN :
"\'???\'"));
158 if (lFN)
OfsEroute.
Emsg(
"ChkPnt", lFN,
"restore failed;", eWhat);
184 const char *eWhy = 0;
189 if (!cpFile.isActive())
return -ENOENT;
193 if ((rc = cpFile.RestoreInfo(rinfo, eWhy)))
196 eMsg =
"process chkpnt (";
197 if (eWhy)
eMsg.append(eWhy);
201 return Failed(0, rc, readok);
210 rc = ossFile.Open(lFN, O_RDWR, 0, ckpEnv);
211 if (rc)
return Failed(
"open", rc, readok);
217 rc = ossFile.Ftruncate(rinfo.
fSize);
218 if (rc)
return Failed(
"truncate", rc, readok);
225 return Failed(
"write", (rc < 0 ? rc : -EIO), readok);
234 struct timeval utArg[2];
235 utArg[0].tv_sec = utArg[1].tv_sec = rinfo.
mTime;
236 utArg[0].tv_usec = utArg[1].tv_usec = 0;
238 if (rc && rc != -ENOTSUP)
OfsEroute.Emsg(
"ChkPnt", rc,
"set mtime for", lFN);
243 {
OfsEroute.Emsg(
"ChkPnt", rc,
"delete chkpnt", cpFile.FName());
244 return Failed(0, rc, readok);
249 OfsEroute.Emsg(
"ChkPnt", lFN,
"successfully restored.");
264 if (!cpFile.isActive())
return -ENOENT;
268 if (range[0].offset < 0)
return -EINVAL;
272 if (range[0].offset >= fSize)
return 0;
276 dlen = fSize - range[0].
offset;
281 if (!cpFile.Reserve(dlen, 1))
return -ENOSPC;
286 if (!(cup.buff = (
char *)malloc(dlen)))
return -ENOMEM;
290 rc = ossFile.Read(cup.buff, range[0].
offset, dlen);
291 if (rc < 0 || (rc && (rc = cpFile.Append(cup.buff, range[0].
offset, rc))))
299 if (!(rc = cpFile.Sync())) fSize = range[0].
offset;
310 int rc, dlen = 0, buffSZ = 0, numVS = 0;
314 if (!cpFile.isActive())
return -ENOENT;
318 for (
int i = 0; i < rnum; i++)
319 {
if (range[i].offset < 0)
return -EINVAL;
320 if (range[i].offset < fSize && range[i].size)
321 {
if (range[i].size + range[i].offset < fSize) dlen = range[i].
size;
322 else dlen = fSize - range[i].
offset;
324 if (dlen > buffSZ) buffSZ = dlen;
325 range[i].
info = dlen; numVS++;
326 }
else range[i].
info = 0;
331 if (!buffSZ)
return 0;
339 if (!(cup.buff = (
char *)malloc(buffSZ)))
return -ENOMEM;
343 if (!cpFile.Reserve(dlen, numVS))
return -ENOSPC;
348 for (
int i = 0; i < rnum; i++)
350 {rc = ossFile.Read(cup.buff, range[i].
offset, range[i].
info);
352 || (rc && (rc = cpFile.Append(cup.buff, range[i].
offset, rc))))
359 return cpFile.Sync();
int64_t fSize
Original size of the source file.
const char * srcLFN
Pointer to the source filename.
XrdOucIOVec * DataVec
A vector of data that must be written back.
int DataLen
Number of bytes to write back (may be 0)
int DataNum
Number of elements in DataVec (may be 0)
time_t mTime
Original modification time of the source.
int Truncate(struct iov *&range)
int Query(struct iov &range)
int Write(struct iov *&range, int rnum)
int Restore(bool *readok=0)
static const int Fctl_utimes
virtual int Chmod(const char *path, mode_t mode, XrdOucEnv *envP=0)=0
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)