ewmscp  ..
inputHandlerDummy.cpp
Go to the documentation of this file.
1 #include "inputHandlerDummy.h"
2 #include "block.h"
3 #include "copyRequestTypes.h"
5 #include "ewmscp.h"
6 #include "timer.h"
7 
8 #include <fcntl.h>
9 #include <errMsgQueue.h>
10 #include <throwcall.h>
11 #include <unistd.h>
12 #include <random>
13 
14 
15 namespace inputHandler {
16  decltype(dummy::factory) dummy::factory("dummy");
17  defineStatic(dummy::nFiles, '\0',"dummyNFiles","number of files in the dummy dirs");
18  defineStatic(dummy::nDirs, '\0',"dummyNDirs","number of subdirs in the dummy dirs");
19  defineStatic(dummy::minSize, '\0',"dummyMinSize","minimum size of generated files",0);
20  defineStatic(dummy::maxSize, '\0',"dummyMaxSize","minimum size of generated files",16*1024*1024);
21  defineStatic(dummy::noCopy, '\0',"dummyNoCopy","just leave garbage in teh files blocks");
22  defineStatic(dummy::mTime, genericStat::clock_type::now());
23 
25  static const block* data = nullptr;
26  if (data == nullptr) {
27  timerInst(createRandomBlock);
28  auto buffer = new block(16*1024*1024);
29  std::default_random_engine re;
30  for (auto p=static_cast<decltype(re)::result_type*>(buffer->bufferAt(0));
31  p < static_cast<decltype(re)::result_type*>(buffer->bufferAt(buffer->max_size()/sizeof(*p)));
32  ++p) {
33  *p = re();
34  }
35  buffer->bump_size(buffer->max_size());
36  data = buffer;
37  }
38  return *data;
39  }
40 
42  }
43 
44  std::unique_ptr<base::reader> dummy::newReader(const std::string& aPath,
46  const genericStat& inititalStat) {
47  return std::unique_ptr<base::reader>(new readerDummy(aPath,
48  state,
49  inititalStat));
50  }
51 
52 
53 
54 
55 
56  dummy::readerDummy::readerDummy(const std::string& /*aPath*/,
57  copyRequest::stateType &/*state*/,
58  const genericStat&inititalStat):
59  ioHandle(),
60  reader(inititalStat) {
61  }
62 
64  }
65 
66 
67 
69  return true;
70  }
72  timerInst(read);
73  b.clear(totalBytesRead);
74  auto bytesToRead = readInitialStat.size - totalBytesRead;
75  if (bytesToRead > b.max_size()) {
76  bytesToRead = b.max_size();
77  }
78  if (! noCopy) {
79  if (randomBlock().size() < bytesToRead) {
80  throw std::runtime_error("random data block too small");
81  }
82  {
83  timerInst(memcpy);
84  memcpy(b.bufferAt(0), randomBlock().bufferAt(0), bytesToRead);
85  }
86  }
87  b.bump_size(bytesToRead);
88  totalBytesRead += bytesToRead;
89  return totalBytesRead >= readInitialStat.size;
90  }
91 
92 
93  void dummy::readerDummy::readBlockP(block& b, size_t bytesToRead, off_t offset) {
94  timerInst(readp);
95  b.clear(offset);
96  if (! noCopy) {
97  if (randomBlock().size() < bytesToRead) {
98  throw std::runtime_error("random data block too small");
99  }
100  {
101  timerInst(memcpy);
102  memcpy(b.bufferAt(0), randomBlock().bufferAt(0), bytesToRead);
103  }
104  }
105  b.bump_size(bytesToRead);
106  }
107 
108 
110  }
111 
112  std::unique_ptr<const genericStat> dummy::readerDummy::getStat() {
113  return std::unique_ptr<const genericStat>(new genericStat(readInitialStat));
114  }
115 
116  bool dummy::pathExists(const std::string&) {
117  return true;
118  }
119  std::unique_ptr<const genericStat> dummy::getStat(const std::string& path,
120  bool followLink) {
121  if (path.find("/dummy/") == 0) {
122  auto basename = path.substr(path.find_last_of('/')+1);
123  auto stat = new genericStat;
124  stat->device = 12345;
125  if (basename.find("file_") == 0) {
126  stat->mode = S_IFREG;
127  stat->size = std::stoll(basename.substr(5));
128  stat->mTime = mTime;
129  stat->aTime = mTime;
130  stat->blksize = randomBlock().max_size();
131  } else {
132  stat->mode = S_IFDIR;
133  }
134  return std::unique_ptr<const genericStat>(stat);
135  } else {
136  static posixFileCommon posixHandler;
137  return posixHandler.getStat(path, followLink);
138  }
139  }
140 
141  dummy::DummyDirectory::DummyDirectory(const std::string& aPath): Directory(aPath) {
142  if (path.find("/dummy/") == 0) {
143  auto basename = path.substr(path.find_last_of('/')+1);
144  if (basename.empty()) { // tld
145  level = 0;
146  } else if (basename.find("dir_") == 0) {
147  level = std::stoul(basename.substr(4));
148  } else {
149  throw std::logic_error(aPath + " is not a directory");
150  }
151  if (nFiles.size() <= level) {
152  nFilesLeft = 0;
153  } else {
154  nFilesLeft = nFiles.at(level);
155  }
156  if (nDirs.size() <= level) {
157  nDirsLeft = 0;
158  } else {
159  nDirsLeft = nDirs.at(level);
160  }
161  } else {
162  throw std::logic_error("dummy directories mist start with /dummy/, not " + aPath);
163  }
164  }
166  }
167  std::unique_ptr<base::Directory::Entry> dummy::DummyDirectory::getNextEntry(bool /*ignoreMissing*/) {
168  if (nFilesLeft) {
169  --nFilesLeft;
170  std::string name("file_");
171  auto stat = std::unique_ptr<genericStat>(new genericStat);
172  std::uniform_int_distribution<size_t> distribution(minSize, maxSize);
173  static std::default_random_engine rnd;
174  stat->size = distribution(rnd);
175  stat->device = 12345;
176  stat->mode = S_IFREG;
177  stat->blksize = randomBlock().max_size();
178  stat->mTime = mTime;
179  stat->aTime = mTime;
180  name += std::to_string(stat->size);
181  name += "_";
182  name += std::to_string(nFilesLeft);
183  return std::unique_ptr<Entry>(new Entry(name, stat));
184  } else if (nDirsLeft) {
185  --nDirsLeft;
186  std::string name("dir_");
187  auto stat = std::unique_ptr<genericStat>(new genericStat);
188  stat->device = 12345;
189  stat->mode = S_IFDIR;
190  stat->mTime = mTime;
191  stat->aTime = mTime;
192  name += std::to_string(level+1);
193  name += "_";
194  name += std::to_string(nDirsLeft);
195  return std::unique_ptr<Entry>(new Entry(name, stat));
196  }
197  return nullptr;
198  }
199  std::unique_ptr<base::Directory> dummy::getDirectory(const std::string& path) {
200  if (path.find("/dummy/") == 0) {
201  return std::unique_ptr<Directory>(new DummyDirectory(path));
202  } else {
203  static inputHandler::posixFile posixHandler;
204  return posixHandler.getDirectory(path);
205  }
206  }
207 
208 } //end namespace inputHandler
block.h
inputHandler::dummy::readerDummy
Definition: inputHandlerDummy.h:24
inputHandler::dummy::readerDummy::~readerDummy
~readerDummy() override
Definition: inputHandlerDummy.cpp:63
inputHandler::dummy::readerDummy::readBlock
bool readBlock(block &b) override
read one block from the file
Definition: inputHandlerDummy.cpp:71
errMsgQueue.h
block::max_size
size_t max_size() const
Definition: block.h:22
inputHandler
Definition: inputHandler.h:29
inputHandler::dummy::DummyDirectory
Definition: inputHandlerDummy.h:46
inputHandler::dummy::DummyDirectory::level
unsigned int level
Definition: inputHandlerDummy.h:49
inputHandler::dummy::DummyDirectory::~DummyDirectory
~DummyDirectory() noexcept(false) override
Definition: inputHandlerDummy.cpp:165
genericStat
generic stat abstraction class Used to abstract the variants of the stat structure.
Definition: genericStat.h:12
inputHandler::dummy::dummy
dummy()
Definition: inputHandlerDummy.cpp:41
copyRequestTypes.h
inputHandler::dummy::noCopy
static options::single< bool > noCopy
Definition: inputHandlerDummy.h:21
block::bump_size
void bump_size(size_t additionalBytes)
Definition: block.h:33
copyRequest::stateType
Definition: copyRequestTypes.h:66
inputHandler::dummy::maxSize
static options::single< options::postFixedNumber< size_t > > maxSize
Definition: inputHandlerDummy.h:20
inputHandler::dummy::DummyDirectory::getNextEntry
std::unique_ptr< Entry > getNextEntry(bool ignoreMissing) override
Definition: inputHandlerDummy.cpp:167
inputHandlerPosixFile.h
inputHandler::dummy::readerDummy::getStat
std::unique_ptr< const genericStat > getStat() override
Definition: inputHandlerDummy.cpp:112
inputHandler::dummy::nDirs
static options::container< unsigned int > nDirs
Definition: inputHandlerDummy.h:18
inputHandler::dummy::factory
static factoryTemplate< dummy > factory
Definition: inputHandlerDummy.h:15
block::bufferAt
void * bufferAt(size_t offset)
only way to access the data in the block
Definition: block.cpp:28
timer.h
inputHandler::dummy::readerDummy::readBlockP
void readBlockP(block &b, size_t bytesToRead, off_t offset) override
read one block from the file, starting at offset.
Definition: inputHandlerDummy.cpp:93
throwcall.h
block
data block, used to hold the data that are being copied (or checksummed).
Definition: block.h:7
inputHandler::dummy::DummyDirectory::nFilesLeft
unsigned int nFilesLeft
Definition: inputHandlerDummy.h:47
inputHandler::posixFile
Definition: inputHandlerPosixFile.h:15
inputHandler::dummy::DummyDirectory::nDirsLeft
unsigned int nDirsLeft
Definition: inputHandlerDummy.h:48
inputHandler::dummy::pathExists
bool pathExists(const std::string &) override
Definition: inputHandlerDummy.cpp:116
genericStat::device
dev_t device
Definition: genericStat.h:15
posixFileCommon::getStat
std::unique_ptr< const genericStat > getStat(const std::string &path, bool followLink) override
Definition: posixFileCommon.cpp:30
inputHandler::dummy::minSize
static options::single< options::postFixedNumber< size_t > > minSize
Definition: inputHandlerDummy.h:19
inputHandler::dummy::mTime
static genericStat::clock_type::time_point mTime
Definition: inputHandlerDummy.h:22
inputHandler::dummy::readerDummy::readerDummy
readerDummy(const std::string &aPath, copyRequest::stateType &state, const genericStat &inititalStat)
Definition: inputHandlerDummy.cpp:56
errMsg::level
level
Definition: errMsgQueue.h:50
inputHandler::dummy::newReader
std::unique_ptr< reader > newReader(const std::string &aPath, copyRequest::stateType &state, const genericStat &inititalStat) override
get a reader for the file at path
Definition: inputHandlerDummy.cpp:44
timerInst
#define timerInst(subfunc)
Definition: timer.h:157
inputHandler::dummy::readerDummy::checkUnchangedness
void checkUnchangedness() override
check if the file is unchanged by comparing cuttent stat to initial stat
Definition: inputHandlerDummy.cpp:109
inputHandler::dummy::readerDummy::parallelizable
bool parallelizable() const override
tell if this handler is capable of parallel IO. Unsually not the case
Definition: inputHandlerDummy.cpp:68
inputHandler::dummy::getDirectory
std::unique_ptr< Directory > getDirectory(const std::string &path) override
Definition: inputHandlerDummy.cpp:199
inputHandler::dummy::randomBlock
static const block & randomBlock()
Definition: inputHandlerDummy.cpp:24
inputHandler::posixFile::getDirectory
std::unique_ptr< Directory > getDirectory(const std::string &path) override
Definition: inputHandlerPosixFile.cpp:312
posixFileCommon
Definition: posixFileCommon.h:6
ioHandle
class as base for inputHandler::base::reader and outputHandler::base::writer containing the common pa...
Definition: ioHandle.h:15
block::clear
void clear(size_t aOffset)
Definition: block.h:28
inputHandler::dummy::DummyDirectory::DummyDirectory
DummyDirectory(const std::string &path)
Definition: inputHandlerDummy.cpp:141
distribution
static options::single< std::string > distribution('d', "distribution", "distribution type", "constant", {"constant", "uniform", "geometric", "gauss"})
inputHandlerDummy.h
inputHandler::base::reader
(abstract) class for reading a file An instance of this class is used to read data from a file vie th...
Definition: inputHandler.h:72
inputHandler::dummy::nFiles
static options::container< unsigned int > nFiles
Definition: inputHandlerDummy.h:17
ewmscp.h
defineStatic
#define defineStatic(var,...)
defines a static variable and instatitates the constructor with the variable number of arguments.
Definition: ewmscp.h:42
inputHandler::dummy::getStat
std::unique_ptr< const genericStat > getStat(const std::string &path, bool followLink) override
Definition: inputHandlerDummy.cpp:119