xrootd
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
XrdOssCsiTagstoreFile.hh
Go to the documentation of this file.
1 #ifndef _XRDOSSCSITAGSTOREFILE_H
2 #define _XRDOSSCSITAGSTOREFILE_H
3 /******************************************************************************/
4 /* */
5 /* X r d O s s C s i T a g s t o r e F i l e . h h */
6 /* */
7 /* (C) Copyright 2020 CERN. */
8 /* */
9 /* This file is part of the XRootD software suite. */
10 /* */
11 /* XRootD is free software: you can redistribute it and/or modify it under */
12 /* the terms of the GNU Lesser General Public License as published by the */
13 /* Free Software Foundation, either version 3 of the License, or (at your */
14 /* option) any later version. */
15 /* */
16 /* In applying this licence, CERN does not waive the privileges and */
17 /* immunities granted to it by virtue of its status as an Intergovernmental */
18 /* Organization or submit itself to any jurisdiction. */
19 /* */
20 /* XRootD is distributed in the hope that it will be useful, but WITHOUT */
21 /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
22 /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public */
23 /* License for more details. */
24 /* */
25 /* You should have received a copy of the GNU Lesser General Public License */
26 /* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
27 /* COPYING (GPL license). If not, see <http://www.gnu.org/licenses/>. */
28 /* */
29 /* The copyright holder's institutional names and contributor's names may not */
30 /* be used to endorse or promote products derived from this software without */
31 /* specific prior written permission of the institution or contributor. */
32 /******************************************************************************/
33 
34 #include "XrdOss/XrdOss.hh"
35 #include "XrdOssCsiTagstore.hh"
36 #include "XrdOuc/XrdOucCRC.hh"
37 
38 #include <memory>
39 #include <mutex>
40 #include <byteswap.h>
41 
43 {
44 public:
45  XrdOssCsiTagstoreFile(const std::string &fn, std::unique_ptr<XrdOssDF> fd, const char *tid) : fn_(fn), fd_(std::move(fd)), trackinglen_(0), isOpen(false), tident_(tid), tident(tident_.c_str()) { }
46  virtual ~XrdOssCsiTagstoreFile() { if (isOpen) { (void)Close(); } }
47 
48  virtual int Open(const char *, off_t, int, XrdOucEnv &) /* override */;
49  virtual int Close() /* override */;
50 
51  virtual void Flush() /* override */;
52  virtual int Fsync() /* override */;
53 
54  virtual ssize_t WriteTags(const uint32_t *, off_t, size_t) /* override */;
55  virtual ssize_t ReadTags(uint32_t *, off_t, size_t) /* override */;
56 
57  virtual int Truncate(off_t, bool) /* override */;
58 
59  virtual off_t GetTrackedTagSize() const /* override */
60  {
61  if (!isOpen) return 0;
62  return trackinglen_;
63  }
64 
65  virtual off_t GetTrackedDataSize() const /* override */
66  {
67  if (!isOpen) return 0;
68  return actualsize_;
69  }
70 
71  virtual int ResetSizes(const off_t size) /* override */;
72 
73  virtual int SetTrackedSize(const off_t size) /* override */
74  {
75  if (!isOpen) return -EBADF;
76  if (size > actualsize_)
77  {
78  actualsize_ = size;
79  }
80  if (size != trackinglen_)
81  {
82  const int wtt = WriteTrackedTagSize(size);
83  if (wtt<0) return wtt;
84  }
85  return 0;
86  }
87 
88  virtual bool IsVerified() const /* override */
89  {
90  if (!isOpen) return false;
91  if ((hflags_ & XrdOssCsiTagstore::csVer)) return true;
92  return false;
93  }
94 
95  virtual int SetUnverified()
96  {
97  if (!isOpen) return -EBADF;
99  {
101  return MarshallAndWriteHeader();
102  }
103  return 0;
104  }
105 
106  static ssize_t fullread(XrdOssDF &fd, void *buff, const off_t off , const size_t sz)
107  {
108  size_t toread = sz, nread = 0;
109  uint8_t *p = (uint8_t*)buff;
110  while(toread>0)
111  {
112  const ssize_t rret = fd.Read(&p[nread], off+nread, toread);
113  if (rret<0) return rret;
114  if (rret==0) break;
115  toread -= rret;
116  nread += rret;
117  }
118  if (nread != sz) return -EDOM;
119  return nread;
120  }
121 
122  static ssize_t fullwrite(XrdOssDF &fd, const void *buff, const off_t off , const size_t sz)
123  {
124  size_t towrite = sz, nwritten = 0;
125  const uint8_t *p = (const uint8_t*)buff;
126  while(towrite>0)
127  {
128  const ssize_t wret = fd.Write(&p[nwritten], off+nwritten, towrite);
129  if (wret<0) return wret;
130  towrite -= wret;
131  nwritten += wret;
132  }
133  return nwritten;
134  }
135 
136 private:
137  const std::string fn_;
138  std::unique_ptr<XrdOssDF> fd_;
140  off_t actualsize_;
141  bool isOpen;
142  const std::string tident_;
143  const char *tident;
146  uint8_t header_[20];
147  uint32_t hflags_;
148 
149  ssize_t WriteTags_swap(const uint32_t *, off_t, size_t);
150  ssize_t ReadTags_swap(uint32_t *, off_t, size_t);
151 
152  int WriteTrackedTagSize(const off_t size)
153  {
154  if (!isOpen) return -EBADF;
155  trackinglen_ = size;
156  return MarshallAndWriteHeader();
157  }
158 
160  {
161  if (!isOpen) return -EBADF;
162 
163  uint32_t y = cmagic_;
164  if (fileIsBige_ != machineIsBige_) y = bswap_32(y);
165  memcpy(header_, &y, 4);
166 
167  uint64_t x = trackinglen_;
168  if (fileIsBige_ != machineIsBige_) x = bswap_64(x);
169  memcpy(&header_[4], &x, 8);
170 
171  y = hflags_;
172  if (fileIsBige_ != machineIsBige_) y = bswap_32(y);
173  memcpy(&header_[12], &y, 4);
174 
175  uint32_t cv = XrdOucCRC::Calc32C(header_, 16, 0U);
176  if (machineIsBige_ != fileIsBige_) cv = bswap_32(cv);
177  memcpy(&header_[16], &cv, 4);
178 
179  ssize_t wret = fullwrite(*fd_, header_, 0, 20);
180  if (wret<0) return wret;
181  return 0;
182  }
183 
184  static const uint32_t cmagic_ = 0x30544452U;
185 };
186 
187 #endif
virtual ~XrdOssCsiTagstoreFile()
Definition: XrdOssCsiTagstoreFile.hh:46
static const uint32_t csVer
Definition: XrdOssCsiTagstore.hh:63
off_t actualsize_
Definition: XrdOssCsiTagstoreFile.hh:140
virtual void Flush()
virtual int ResetSizes(const off_t size)
int MarshallAndWriteHeader()
Definition: XrdOssCsiTagstoreFile.hh:159
uint8_t header_[20]
Definition: XrdOssCsiTagstoreFile.hh:146
virtual int Open(const char *, off_t, int, XrdOucEnv &)
virtual bool IsVerified() const
Definition: XrdOssCsiTagstoreFile.hh:88
const std::string fn_
Definition: XrdOssCsiTagstoreFile.hh:137
int WriteTrackedTagSize(const off_t size)
Definition: XrdOssCsiTagstoreFile.hh:152
virtual int SetUnverified()
Definition: XrdOssCsiTagstoreFile.hh:95
bool isOpen
Definition: XrdOssCsiTagstoreFile.hh:141
virtual ssize_t ReadTags(uint32_t *, off_t, size_t)
XrdOssCsiTagstoreFile(const std::string &fn, std::unique_ptr< XrdOssDF > fd, const char *tid)
Definition: XrdOssCsiTagstoreFile.hh:45
Definition: XrdOssCsiTagstoreFile.hh:42
off_t trackinglen_
Definition: XrdOssCsiTagstoreFile.hh:139
Definition: XrdOssCsiTagstore.hh:36
Definition: XrdOucEnv.hh:41
const std::string tident_
Definition: XrdOssCsiTagstoreFile.hh:142
virtual off_t GetTrackedTagSize() const
Definition: XrdOssCsiTagstoreFile.hh:59
j template void())
Definition: XrdOucJson.hh:4121
virtual int Truncate(off_t, bool)
static ssize_t fullwrite(XrdOssDF &fd, const void *buff, const off_t off, const size_t sz)
Definition: XrdOssCsiTagstoreFile.hh:122
static ssize_t fullread(XrdOssDF &fd, void *buff, const off_t off, const size_t sz)
Definition: XrdOssCsiTagstoreFile.hh:106
uint32_t hflags_
Definition: XrdOssCsiTagstoreFile.hh:147
const char * tident
Definition: XrdOssCsiTagstoreFile.hh:143
virtual ssize_t Read(off_t offset, size_t size)
Definition: XrdOss.hh:281
static const uint32_t cmagic_
Definition: XrdOssCsiTagstoreFile.hh:184
virtual ssize_t WriteTags(const uint32_t *, off_t, size_t)
virtual off_t GetTrackedDataSize() const
Definition: XrdOssCsiTagstoreFile.hh:65
bool machineIsBige_
Definition: XrdOssCsiTagstoreFile.hh:144
ssize_t WriteTags_swap(const uint32_t *, off_t, size_t)
bool fileIsBige_
Definition: XrdOssCsiTagstoreFile.hh:145
Definition: XrdOss.hh:62
virtual int SetTrackedSize(const off_t size)
Definition: XrdOssCsiTagstoreFile.hh:73
virtual int Fsync()
static uint32_t Calc32C(const void *data, size_t count, uint32_t prevcs=0)
virtual int Close()
std::unique_ptr< XrdOssDF > fd_
Definition: XrdOssCsiTagstoreFile.hh:138
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
Definition: XrdOss.hh:345
ssize_t ReadTags_swap(uint32_t *, off_t, size_t)