From bbb4c8eea3f986c1ce8f899cf4d0d25c4e85e081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kecsk=C3=A9s=20Kriszti=C3=A1n?= <kk1205@sch.bme.hu> Date: Wed, 9 Dec 2015 12:58:34 +0100 Subject: [PATCH] =?UTF-8?q?implement=20redundancy=20and=20merge=20all=20"m?= =?UTF-8?q?=C3=A9r=C3=A9s"=20branch=20to=20master?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- program/Build/RaspberryCloud.sdf | Bin 74842112 -> 74842112 bytes program/Build/RaspberryCloud.v12.suo | Bin 267264 -> 267264 bytes program/Source/app/Application.cpp | 138 +++++++++++++++++- program/Source/app/UI.cpp | 5 +- program/Source/app/UI.h | 2 +- program/Source/dataAccess/CloudFileSystem.cpp | 4 +- program/Source/dataAccess/CloudFileSystem.h | 2 +- program/Source/dataAccess/ComputeOnClient.cpp | 4 +- program/Source/dataAccess/ComputeOnClient.h | 3 +- program/Source/dataAccess/ComputeOnPi.cpp | 2 +- program/Source/dataAccess/ComputeOnPi.h | 3 +- program/Source/dataAccess/Distributor.cpp | 2 +- program/Source/dataAccess/Distributor.h | 2 +- program/Source/dataAccess/Encoder.cpp | 2 +- .../Source/dataAccess/HomeNetworkBehaviour.h | 3 +- .../networking/FileServerConnection.cpp | 3 +- 16 files changed, 157 insertions(+), 18 deletions(-) diff --git a/program/Build/RaspberryCloud.sdf b/program/Build/RaspberryCloud.sdf index b20cf7c7d5366d51979ea664a9367942cdfa0072..e97bf8390bff699ce4eaec9c5ea6c8c7ee5e686c 100644 GIT binary patch delta 25654 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 delta 26415 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 MN?6u4l(IAc0OEJLNB{r; diff --git a/program/Build/RaspberryCloud.v12.suo b/program/Build/RaspberryCloud.v12.suo index 0e216ea257a0b66722d14df7ba57eba18b9c9069..44482ad31c43cff93d6fe360d3d16c0ef38d42bb 100644 GIT binary patch delta 8136 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 V%uHCjo0#22frHE+mI<)1008877mxq| delta 6200 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 diff --git a/program/Source/app/Application.cpp b/program/Source/app/Application.cpp index d14c277b..a7100c2e 100644 --- a/program/Source/app/Application.cpp +++ b/program/Source/app/Application.cpp @@ -481,7 +481,143 @@ int test2(){ return 0; } +int redTest() { + Application application; + + application.cm.addCloud(make_shared<LocalCloudAdapter>()); + //application.cm.addCloud(make_shared<DropboxAdapter>()); + //application.cm.addCloud(make_shared<FTPAdapter>()); + + string dataFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\data\\"; + string fragFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\temp\\"; + string cloudFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\cloud\\"; + string cacheFolder = "C:\\Users\\krisz\\raspberrycloud\\skeleton\\Program\\cache\\"; + + double redundancy = 1.5; + + + application.cfs.getEncoder()->setFolders(dataFolder, fragFolder); + application.cfs.getDecoder()->setFolders(dataFolder, fragFolder); + application.cfs.getEncoder()->setSymbols(4, 128, redundancy); + application.cfs.getDecoder()->setSymbols(4, 128, redundancy); + + application.cfs.setFolders(fragFolder); + + bool waitAnswer = true; + Cache *cacheToSetup; + cacheToSetup = new FIFOCache(12); + application.cfs.setCache(cacheToSetup); + application.cfs.getCache()->setFolders(cacheFolder, dataFolder); + application.cfs.getCache()->readCache(); + + application.hnc.setDataFolder(dataFolder); + + for (auto ca : application.cm.getCloudList()){ + ca->setFolders(cloudFolder, fragFolder); + } + + string command = ""; + cout << "=================================================" << endl; + cout << "Welcome to the amazing RaspberryCloud application" << endl; + cout << "=================================================" << endl << endl; + cout << "Setting up system" << endl; + + application.ui.setComputeOnPi(false); + + cout << "To list avaliable orders enter \"help\"." << endl; + + while (true){ + cout << "Please give a new order!" << endl; + cin >> command; + + if (command == "help"){ + cout << "To stop the application enter \"exit\"." << endl; + cout << "To add a new file enter \"addFile\"." << endl; + cout << "To create a new directory enter \"createDirectory\"." << endl; + cout << "To get a file enter \"getFile\"." << endl; + cout << "To get the avaliable files enter \"getFileList\"." << endl; + cout << "To delete a file enter \"deleteFile\"." << endl; + cout << "To authorize a cloud adapter enter \"authCA\"." << endl; + cout << "To start or stop the server enter \"serverCfg\"." << endl; + } + else if (command == "addFile"){ + cout << "Adding file. Please enter local file id" << endl; + string localid; + string destid; + cin >> localid; + cout << "Adding file. Please enter destination file id" << endl; + cin >> destid; + cout << application.ui.addFile(localid, destid, redundancy) << endl; + } + else if (command == "createDirectory"){ + cout << "Creating directory. Please enter directory id" << endl; + string dirid; + cin >> dirid; + cout << application.ui.createDirectory(dirid) << endl; + } + else if (command == "getFile"){ + cout << "Getting file. Please enter file id" << endl; + string fileid; + cin >> fileid; + FileDescriptor fileDesc = FileDescriptor(fileid); + ReturnableFile returned = application.ui.getFile(fileDesc); + if (returned.isValid()) { + cout << "Successfully downloaded: " << returned.getLocalFileId() << endl; + } + else { + cout << "ERROR with getting: " << returned.getLocalFileId() << endl << returned.getErrorMessage() << endl; + } + } + else if (command == "getFileList"){ + list<FileDescriptor*>* fileTree = application.ui.getFileTree(); + cout << "fileTree has " << fileTree->size() << " file(s)." << endl; + for (FileDescriptor* fileD : *fileTree) + { + cout << fileD->getFileID() << endl; + for (Fragment f : fileD->getFragments()){ + cout << f.getCloudFileID() << endl; + cout << f.getCloudId() << endl; + } + } + } + else if (command == "deleteFile"){ + cout << "Deleting file. Please enter file id" << endl; + string fileid; + cin >> fileid; + FileDescriptor fileDesc = FileDescriptor(fileid); + cout << application.ui.deleteFile(fileDesc) << endl; + } + else if (command == "authCA") + { + cout << "Enter cloud adapter ID (eg. \"dropboxAdapter\")" << endl; + string cloudAdapterId; + cin >> cloudAdapterId; + application.ui.authCloudAdapter(cloudAdapterId); + } + else if (command == "serverCfg") + { + string startOrStop; + cout << "Start or stop server?" << endl; + cin >> startOrStop; + + if (startOrStop == "start") + application.ui.startServer(true); + else + application.ui.startServer(false); + } + else if (command == "exit"){ + cout << "Bye! Thanks for choosing us." << endl; + return 0; + } + else { + cout << "Invalid command." << endl; + } + } + + return 0; +} + int main(int argc, char **argv) { cout << CLOCKS_PER_SEC << endl; - return main2(argc, argv); + return redTest(); } \ No newline at end of file diff --git a/program/Source/app/UI.cpp b/program/Source/app/UI.cpp index 91164e91..871da069 100644 --- a/program/Source/app/UI.cpp +++ b/program/Source/app/UI.cpp @@ -18,9 +18,9 @@ UI::UI(Application& app) : LOG_ENTER_EXIT; } -bool UI::addFile(string localFileID, string destinationFileID) { +bool UI::addFile(string localFileID, string destinationFileID, double redundancy) { LOG_ENTER_EXIT; - return app.cfs.addFile(localFileID, destinationFileID); + return app.cfs.addFile(localFileID, destinationFileID, redundancy); } bool UI::createDirectory(string directoryID) { @@ -39,7 +39,6 @@ bool UI::deleteFile(FileDescriptor fileDescriptor) { LOG_ENTER_EXIT; return app.cfs.deleteFile(fileDescriptor); } - void UI::setComputeOnPi(bool b) { LOG_ENTER_EXIT; if (b){ diff --git a/program/Source/app/UI.h b/program/Source/app/UI.h index 68e63faa..0cbbfbf8 100644 --- a/program/Source/app/UI.h +++ b/program/Source/app/UI.h @@ -34,7 +34,7 @@ public: * @param destinationFileID remote path to the file to add * @return successful */ - bool addFile(std::string localFileID, std::string destinationFileID); + bool addFile(std::string localFileID, std::string destinationFileID, double redundancy = 1.0); /** * It starts the process of creating a new directory diff --git a/program/Source/dataAccess/CloudFileSystem.cpp b/program/Source/dataAccess/CloudFileSystem.cpp index 039bd58b..1bc6c7dc 100644 --- a/program/Source/dataAccess/CloudFileSystem.cpp +++ b/program/Source/dataAccess/CloudFileSystem.cpp @@ -71,7 +71,7 @@ bool CloudFileSystem::getComputeOnPi(){ return computeOnPi; } -bool CloudFileSystem::addFile(string localFileID, string destinationFileID) { +bool CloudFileSystem::addFile(string localFileID, string destinationFileID, double redundancy = 1.0) { LOG_ENTER_EXIT; if (homeNetworkBehaviour == nullptr) { @@ -79,7 +79,7 @@ bool CloudFileSystem::addFile(string localFileID, string destinationFileID) { return false; } - return homeNetworkBehaviour->addFile(localFileID, destinationFileID); + return homeNetworkBehaviour->addFile(localFileID, destinationFileID, redundancy); } diff --git a/program/Source/dataAccess/CloudFileSystem.h b/program/Source/dataAccess/CloudFileSystem.h index a1fbfc99..31b70e94 100644 --- a/program/Source/dataAccess/CloudFileSystem.h +++ b/program/Source/dataAccess/CloudFileSystem.h @@ -99,7 +99,7 @@ public: * @param localFileID full path of the local file to upload * @param destinationFileID full path of the file on the cloud */ - bool addFile(std::string localFileID, std::string destinationFileID); + bool addFile(std::string localFileID, std::string destinationFileID, double redundancy); /** * Downloads a file from the cloud diff --git a/program/Source/dataAccess/ComputeOnClient.cpp b/program/Source/dataAccess/ComputeOnClient.cpp index 00c130a0..8a85a96c 100644 --- a/program/Source/dataAccess/ComputeOnClient.cpp +++ b/program/Source/dataAccess/ComputeOnClient.cpp @@ -13,7 +13,7 @@ using namespace std; * ComputeOnClient implementation */ -bool ComputeOnClient::addFile(string localFileID, string destinationFileID) { +bool ComputeOnClient::addFile(string localFileID, string destinationFileID, double redundancy) { LOG_ENTER_EXIT; bool success; @@ -24,7 +24,7 @@ bool ComputeOnClient::addFile(string localFileID, string destinationFileID) { auto fileDescriptor = Encoder::encode(localFileID, destinationFileID); if (cloudFileSystem.addToFileTreeByID(fileDescriptor)){ - if (cloudFileSystem.getDistributor()->distribute(fileDescriptor)) { + if (cloudFileSystem.getDistributor()->distribute(fileDescriptor, redundancy)) { cloudFileSystem.getCloudFileList()->save(); success = cloudFileSystem.getCloudAccessLayer()->upload(*fileDescriptor); } diff --git a/program/Source/dataAccess/ComputeOnClient.h b/program/Source/dataAccess/ComputeOnClient.h index 03c36365..0b3c8400 100644 --- a/program/Source/dataAccess/ComputeOnClient.h +++ b/program/Source/dataAccess/ComputeOnClient.h @@ -26,8 +26,9 @@ public: * Adds a file to the cloud * @param localFileID path of file to be added * @param destinationFileID path of file on cloud + * @param redundancy rate of redundancy: 100% -> 1.0, 150% -> 1.5 */ - bool addFile(std::string localFileID, std::string destinationFileID) override; + bool addFile(std::string localFileID, std::string destinationFileID, double redundancy) override; /** * Gets a file from the cloud diff --git a/program/Source/dataAccess/ComputeOnPi.cpp b/program/Source/dataAccess/ComputeOnPi.cpp index d6faea6c..c9caaa5d 100644 --- a/program/Source/dataAccess/ComputeOnPi.cpp +++ b/program/Source/dataAccess/ComputeOnPi.cpp @@ -6,7 +6,7 @@ using namespace std; * ComputeOnPi implementation */ -bool ComputeOnPi::addFile(string localFileID, string destinationFileID) { +bool ComputeOnPi::addFile(string localFileID, string destinationFileID, double redundancy) { return cloudFileSystem.getHomeNetworkCommunications()->addFileRemote(localFileID); } diff --git a/program/Source/dataAccess/ComputeOnPi.h b/program/Source/dataAccess/ComputeOnPi.h index 06c25a06..384c9844 100644 --- a/program/Source/dataAccess/ComputeOnPi.h +++ b/program/Source/dataAccess/ComputeOnPi.h @@ -23,8 +23,9 @@ public: * Adds a file to the cloud * @param localFileID path of file to be added * @param destinationFileID path of file on cloud + * @param redundancy rate of redundancy: 100% -> 1.0, 150% -> 1.5 */ - bool addFile(std::string localFileID, std::string destinationFileID); + bool addFile(std::string localFileID, std::string destinationFileID, double redundancy); /** * Gets a file from the cloud diff --git a/program/Source/dataAccess/Distributor.cpp b/program/Source/dataAccess/Distributor.cpp index f726fd8e..53f7a658 100644 --- a/program/Source/dataAccess/Distributor.cpp +++ b/program/Source/dataAccess/Distributor.cpp @@ -19,7 +19,7 @@ Distributor::Distributor(CloudManager &cloudManager) : cloudManager(cloudManager }*/ } -bool Distributor::distribute(FileDescriptor* fileDescriptor) { +bool Distributor::distribute(FileDescriptor* fileDescriptor, double redundancy) { LOG_ENTER_EXIT; auto cloudIDs = cloudManager.getCloudList(); diff --git a/program/Source/dataAccess/Distributor.h b/program/Source/dataAccess/Distributor.h index 9ee70784..0df79764 100644 --- a/program/Source/dataAccess/Distributor.h +++ b/program/Source/dataAccess/Distributor.h @@ -27,7 +27,7 @@ public: * It sets the files' fragments' cloudIDs to a valid cloudAdapter ID * @param fileDescriptor */ - bool distribute(FileDescriptor* fileDescriptor); + bool distribute(FileDescriptor* fileDescriptor, double redundancy); }; #endif //_DISTRIBUTOR_H \ No newline at end of file diff --git a/program/Source/dataAccess/Encoder.cpp b/program/Source/dataAccess/Encoder.cpp index 8533c232..57012d87 100644 --- a/program/Source/dataAccess/Encoder.cpp +++ b/program/Source/dataAccess/Encoder.cpp @@ -71,7 +71,7 @@ FileDescriptor* Encoder::encode(string localFileID, string destinationFileID) { vector<uint8_t> payload(e->payload_size()); - for (uint32_t j = 0; j < e->symbols(); j++) + for (uint32_t j = 0; j < (e->symbols()*redundancy); j++) { e->encode(payload.data()); diff --git a/program/Source/dataAccess/HomeNetworkBehaviour.h b/program/Source/dataAccess/HomeNetworkBehaviour.h index 60b8cf69..77ffb709 100644 --- a/program/Source/dataAccess/HomeNetworkBehaviour.h +++ b/program/Source/dataAccess/HomeNetworkBehaviour.h @@ -19,8 +19,9 @@ public: * Adds a file to the cloud * @param localFileID path of file to be added * @param destinationFileID path of file on cloud + * @param redundancy rate of redundancy: 100% -> 1.0, 150% -> 1.5 */ - virtual bool addFile(std::string localFileID, std::string destinationFileID) = 0; + virtual bool addFile(std::string localFileID, std::string destinationFileID, double redundancy) = 0; /** * Gets a file from the cloud diff --git a/program/Source/networking/FileServerConnection.cpp b/program/Source/networking/FileServerConnection.cpp index 08233bff..6c7bccbd 100644 --- a/program/Source/networking/FileServerConnection.cpp +++ b/program/Source/networking/FileServerConnection.cpp @@ -82,7 +82,8 @@ void FileServerConnection::run() file.close(); cout << "received: " << fileName << endl; - auto result = app.cfs.addFile(fileName, fileName); + // TODO: implement sending of redundancy + auto result = app.cfs.addFile(fileName, fileName, 1.0); if (!result) cout << "error uploading file: " << fileName << endl; else -- GitLab