xrootd
Loading...
Searching...
No Matches
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"
38
39#include <memory>
40#include <mutex>
41
43{
44public:
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
136private:
137 const std::string fn_;
138 std::unique_ptr<XrdOssDF> fd_;
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
Definition XrdOssCsiTagstoreFile.hh:43
ssize_t ReadTags_swap(uint32_t *, off_t, size_t)
virtual ~XrdOssCsiTagstoreFile()
Definition XrdOssCsiTagstoreFile.hh:46
bool isOpen
Definition XrdOssCsiTagstoreFile.hh:141
ssize_t WriteTags_swap(const uint32_t *, off_t, size_t)
const std::string tident_
Definition XrdOssCsiTagstoreFile.hh:142
virtual int Fsync()
virtual off_t GetTrackedTagSize() const
Definition XrdOssCsiTagstoreFile.hh:59
virtual ssize_t WriteTags(const uint32_t *, off_t, size_t)
virtual int Open(const char *, off_t, int, XrdOucEnv &)
virtual int ResetSizes(const off_t size)
int MarshallAndWriteHeader()
Definition XrdOssCsiTagstoreFile.hh:159
bool fileIsBige_
Definition XrdOssCsiTagstoreFile.hh:145
virtual void Flush()
virtual int Close()
const std::string fn_
Definition XrdOssCsiTagstoreFile.hh:137
virtual int SetTrackedSize(const off_t size)
Definition XrdOssCsiTagstoreFile.hh:73
static const uint32_t cmagic_
Definition XrdOssCsiTagstoreFile.hh:184
const char * tident
Definition XrdOssCsiTagstoreFile.hh:143
virtual int Truncate(off_t, bool)
std::unique_ptr< XrdOssDF > fd_
Definition XrdOssCsiTagstoreFile.hh:138
virtual ssize_t ReadTags(uint32_t *, off_t, size_t)
off_t actualsize_
Definition XrdOssCsiTagstoreFile.hh:140
static ssize_t fullread(XrdOssDF &fd, void *buff, const off_t off, const size_t sz)
Definition XrdOssCsiTagstoreFile.hh:106
virtual off_t GetTrackedDataSize() const
Definition XrdOssCsiTagstoreFile.hh:65
virtual int SetUnverified()
Definition XrdOssCsiTagstoreFile.hh:95
off_t trackinglen_
Definition XrdOssCsiTagstoreFile.hh:139
bool machineIsBige_
Definition XrdOssCsiTagstoreFile.hh:144
static ssize_t fullwrite(XrdOssDF &fd, const void *buff, const off_t off, const size_t sz)
Definition XrdOssCsiTagstoreFile.hh:122
int WriteTrackedTagSize(const off_t size)
Definition XrdOssCsiTagstoreFile.hh:152
virtual bool IsVerified() const
Definition XrdOssCsiTagstoreFile.hh:88
uint32_t hflags_
Definition XrdOssCsiTagstoreFile.hh:147
uint8_t header_[20]
Definition XrdOssCsiTagstoreFile.hh:146
XrdOssCsiTagstoreFile(const std::string &fn, std::unique_ptr< XrdOssDF > fd, const char *tid)
Definition XrdOssCsiTagstoreFile.hh:45
Definition XrdOssCsiTagstore.hh:37
virtual ~XrdOssCsiTagstore()
Definition XrdOssCsiTagstore.hh:40
static const uint32_t csVer
Definition XrdOssCsiTagstore.hh:63
Definition XrdOss.hh:63
virtual ssize_t Read(off_t offset, size_t size)
Definition XrdOss.hh:281
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
Definition XrdOss.hh:345
static uint32_t Calc32C(const void *data, size_t count, uint32_t prevcs=0)
Definition XrdOucEnv.hh:42
Definition XrdOucJson.hh:4517