Logo ROOT  
Reference Guide
TDCacheFile.cxx
Go to the documentation of this file.
1// @(#)root/dcache:$Id$
2// Author: Grzegorz Mazur 20/01/2002
3// Modified: William Tanenbaum 01/12/2003
4// Modified: Tigran Mkrtchyan 29/06/2004
5// Modified: Tigran Mkrtchyan 06/07/2007
6
7/*************************************************************************
8 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
9 * All rights reserved. *
10 * *
11 * For the licensing terms see $ROOTSYS/LICENSE. *
12 * For the list of contributors see $ROOTSYS/README/CREDITS. *
13 *************************************************************************/
14
15/**
16\class TDCacheFile
17\ingroup IO
18A TDCacheFile is like a normal TFile except that it may read and
19write its data via a dCache server (for more on the dCache daemon
20see http://www-dcache.desy.de/. Given a path which doesn't belong
21to the dCache managed filesystem, it falls back to the ordinary
22TFile behaviour.
23*/
24
25#include "TDCacheFile.h"
26#include "TError.h"
27#include "TSystem.h"
28#include "TROOT.h"
29
30#include <cstdlib>
31#include <errno.h>
32#include <sys/stat.h>
33#include <sys/types.h>
34
35#include <dcap.h>
36#ifndef R__WIN32
37#include <unistd.h>
38#if defined(R__SUN) || defined(R__HPUX) || \
39 defined(R__AIX) || defined(R__LINUX) || defined(R__SOLARIS) || \
40 defined(R__HIUX) || defined(R__FBSD) || defined(R__MACOSX) || \
41 defined(R__HURD) || defined(R__OBSD)
42#define HAS_DIRENT
43#endif
44#endif
45
46#ifdef HAS_DIRENT
47#include <dirent.h>
48#endif
49
50static const char* const DCACHE_PREFIX = "dcache:";
51static const size_t DCACHE_PREFIX_LEN = strlen(DCACHE_PREFIX);
52static const char* const DCAP_PREFIX = "dcap:";
53static const size_t DCAP_PREFIX_LEN = strlen(DCAP_PREFIX);
54
55
57
58////////////////////////////////////////////////////////////////////////////////
59/// Create a dCache file object.
60///
61/// A dCache file is the same as a TFile
62/// except that it is being accessed via a dCache server. The url
63/// argument must be of the form: \a dcache:/pnfs/<path>/<file>.root or
64/// \a dcap://<nodename.org>/<path>/<file>.root. If the file specified in the
65/// URL does not exist, is not accessable or can not be created the kZombie
66/// bit will be set in the TDCacheFile object. Use IsZombie() to see if the
67/// file is accessable. For a description of the option and other arguments
68/// see the TFile ctor. The preferred interface to this constructor is
69/// via TFile::Open().
70
71TDCacheFile::TDCacheFile(const char *path, Option_t *option,
72 const char *ftitle, Int_t compress):
73 TFile(path, "NET", ftitle, compress)
74{
75 TString pathString = GetDcapPath(path);
76 path = pathString.Data();
77
78 fOption = option;
81
82 if (fOption == "NEW")
83 fOption = "CREATE";
84
85 Bool_t create = (fOption == "CREATE") ? kTRUE : kFALSE;
86 Bool_t recreate = (fOption == "RECREATE") ? kTRUE : kFALSE;
87 Bool_t update = (fOption == "UPDATE") ? kTRUE : kFALSE;
88 Bool_t read = (fOption == "READ") ? kTRUE : kFALSE;
89 if (!create && !recreate && !update && !read) {
90 read = kTRUE;
91 fOption = "READ";
92 }
93
94 TString stmp;
95 TString stmp2;
96 const char *fname;
97 const char *fnameWithPrefix;
98
99 if (!strncmp(path, DCAP_PREFIX, DCAP_PREFIX_LEN)) {
100 fnameWithPrefix = fname = path;
101 } else {
102 // Metadata provided by PNFS
103 char *tname;
104 if ((tname = gSystem->ExpandPathName(path))) {
105 stmp = tname;
106 stmp2 = DCACHE_PREFIX;
107 stmp2 += tname;
108 delete [] tname;
109 fname = stmp;
110 fnameWithPrefix = stmp2;
111 } else {
112 Error("TDCacheFile", "error expanding path %s", path);
113 goto zombie;
114 }
115 }
116
117 if (recreate) {
118 if (!gSystem->AccessPathName(fnameWithPrefix, kFileExists))
119 dc_unlink(fname);
120 recreate = kFALSE;
121 create = kTRUE;
122 fOption = "CREATE";
123 }
124 if (create && !gSystem->AccessPathName(fnameWithPrefix, kFileExists)) {
125 Error("TDCacheFile", "file %s already exists", fname);
126 goto zombie;
127 }
128 if (update) {
129 if (gSystem->AccessPathName(fnameWithPrefix, kFileExists)) {
130 update = kFALSE;
131 create = kTRUE;
132 }
133 if (update && gSystem->AccessPathName(fnameWithPrefix, kWritePermission)) {
134 Error("TDCacheFile", "no write permission, could not open file %s", fname);
135 goto zombie;
136 }
137 }
138
139 // Connect to file system stream
140 fRealName = fname;
141
142 if (create || update) {
143#ifndef WIN32
144 fD = SysOpen(fname, O_RDWR | O_CREAT, 0644);
145#else
146 fD = SysOpen(fname, O_RDWR | O_CREAT | O_BINARY, S_IREAD | S_IWRITE);
147#endif
148 if (fD == -1) {
149 SysError("TDCacheFile", "file %s can not be opened", fname);
150 goto zombie;
151 }
153 } else {
154#ifndef WIN32
155 fD = SysOpen(fname, O_RDONLY, 0644);
156#else
157 fD = SysOpen(fname, O_RDONLY | O_BINARY, S_IREAD | S_IWRITE);
158#endif
159 if (fD == -1) {
160 if (gSystem->AccessPathName(fnameWithPrefix, kFileExists)) {
161 Error("TDCacheFile", "file %s does not exist", fname);
162 goto zombie;
163 }
164 if (gSystem->AccessPathName(fnameWithPrefix, kReadPermission)) {
165 Error("TDCacheFile", "no read permission, could not open file %s", fname);
166 goto zombie;
167 }
168 SysError("TDCacheFile", "file %s can not be opened for reading", fname);
169 goto zombie;
170 }
172 }
173
174 // use 128K ( default ) read-ahead buffer to get file header,
175 // the buffer size can be overriden by env var "DCACHE_RA_BUFFER",
176 // vector read are not affected by read-ahead buffer
177 if (read) {
178 int dcache_RAHEAD_SIZE = RAHEAD_BUFFER_SIZE;
179 const char *DCACHE_RA_BUFFER = gSystem->Getenv("DCACHE_RA_BUFFER");
180 if (DCACHE_RA_BUFFER) {
181 int ra_buffer = atoi(DCACHE_RA_BUFFER);
182 dcache_RAHEAD_SIZE = ra_buffer<=0 ? dcache_RAHEAD_SIZE : ra_buffer;
183 }
184 dc_setBufferSize(fD, dcache_RAHEAD_SIZE);
185 } else {
186 dc_noBuffering(fD);
187 }
188
189 Init(create);
190
191 return;
192
193zombie:
194 // error in file opening occured, make this object a zombie
195 MakeZombie();
197}
198
199////////////////////////////////////////////////////////////////////////////////
200/// Close and cleanup dCache file.
201
203{
204 Close();
205}
206
207////////////////////////////////////////////////////////////////////////////////
208/// Read specified byte range from remote file via dCache daemon.
209/// Returns kTRUE in case of error.
210
212{
213 Int_t st;
214 if ((st = ReadBufferViaCache(buf, len))) {
215 if (st == 2)
216 return kTRUE;
217 return kFALSE;
218 }
219
220 return TFile::ReadBuffer(buf, len);
221}
222
223////////////////////////////////////////////////////////////////////////////////
224/// Read specified byte range from remote file via dCache daemon.
225/// Returns kTRUE in case of error.
226
228{
229 SetOffset(pos);
230 Int_t st;
231 if ((st = ReadBufferViaCache(buf, len))) {
232 if (st == 2)
233 return kTRUE;
234 return kFALSE;
235 }
236
237 return TFile::ReadBuffer(buf, pos, len);
238}
239
240////////////////////////////////////////////////////////////////////////////////
241/// Read the nbuf blocks described in arrays pos and len,
242/// where pos[i] is the seek position of block i of length len[i].
243/// Note that for nbuf=1, this call is equivalent to TFile::ReafBuffer.
244/// This function is overloaded by TNetFile, TWebFile, etc.
245/// Returns kTRUE in case of failure.
246
248{
249#ifdef _IOVEC2_
250
251 iovec2 *vector;
252
253 vector = (iovec2 *)malloc(sizeof(iovec2)*nbuf);
254
255 Int_t total_len = 0;
256 for (Int_t i = 0; i < nbuf; i++) {
257 vector[i].buf = &buf[total_len];
258 vector[i].offset = pos[i] + fArchiveOffset;
259 vector[i].len = len[i];
260 total_len += len[i];
261 }
262
263 Int_t rc = dc_readv2(fD, vector, nbuf);
264 free(vector);
265
266 if (rc == 0) {
267 fBytesRead += total_len;
268 SetFileBytesRead(GetFileBytesRead() + total_len);
269 return kFALSE;
270 }
271
272#endif
273
274 // if we failed to get with dc_readv2 (old server), try to loop over
275
276 Int_t k = 0;
277 Bool_t result = kTRUE;
279 fCacheRead = 0;
280
281 Long64_t low = pos[0];
282 Long64_t high = pos[nbuf-1] + len[nbuf-1] - pos[0];
283
284 Long64_t total = 0;
285 for(Int_t j=0; j < nbuf; j++) {
286 total += len[j];
287 }
288
289 if ( total && high / total < 10 ) {
290
291 char *temp = new char[high];
292 Seek(low);
293 result = ReadBuffer(temp,high);
294
295 if (result==0) {
296 for (Int_t i = 0; i < nbuf; i++) {
297 memcpy(&buf[k], &(temp[pos[i]-pos[0]]), len[i]);
298 k += len[i];
299 }
300 }
301
302 delete [] temp;
303
304 } else {
305
306 for (Int_t i = 0; i < nbuf; i++) {
307 Seek(pos[i]);
308 result = ReadBuffer(&buf[k], len[i]);
309 if (result) break;
310 k += len[i];
311 }
312
313 }
314
315 fCacheRead = old;
316 return result;
317}
318
319////////////////////////////////////////////////////////////////////////////////
320/// Write specified byte range to remote file via dCache daemon.
321/// Returns kTRUE in case of error.
322
324{
325 if (!IsOpen() || !fWritable) return kTRUE;
326
327 Int_t st;
328 if ((st = WriteBufferViaCache(buf, len))) {
329 if (st == 2)
330 return kTRUE;
331 return kFALSE;
332 }
333
334 return TFile::WriteBuffer(buf, len);
335}
336
337////////////////////////////////////////////////////////////////////////////////
338/// Stage() returns kTRUE on success and kFALSE on failure.
339
340Bool_t TDCacheFile::Stage(const char *path, UInt_t after, const char *location)
341{
342 TString pathString = GetDcapPath(path);
343 path = pathString.Data();
344
345 dc_errno = 0;
346
347 if (dc_stage(path, after, location) == 0)
348 return kTRUE;
349
350 if (dc_errno != 0)
351 gSystem->SetErrorStr(dc_strerror(dc_errno));
352
353 return kFALSE;
354}
355
356////////////////////////////////////////////////////////////////////////////////
357/// CheckFile() returns kTRUE on success and kFALSE on failure. In
358/// case the file exists but is not cached, CheckFile() returns
359/// kFALSE and errno is set to EAGAIN.
360
361Bool_t TDCacheFile::CheckFile(const char *path, const char *location)
362{
363 TString pathString = GetDcapPath(path);
364 path = pathString.Data();
365
366 dc_errno = 0;
367
368 if (dc_check(path, location) == 0)
369 return kTRUE;
370
371 if (dc_errno != 0)
372 gSystem->SetErrorStr(dc_strerror(dc_errno));
373
374 return kFALSE;
375}
376
377////////////////////////////////////////////////////////////////////////////////
378/// Set file open timeout.
379
381{
382 dc_setOpenTimeout(n);
383}
384
385////////////////////////////////////////////////////////////////////////////////
386/// Set on error handler.
387
389{
390 dc_setOnError(a);
391}
392
393////////////////////////////////////////////////////////////////////////////////
394/// Set reply host name.
395
396void TDCacheFile::SetReplyHostName(const char *host_name)
397{
398 dc_setReplyHostName((char*)host_name);
399}
400
401////////////////////////////////////////////////////////////////////////////////
402/// Return dCache version string.
403
405{
406 return getDcapVersion();
407}
408
409////////////////////////////////////////////////////////////////////////////////
410/// Interface to system open. All arguments like in POSIX open.
411
412Int_t TDCacheFile::SysOpen(const char *pathname, Int_t flags, UInt_t mode)
413{
414 // often there is a filewall on front of storage system.
415 // let clients connect to the data servers
416 // if it's an old dCache version, pool will try to connect to the client
417 // (if it's fine with firewall)
418
419 dc_setClientActive();
420
421 dc_errno = 0;
422
423 Int_t rc = dc_open(pathname, flags, (Int_t) mode);
424
425 if (rc < 0) {
426 if (dc_errno != 0)
427 gSystem->SetErrorStr(dc_strerror(dc_errno));
428 }
429
430 return rc;
431}
432
433////////////////////////////////////////////////////////////////////////////////
434/// Interface to system close. All arguments like in POSIX close.
435
437{
438 dc_errno = 0;
439
440 Int_t rc = dc_close(fd);
441
442 if (rc < 0) {
443 if (dc_errno != 0)
444 gSystem->SetErrorStr(dc_strerror(dc_errno));
445 }
446
447 return rc;
448}
449
450////////////////////////////////////////////////////////////////////////////////
451/// Interface to system read. All arguments like in POSIX read.
452
454{
455 dc_errno = 0;
456
457 Int_t rc = dc_read(fd, buf, len);
458
459 if (rc < 0) {
460 if (dc_errno != 0)
461 gSystem->SetErrorStr(dc_strerror(dc_errno));
462 }
463
464 return rc;
465}
466
467////////////////////////////////////////////////////////////////////////////////
468/// Interface to system write. All arguments like in POSIX write.
469
470Int_t TDCacheFile::SysWrite(Int_t fd, const void *buf, Int_t len)
471{
472 dc_errno = 0;
473
474 Int_t rc = dc_write(fd, (char *)buf, len);
475
476 if (rc < 0) {
477 if (dc_errno != 0)
478 gSystem->SetErrorStr(dc_strerror(dc_errno));
479 }
480
481 return rc;
482}
483
484////////////////////////////////////////////////////////////////////////////////
485/// Interface to system seek. All arguments like in POSIX lseek.
486
488{
489 dc_errno = 0;
490
491 Long64_t rc = dc_lseek64(fd, offset, whence);
492
493 if (rc < 0) {
494 if (dc_errno != 0)
495 gSystem->SetErrorStr(dc_strerror(dc_errno));
496 }
497
498 return rc;
499}
500
501////////////////////////////////////////////////////////////////////////////////
502/// Interface to system sync. All arguments like in POSIX fsync.
503/// dCache always keep it's files sync'ed, so there's no need to
504/// sync() them manually.
505
507{
508 Int_t rc;
509 dc_errno = 0;
510
511 rc = dc_fsync(fd);
512 if (rc < 0) {
513 if (dc_errno != 0)
514 gSystem->SetErrorStr(dc_strerror(dc_errno));
515 }
516
517 return rc;
518}
519
520////////////////////////////////////////////////////////////////////////////////
521/// Get info about a file: id, size, flags, modification time.
522///
523/// \param[in] id (statbuf.st_dev << 24) + statbuf.st_ino
524/// \param[in] size The file size
525/// \param[in] flags File type: 0 is regular file, bit 0 set executable, bit 1 set directory, bit 2 set special file (socket, fifo, pipe, etc.)
526/// \param[in] modtime Modification time.
527/// The function returns 0 in case of success and 1 if the file could
528/// not be stat'ed.
529
531 Long_t *flags, Long_t *modtime)
532{
533 // If in read mode, uses the cached file status, if available, to avoid
534 // costly dc_stat() call.
535
536 struct stat64 & statbuf = fStatBuffer; // reference the cache
537
538 if (fOption != "READ" || !fStatCached) {
539 // We are not in read mode, or the file status information is not yet
540 // in the cache. Update or read the status information with dc_stat().
541
542 const char *path = GetName();
543 TString pathString = GetDcapPath(path);
544 path = pathString.Data();
545
546 if (path && (dc_stat64(path, &statbuf) >= 0)) {
548 }
549 }
550
551 if (fStatCached) {
552 if (id)
553 *id = (statbuf.st_dev << 24) + statbuf.st_ino;
554 if (size)
555 *size = statbuf.st_size;
556 if (modtime)
557 *modtime = statbuf.st_mtime;
558 if (flags) {
559 *flags = 0;
560 if (statbuf.st_mode & ((S_IEXEC)|(S_IEXEC>>3)|(S_IEXEC>>6)))
561 *flags |= 1;
562 if ((statbuf.st_mode & S_IFMT) == S_IFDIR)
563 *flags |= 2;
564 if ((statbuf.st_mode & S_IFMT) != S_IFREG &&
565 (statbuf.st_mode & S_IFMT) != S_IFDIR)
566 *flags |= 4;
567 }
568 return 0;
569 }
570 return 1;
571}
572
573////////////////////////////////////////////////////////////////////////////////
574/// Method resetting the dc_errno and errno.
575
577{
578 dc_errno = 0;
580}
581
582////////////////////////////////////////////////////////////////////////////////
583/// Transform the input path into a path usuable by the dcap C library,
584/// i.e either \a dcap://nodename.org/where/filename.root or
585/// \a /pnfs/where/filename.root
586
588{
589 // eat all 'dcache:' prefixes
590 while (!strncmp(path, DCACHE_PREFIX, DCACHE_PREFIX_LEN)) {
591 path += DCACHE_PREFIX_LEN;
592 }
593
594 TUrl url(path);
595 TString pathString(url.GetUrl());
596
597 // convert file://path url and dcap:///path to /path
598 if(!strncmp(url.GetProtocol(), "file", 4) || !strcmp(url.GetHost(),"")){
599 pathString = url.GetFile();
600 }
601
602 return pathString;
603}
604
605
606////////////////////////////////////////////////////////////////////////////////
607/// Create helper class that allows directory access via dCache.
608
609TDCacheSystem::TDCacheSystem() : TSystem("-DCache", "DCache Helper System")
610{
611 // name must start with '-' to bypass the TSystem singleton check
612 SetName("DCache");
613
614 fDirp = 0;
615}
616
617////////////////////////////////////////////////////////////////////////////////
618/// Create a directory.
619
620int TDCacheSystem::MakeDirectory(const char *path)
621{
622 Int_t rc;
623 dc_errno = 0;
624 TString pathString = TDCacheFile::GetDcapPath(path);
625 path = pathString.Data();
626
627 rc = dc_mkdir(path, 0755);
628 if (rc < 0) {
629 if (dc_errno != 0)
630 gSystem->SetErrorStr(dc_strerror(dc_errno));
631 }
632
633 return rc;
634}
635
636////////////////////////////////////////////////////////////////////////////////
637/// Open a directory.
638
639void *TDCacheSystem::OpenDirectory(const char *path)
640{
641 dc_errno = 0;
642 TString pathString = TDCacheFile::GetDcapPath(path);
643 path = pathString.Data();
644
645 fDirp = dc_opendir(path);
646 if (fDirp == 0) {
647 if (dc_errno != 0)
648 gSystem->SetErrorStr(dc_strerror(dc_errno));
649 }
650
651 return fDirp;
652}
653
654////////////////////////////////////////////////////////////////////////////////
655/// Close a directory.
656
658{
659 Int_t rc;
660 dc_errno = 0;
661
662 rc = dc_closedir((DIR *)dirp);
663 if (rc < 0) {
664 if (dc_errno != 0)
665 gSystem->SetErrorStr(dc_strerror(dc_errno));
666 }
667
668 fDirp = 0;
669 return;
670}
671
672////////////////////////////////////////////////////////////////////////////////
673/// Get a directory entry.
674
675const char *TDCacheSystem::GetDirEntry(void * dirp)
676{
677 struct dirent *ent;
678 dc_errno = 0;
679
680 ent = dc_readdir((DIR *)dirp);
681 if (ent == 0) {
682 if (dc_errno != 0)
683 gSystem->SetErrorStr(dc_strerror(dc_errno));
684 }
685
686 return !ent ? 0 : ent->d_name;
687}
688
689////////////////////////////////////////////////////////////////////////////////
690/// Returns FALSE if one can access a file using the specified access mode.
691/// Mode is the same as for the Unix access(2) function.
692/// Attention, bizarre convention of return value!!
693
695{
696 TString pathString = TDCacheFile::GetDcapPath(path);
697 path = pathString.Data();
698
699 return dc_access(path, mode);
700}
701
702////////////////////////////////////////////////////////////////////////////////
703/// Get info about a file. Info is returned in the form of a FileStat_t
704/// structure (see TSystem.h).
705/// The function returns 0 in case of success and 1 if the file could
706/// not be stat'ed.
707
708int TDCacheSystem::GetPathInfo(const char *path, FileStat_t &buf)
709{
710 TString pathString = TDCacheFile::GetDcapPath(path);
711 path = pathString.Data();
712
713 struct stat64 sbuf;
714
715 if (path && (dc_stat64(path, &sbuf) >= 0)) {
716
717 buf.fDev = sbuf.st_dev;
718 buf.fIno = sbuf.st_ino;
719 buf.fMode = sbuf.st_mode;
720 buf.fUid = sbuf.st_uid;
721 buf.fGid = sbuf.st_gid;
722 buf.fSize = sbuf.st_size;
723 buf.fMtime = sbuf.st_mtime;
724 buf.fIsLink = kFALSE;
725
726 return 0;
727 }
728 return 1;
729}
static void update(gsl_integration_workspace *workspace, double a1, double b1, double area1, double error1, double a2, double b2, double area2, double error2)
int Int_t
Definition: RtypesCore.h:41
unsigned int UInt_t
Definition: RtypesCore.h:42
const Bool_t kFALSE
Definition: RtypesCore.h:88
long Long_t
Definition: RtypesCore.h:50
bool Bool_t
Definition: RtypesCore.h:59
long long Long64_t
Definition: RtypesCore.h:69
const Bool_t kTRUE
Definition: RtypesCore.h:87
const char Option_t
Definition: RtypesCore.h:62
#define ClassImp(name)
Definition: Rtypes.h:365
static const char *const DCACHE_PREFIX
Definition: TDCacheFile.cxx:50
static const size_t DCAP_PREFIX_LEN
Definition: TDCacheFile.cxx:53
static const size_t DCACHE_PREFIX_LEN
Definition: TDCacheFile.cxx:51
static const char *const DCAP_PREFIX
Definition: TDCacheFile.cxx:52
#define RAHEAD_BUFFER_SIZE
Definition: TDCacheFile.h:23
#define gDirectory
Definition: TDirectory.h:223
static unsigned int total
#define gROOT
Definition: TROOT.h:415
EAccessMode
Definition: TSystem.h:44
@ kFileExists
Definition: TSystem.h:45
@ kReadPermission
Definition: TSystem.h:48
@ kWritePermission
Definition: TSystem.h:47
R__EXTERN TSystem * gSystem
Definition: TSystem.h:560
#define free
Definition: civetweb.c:1539
#define O_BINARY
Definition: civetweb.c:799
#define malloc
Definition: civetweb.c:1536
A TDCacheFile is like a normal TFile except that it may read and write its data via a dCache server (...
Definition: TDCacheFile.h:25
Int_t SysWrite(Int_t fd, const void *buf, Int_t len)
Interface to system write. All arguments like in POSIX write.
Int_t SysStat(Int_t fd, Long_t *id, Long64_t *size, Long_t *flags, Long_t *modtime)
Get info about a file: id, size, flags, modification time.
Int_t SysClose(Int_t fd)
Interface to system close. All arguments like in POSIX close.
Bool_t fStatCached
! (transient) is file status cached?
Definition: TDCacheFile.h:28
~TDCacheFile()
Close and cleanup dCache file.
Long64_t SysSeek(Int_t fd, Long64_t offset, Int_t whence)
Interface to system seek. All arguments like in POSIX lseek.
static Bool_t CheckFile(const char *path, const char *location=0)
CheckFile() returns kTRUE on success and kFALSE on failure.
static void SetOnError(EOnErrorAction=kOnErrorDefault)
Set on error handler.
static void SetOpenTimeout(UInt_t secs)
Set file open timeout.
Int_t SysRead(Int_t fd, void *buf, Int_t len)
Interface to system read. All arguments like in POSIX read.
Bool_t WriteBuffer(const char *buf, Int_t len)
Write specified byte range to remote file via dCache daemon.
EOnErrorAction
Note: This must be kept in sync with values #defined in dcap.h.
Definition: TDCacheFile.h:61
static Bool_t Stage(const char *path, UInt_t secs, const char *location=0)
Stage() returns kTRUE on success and kFALSE on failure.
Bool_t ReadBuffer(char *buf, Int_t len)
Read specified byte range from remote file via dCache daemon.
Int_t SysSync(Int_t fd)
Interface to system sync.
struct stat64 fStatBuffer
! (transient) Cached file status buffer (for performance)
Definition: TDCacheFile.h:29
static const char * GetDcapVersion()
Return dCache version string.
static TString GetDcapPath(const char *path)
Transform the input path into a path usuable by the dcap C library, i.e either dcap://nodename....
Int_t SysOpen(const char *pathname, Int_t flags, UInt_t mode)
Interface to system open. All arguments like in POSIX open.
Bool_t ReadBuffers(char *buf, Long64_t *pos, Int_t *len, Int_t nbuf)
Read the nbuf blocks described in arrays pos and len, where pos[i] is the seek position of block i of...
static void SetReplyHostName(const char *host_name)
Set reply host name.
void ResetErrno() const
Method resetting the dc_errno and errno.
void * fDirp
directory handler
Definition: TDCacheFile.h:82
Bool_t AccessPathName(const char *path, EAccessMode mode)
Returns FALSE if one can access a file using the specified access mode.
Int_t GetPathInfo(const char *path, FileStat_t &buf)
Get info about a file.
const char * GetDirEntry(void *dirp)
Get a directory entry.
void FreeDirectory(void *dirp)
Close a directory.
void * OpenDirectory(const char *name)
Open a directory.
Int_t MakeDirectory(const char *name)
Create a directory.
TDCacheSystem()
Create helper class that allows directory access via dCache.
Bool_t fWritable
True if directory is writable.
A cache when reading files over the network.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Definition: TFile.h:48
Long64_t fBytesRead
Number of bytes read from this file.
Definition: TFile.h:71
virtual void Seek(Long64_t offset, ERelativeTo pos=kBeg)
Seek to a specific position in the file. Pos it either kBeg, kCur or kEnd.
Definition: TFile.cxx:2115
static void SetFileBytesRead(Long64_t bytes=0)
Definition: TFile.cxx:4424
Int_t WriteBufferViaCache(const char *buf, Int_t len)
Write buffer via cache.
Definition: TFile.cxx:2360
static Long64_t GetFileBytesRead()
Static function returning the total number of bytes read from all files.
Definition: TFile.cxx:4390
Int_t ReadBufferViaCache(char *buf, Int_t len)
Read buffer via cache.
Definition: TFile.cxx:1733
Long64_t fArchiveOffset
!Offset at which file starts in archive
Definition: TFile.h:96
virtual Bool_t IsOpen() const
Returns kTRUE in case file is open and kFALSE if file is not open.
Definition: TFile.cxx:1362
virtual void Init(Bool_t create)
Initialize a TFile object.
Definition: TFile.cxx:534
TString fOption
File options.
Definition: TFile.h:86
virtual Bool_t WriteBuffer(const char *buf, Int_t len)
Write a buffer to the file.
Definition: TFile.cxx:2317
Int_t fD
File descriptor.
Definition: TFile.h:77
TFileCacheRead * fCacheRead
!Pointer to the read cache (if any)
Definition: TFile.h:93
TString fRealName
Effective real file name (not original url)
Definition: TFile.h:85
virtual void SetOffset(Long64_t offset, ERelativeTo pos=kBeg)
Set position from where to start reading.
Definition: TFile.cxx:2094
void Close(Option_t *option="") override
Close a file.
Definition: TFile.cxx:856
virtual Bool_t ReadBuffer(char *buf, Int_t len)
Read a buffer from the file.
Definition: TFile.cxx:1614
virtual void SetName(const char *name)
Set the name of the TNamed.
Definition: TNamed.cxx:140
virtual const char * GetName() const
Returns name of object.
Definition: TNamed.h:47
virtual void SysError(const char *method, const char *msgfmt,...) const
Issue system error message.
Definition: TObject.cxx:894
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition: TObject.cxx:880
void MakeZombie()
Definition: TObject.h:49
Basic string class.
Definition: TString.h:131
const char * Data() const
Definition: TString.h:364
void ToUpper()
Change string to upper case.
Definition: TString.cxx:1138
Abstract base class defining a generic interface to the underlying Operating System.
Definition: TSystem.h:268
static void ResetErrno()
Static function resetting system error number.
Definition: TSystem.cxx:286
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
Definition: TSystem.cxx:1265
virtual const char * Getenv(const char *env)
Get environment variable.
Definition: TSystem.cxx:1653
virtual Bool_t AccessPathName(const char *path, EAccessMode mode=kFileExists)
Returns FALSE if one can access a file using the specified access mode.
Definition: TSystem.cxx:1287
void SetErrorStr(const char *errstr)
Set the system error string.
Definition: TSystem.cxx:251
This class represents a WWW compatible URL.
Definition: TUrl.h:35
const char * GetUrl(Bool_t withDeflt=kFALSE) const
Return full URL.
Definition: TUrl.cxx:385
const char * GetFile() const
Definition: TUrl.h:71
const char * GetHost() const
Definition: TUrl.h:69
const char * GetProtocol() const
Definition: TUrl.h:66
const Int_t n
Definition: legend1.C:16
Int_t fMode
Definition: TSystem.h:128
Long64_t fSize
Definition: TSystem.h:131
Long_t fDev
Definition: TSystem.h:126
Int_t fGid
Definition: TSystem.h:130
Long_t fMtime
Definition: TSystem.h:132
Long_t fIno
Definition: TSystem.h:127
Bool_t fIsLink
Definition: TSystem.h:133
Int_t fUid
Definition: TSystem.h:129
auto * a
Definition: textangle.C:12