Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #ifndef _DISTCRUSH_H
00009 #define _DISTCRUSH_H
00010
00011 #include "Distributor.h"
00012
00013 #include <set>
00014 #include <map>
00015 #include <list>
00016 #include <iostream>
00017
00018 #include "crushwrapper.h"
00019 #include <xercesc/dom/DOMElement.hpp>
00020
00021 using namespace std;
00022 using namespace xercesc;
00023
00024
00025 namespace VDRIVE {
00026 class DistCRUSH : public Distributor {
00027 public:
00028 DistCRUSH(int argc, char** argv);
00029 DistCRUSH(const DistCRUSH& orig);
00030 DistCRUSH(xercesc::DOMElement* data);
00031 static std::string getXMLRootType() {
00032 return std::string("Crush");
00033 }
00034 virtual ~DistCRUSH();
00035 private:
00036 CrushWrapper crush;
00037 int copies;
00038 int ruleno;
00039 int failuredomains;
00040 int extentsize;
00041 list<Disk*> alldisks;
00042 vector<uint32_t> disk_weights;
00043
00044 struct layer_t {
00045 string name;
00046 int buckettype;
00047 int size;
00048 };
00049
00050 vector<layer_t> layers;
00051
00052 virtual std::list<Disk*>* placeExtent(int64_t virtualVolumeId, int64_t position);
00053
00054 virtual void setConfiguration(std::list<Disk*>* disks, int64_t extentsize, int32_t copies);
00055 virtual void setDisks(std::list<Disk*>* disks);
00056 virtual std::list<Disk*>* getDisks() const;
00057 virtual int64_t getExtentsize() const;
00058 virtual int32_t getCopies() const;
00059 virtual xercesc::DOMElement* toXML(xercesc::DOMDocument* doc) const;
00060 virtual void buildCrushMap(vector<layer_t> layers, std::list<Disk*>* disks);
00061 double hash(int64_t key1, int64_t key2, int64_t key3) const;
00062
00063
00064 };
00065 }
00066
00067
00068 #endif
00069