Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _DISTRIBUTOR_H
00009 #define _DISTRIBUTOR_H
00010
00011 #include <vector>
00012 #include <list>
00013 #include <string>
00014 #include "Disk.h"
00015 #include <ostream>
00016 #include <cstring>
00017 #include <gcrypt.h>
00018
00019
00020 namespace VDRIVE {
00021
00029 class Distributor {
00030 private:
00034 uint8_t *baseMessage;
00035
00039 uint16_t numThreads;
00040
00044 bool internelHash;
00045
00049 int internalHashAlgorithm;
00050
00054 int gcryptHashAlgorithm;
00055
00056 public:
00061 const static int32_t SHARE = 1;
00066 const static int32_t NEAREST_NEIGHBOUR = 2;
00071 const static int32_t REDUNDANT_SHARE = 3;
00076 const static int32_t REDUNDANT_SHARE_K = 4;
00081 const static int32_t ROUND_ROBIN = 5;
00086 const static int32_t RUSH_P = 6;
00091 const static int32_t CRUSH = 7;
00092
00098 const static int HASH_SHA1 = 1;
00099
00105 const static int HASH_XOR = 2;
00106
00112 const static int HASH_RAND = 3;
00113
00119 const static int HASH_MT = 4;
00120
00126 uint64_t a;
00127
00132 uint64_t b;
00133
00137 virtual ~Distributor();
00138
00157 virtual std::list<Disk*>* placeExtent(int64_t virtualVolumeId, int64_t position) = 0;
00158
00180 virtual void setConfiguration(std::list<Disk*>* disks, int64_t extentsize, int32_t copies) = 0;
00181
00182 virtual void setClusters(std::list<std::list<Disk*>*>* clusters, std::list<uint32_t>* weights) {};
00193 virtual void setDisks(std::list<Disk*>* disks) = 0;
00194
00205 virtual uint8_t* getBaseMessage() const;
00206
00216 virtual void setBaseMessage(uint8_t* baseMessage);
00217
00228 uint64_t myMTRand(std::string* data) const;
00229
00240 uint64_t myRand(std::string* data) const;
00241
00256 uint64_t myLC(std::string* data) const;
00257
00267 uint64_t mySHA1(std::string* data) const;
00268
00276 uint64_t gcrypt(std::string* data) const;
00277
00285 double hashFunction(std::string *data) const;
00286
00294 uint64_t hashFunctionInt64(std::string *data) const;
00295
00307 virtual std::list<Disk*>* getDisks() const = 0;
00308
00314 virtual int64_t getExtentsize() const = 0;
00315
00321 virtual int32_t getCopies() const = 0;
00322
00333 static Distributor* createDistributor(int32_t distributor, int argc, char** argv);
00334
00341 static Distributor* loadDistributor(std::string filename);
00342
00349 virtual xercesc::DOMElement* toXML(xercesc::DOMDocument* doc) const = 0;
00350
00356 void save(std::string filename) const;
00357
00364 uint16_t getNumThreads() const {
00365 return numThreads;
00366 }
00367
00374 void setNumThreads(uint16_t numThreads) {
00375 if (numThreads > 0)
00376 this->numThreads = numThreads;
00377 }
00378
00382 void useInternalHashAlgorithm(int algorithm) {
00383 internelHash = true;
00384 internalHashAlgorithm = algorithm;
00385 }
00386
00395 bool useGCryptHashAlgorithm(int algorithm) {
00396 if (gcry_md_test_algo(algorithm) != 0) {
00397 return false;
00398 }
00399 internelHash = false;
00400 gcryptHashAlgorithm = algorithm;
00401 return true;
00402 }
00403
00412 void usedHashAlgorithm(bool* internal, int* gcryptalgorithm, int* intalgorithm) const {
00413 *internal = internelHash;
00414 *gcryptalgorithm = gcryptHashAlgorithm;
00415 *intalgorithm = internalHashAlgorithm;
00416 }
00417
00418 protected:
00422 Distributor();
00423 };
00424 }
00425 #endif
00426