From 3ba13f4640de8e639aa24d0af583fc9eb52d561a Mon Sep 17 00:00:00 2001 From: Claudio Bisegni <Claudio.Bisegni@lnf.infn.it> Date: Thu, 20 Nov 2014 18:41:53 +0100 Subject: [PATCH] add api to uitoolkit for snapshot --- ChaosDataService/QueryDataConsumer.cpp | 2 +- .../project.pbxproj | 52 +++++++++++ ChaosSnapshotUtility/main.cpp | 89 ++++++++++++++++--- chaos/common/io/IODirectIODriver.h | 10 +-- chaos/ui_toolkit/LowLevelApi/LLRpcApi.cpp | 30 +++++-- chaos/ui_toolkit/LowLevelApi/LLRpcApi.h | 5 +- 6 files changed, 165 insertions(+), 23 deletions(-) diff --git a/ChaosDataService/QueryDataConsumer.cpp b/ChaosDataService/QueryDataConsumer.cpp index 42b74b22c..b2381a131 100644 --- a/ChaosDataService/QueryDataConsumer.cpp +++ b/ChaosDataService/QueryDataConsumer.cpp @@ -112,7 +112,7 @@ void QueryDataConsumer::init(void *init_data) throw (chaos::CException) { db_impl_name, network_broker); if(!snapshot_data_worker) throw chaos::CException(-5, "Error allocating snapshot worker", __FUNCTION__); - chaos::utility::StartableService::initImplementation(query_engine, init_data, "QueryEngine", __PRETTY_FUNCTION__); + chaos::utility::StartableService::initImplementation(snapshot_data_worker, init_data, "SnapshotCreationWorker", __PRETTY_FUNCTION__); for(CacheServerListIterator iter = settings->startup_chache_servers.begin(); iter != settings->startup_chache_servers.end(); iter++) { diff --git a/ChaosSnapshotUtility/ChaosSnapshotUtility.xcodeproj/project.pbxproj b/ChaosSnapshotUtility/ChaosSnapshotUtility.xcodeproj/project.pbxproj index 92b128dca..a3048933c 100644 --- a/ChaosSnapshotUtility/ChaosSnapshotUtility.xcodeproj/project.pbxproj +++ b/ChaosSnapshotUtility/ChaosSnapshotUtility.xcodeproj/project.pbxproj @@ -204,6 +204,32 @@ 323E66681A1E40CC009CDDB7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "libstdc++"; + CONFIGURATION_BUILD_DIR = "$(SRCROOT)/../../usr/local/bin"; + HEADER_SEARCH_PATHS = ( + ../../, + /usr/local/include, + ../../usr/local/include, + ); + LIBRARY_SEARCH_PATHS = ( + /usr/local/lib, + "$(SRCROOT)/../../usr/local/lib", + ); + OTHER_LDFLAGS = ( + "-lboost_chrono", + "-lmemcached", + "-lboost_system", + "-lboost_thread", + "-lboost_program_options", + "-lboost_regex", + "-lboost_filesystem", + "-lboost_log", + "-lboost_log_setup", + "-lchaos_uitoolkit", + "-lchaos_common", + "-lboost_date_time", + ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -211,6 +237,32 @@ 323E66691A1E40CC009CDDB7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "libstdc++"; + CONFIGURATION_BUILD_DIR = "$(SRCROOT)/../../usr/local/bin"; + HEADER_SEARCH_PATHS = ( + ../../, + /usr/local/include, + ../../usr/local/include, + ); + LIBRARY_SEARCH_PATHS = ( + /usr/local/lib, + "$(SRCROOT)/../../usr/local/lib", + ); + OTHER_LDFLAGS = ( + "-lboost_chrono", + "-lmemcached", + "-lboost_system", + "-lboost_thread", + "-lboost_program_options", + "-lboost_regex", + "-lboost_filesystem", + "-lboost_log", + "-lboost_log_setup", + "-lchaos_uitoolkit", + "-lchaos_common", + "-lboost_date_time", + ); PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/ChaosSnapshotUtility/main.cpp b/ChaosSnapshotUtility/main.cpp index 315eaa22c..01e100745 100644 --- a/ChaosSnapshotUtility/main.cpp +++ b/ChaosSnapshotUtility/main.cpp @@ -1,15 +1,82 @@ -// -// main.cpp -// ChaosSnapshotUtility -// -// Created by Claudio Bisegni on 20/11/14. -// Copyright (c) 2014 infn. All rights reserved. -// +/* + * main.cpp + * !CHOAS + * Created by Bisegni Claudio. + * + * Copyright 2014 INFN, National Institute of Nuclear Physics + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include <string> #include <iostream> -int main(int argc, const char * argv[]) { - // insert code here... - std::cout << "Hello, World!\n"; - return 0; +#include <chaos/ui_toolkit/ChaosUIToolkit.h> +#include <chaos/ui_toolkit/LowLevelApi/LLRpcApi.h> +#include <chaos/ui_toolkit/HighLevelApi/HLDataApi.h> + +#define OPT_CU_ID "device-id" +#define OPT_CDS_ADDRESS "cds-address" +#define OPT_SNAP_NAME "snapshot-name" +#define OPT_SNAPSHOT_OP "op" + +using namespace chaos; +using namespace chaos::ui; + +int main(int argc, char * argv[]) { + std::string device_id; + std::string snap_name; + std::string cds_addr; + unsigned int operation; + try{ + ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->addOption<std::string>(OPT_CDS_ADDRESS, "CDS address", &cds_addr); + ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->addOption<std::string>(OPT_CU_ID, "The identification string of the device to snapshuot", &device_id); + ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->addOption<std::string>(OPT_SNAP_NAME, "The name of the snapshot", &snap_name); + ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->addOption<unsigned int>(OPT_SNAPSHOT_OP, "Operation on snapshot [create(0), delete(1)]", 0, &operation); + + ChaosUIToolkit::getInstance()->init(argc, argv); + //! [UIToolkit Init] + + if(!ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(OPT_CDS_ADDRESS)){ + throw CException(-1, "The cds address is mandatory", "check param"); + } + + if(!ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(OPT_CU_ID)){ + throw CException(-1, "No device identification set", "check param"); + } + + if(!ChaosUIToolkit::getInstance()->getGlobalConfigurationInstance()->hasOption(OPT_SNAP_NAME)){ + throw CException(-2, "Invalid snapshot name set", "check param"); + } + + if(!snap_name.size()) throw CException(-3, "Snapshot name can't zero-length", "check param"); + + SystemApiChannel *system_api_channel = LLRpcApi::getInstance()->getSystemApiClientChannel(cds_addr); + if(system_api_channel) { + LLRpcApi::getInstance()->releaseSystemApyChannel(system_api_channel); + } + } catch (CException& e) { + std::cerr << e.errorCode << " - "<< e.errorDomain << " - " << e.errorMessage << std::endl; + } catch (...) { + std::cerr << "General error " << std::endl; + } + + try { + //! [UIToolkit Deinit] + ChaosUIToolkit::getInstance()->deinit(); + //! [UIToolkit Deinit] + } catch (CException& e) { + std::cerr << e.errorCode << " - "<< e.errorDomain << " - " << e.errorMessage << std::endl; + } + return 0; } diff --git a/chaos/common/io/IODirectIODriver.h b/chaos/common/io/IODirectIODriver.h index 40e99103c..f9374b582 100644 --- a/chaos/common/io/IODirectIODriver.h +++ b/chaos/common/io/IODirectIODriver.h @@ -40,6 +40,11 @@ #include <boost/thread.hpp> #include <boost/atomic.hpp> +namespace chaos_data = chaos::common::data; +namespace chaos_utility = chaos::common::utility; +namespace chaos_direct_io = chaos::common::direct_io; +namespace chaos_dio_channel = chaos::common::direct_io::channel; + namespace chaos{ namespace common { //!forward declaration @@ -51,11 +56,6 @@ namespace chaos{ using namespace std; using namespace boost; - namespace chaos_data = chaos::common::data; - namespace chaos_utility = chaos::common::utility; - namespace chaos_direct_io = chaos::common::direct_io; - namespace chaos_dio_channel = chaos::common::direct_io::channel; - /*! Struct for initialization of the io driver */ diff --git a/chaos/ui_toolkit/LowLevelApi/LLRpcApi.cpp b/chaos/ui_toolkit/LowLevelApi/LLRpcApi.cpp index 43ca62a62..a8c32c067 100644 --- a/chaos/ui_toolkit/LowLevelApi/LLRpcApi.cpp +++ b/chaos/ui_toolkit/LowLevelApi/LLRpcApi.cpp @@ -27,10 +27,10 @@ using namespace boost; using namespace chaos; using namespace chaos::common::io; using namespace chaos::ui; - +using namespace chaos::common::direct_io; #define LLRA_LAPP_ LAPP_ << "[LLRpcApi] - " -uint32_t DIOConn::garbage_counter; +uint32_t DIOConn::garbage_counter = 0; #define INIT_STEP 0 @@ -38,9 +38,9 @@ uint32_t DIOConn::garbage_counter; /* */ -LLRpcApi::LLRpcApi(): -direct_io_client(NULL){ +LLRpcApi::LLRpcApi() { network_broker = new NetworkBroker(); + direct_io_client = NULL; } /* @@ -162,8 +162,28 @@ SystemApiChannel *LLRpcApi::getSystemApiClientChannel(const std::string& direct_ } else { conn = new DIOConn(direct_io_client->getNewConnection(direct_io_address)); } + conn->garbage_counter++; + return new SystemApiChannel(conn, (channel::DirectIOSystemAPIClientChannel*)conn->connection->getNewChannelInstance("DirectIOSystemAPIClientChannel")); } -void releaseSystemApyChannel(SystemApiChannel *system_api_channel) { +void LLRpcApi::releaseSystemApyChannel(SystemApiChannel *system_api_channel) { + boost::unique_lock<boost::mutex> l(mutex_map_dio_addr_conn); + if(!system_api_channel) return; + + DIOConn *conn = system_api_channel->connection; + if(conn) { + conn->garbage_counter--; + if(system_api_channel->system_api_channel) { + conn->connection->releaseChannelInstance(system_api_channel->system_api_channel); + } + + if(!conn->garbage_counter) { + //need to be deleted the connection from the map + map_dio_addr_conn.erase(conn->connection->getURL()); + + //and form the root client + direct_io_client->releaseConnection(conn->connection); + } + } } diff --git a/chaos/ui_toolkit/LowLevelApi/LLRpcApi.h b/chaos/ui_toolkit/LowLevelApi/LLRpcApi.h index 2916b1b36..04519e6a9 100644 --- a/chaos/ui_toolkit/LowLevelApi/LLRpcApi.h +++ b/chaos/ui_toolkit/LowLevelApi/LLRpcApi.h @@ -63,7 +63,10 @@ namespace chaos { chaos_direct_io::channel::DirectIOSystemAPIClientChannel *system_api_channel; private: DIOConn *connection; - SystemApiChannel(DIOConn *_connection):connection(_connection){}; + SystemApiChannel(DIOConn *_connection, + chaos_direct_io::channel::DirectIOSystemAPIClientChannel *_system_api_channel): + connection(_connection), + system_api_channel(_system_api_channel){}; ~SystemApiChannel(){}; }; -- GitLab