diff --git a/cpp/CHANGELOG.md b/cpp/CHANGELOG.md index feafe74a64..34d80abbbf 100644 --- a/cpp/CHANGELOG.md +++ b/cpp/CHANGELOG.md @@ -24,6 +24,7 @@ Please mark all change in change log and use the ticket from JIRA. - MS-32 - Fix thrift error - MS-34 - Fix prometheus-cpp thirdparty +- MS-67 - Fix license check bug ## Improvement diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 7362dc7597..a1b78571f8 100644 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -82,10 +82,10 @@ endif() if(CMAKE_BUILD_TYPE STREQUAL "Release") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -fPIC -DELPP_THREAD_SAFE -fopenmp") - # if (GPU_VERSION STREQUAL "ON") - # set(ENABLE_LICENSE "ON") - # add_definitions("-DENABLE_LICENSE") - # endif () + if (GPU_VERSION STREQUAL "ON") + set(ENABLE_LICENSE "ON") + add_definitions("-DENABLE_LICENSE") + endif () else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0 -g -fPIC -DELPP_THREAD_SAFE -fopenmp") endif() diff --git a/cpp/src/license/LicenseCheck.cpp b/cpp/src/license/LicenseCheck.cpp index ca8fb4f930..5f9efe0c38 100644 --- a/cpp/src/license/LicenseCheck.cpp +++ b/cpp/src/license/LicenseCheck.cpp @@ -1,5 +1,7 @@ #include "LicenseCheck.h" #include +#include + #include #include //#include @@ -7,14 +9,21 @@ #include #include #include +#include +#include namespace zilliz { namespace vecwise { namespace server { +LicenseCheck::LicenseCheck() { -// Part 1: Legality check +} + +LicenseCheck::~LicenseCheck() { + StopCountingDown(); +} ServerError LicenseCheck::LegalityCheck(const std::string &license_file_path) { @@ -69,14 +78,16 @@ LicenseCheck::AlterFile(const std::string &license_file_path, const boost::system::error_code &ec, boost::asio::deadline_timer *pt) { - ServerError err = LegalityCheck(license_file_path); - if(err!=SERVER_SUCCESS) - { + ServerError err = LicenseCheck::LegalityCheck(license_file_path); + if(err!=SERVER_SUCCESS) { + printf("license file check error\n"); exit(1); } + printf("---runing---\n"); pt->expires_at(pt->expires_at() + boost::posix_time::hours(1)); - pt->async_wait(boost::bind(AlterFile, license_file_path, boost::asio::placeholders::error, pt)); + pt->async_wait(boost::bind(LicenseCheck::AlterFile, license_file_path, boost::asio::placeholders::error, pt)); + return SERVER_SUCCESS; } @@ -84,11 +95,34 @@ LicenseCheck::AlterFile(const std::string &license_file_path, ServerError LicenseCheck::StartCountingDown(const std::string &license_file_path) { - if (!LicenseLibrary::IsFileExistent(license_file_path)) return SERVER_LICENSE_FILE_NOT_EXIST; - boost::asio::io_service io; - boost::asio::deadline_timer t(io, boost::posix_time::hours(1)); - t.async_wait(boost::bind(AlterFile, license_file_path, boost::asio::placeholders::error, &t)); - io.run(); + if (!LicenseLibrary::IsFileExistent(license_file_path)) { + printf("license file not exist\n"); + exit(1); + } + + //create a thread to run AlterFile + if(counting_thread_ == nullptr) { + counting_thread_ = std::make_shared([&]() { + boost::asio::deadline_timer t(io_service_, boost::posix_time::hours(1)); + t.async_wait(boost::bind(LicenseCheck::AlterFile, license_file_path, boost::asio::placeholders::error, &t)); + io_service_.run();//this thread will block here + }); + } + + return SERVER_SUCCESS; +} + +ServerError +LicenseCheck::StopCountingDown() { + if(!io_service_.stopped()) { + io_service_.stop(); + } + + if(counting_thread_ != nullptr) { + counting_thread_->join(); + counting_thread_ = nullptr; + } + return SERVER_SUCCESS; } diff --git a/cpp/src/license/LicenseCheck.h b/cpp/src/license/LicenseCheck.h index 9a22f57f5a..c660f345b4 100644 --- a/cpp/src/license/LicenseCheck.h +++ b/cpp/src/license/LicenseCheck.h @@ -4,40 +4,44 @@ #include "LicenseLibrary.h" #include -#include -#include +#include +#include namespace zilliz { namespace vecwise { namespace server { class LicenseCheck { - public: +private: + LicenseCheck(); + ~LicenseCheck(); + +public: static LicenseCheck & GetInstance() { static LicenseCheck instance; return instance; }; - - // Part 1: Legality check static ServerError LegalityCheck(const std::string &license_file_path); + ServerError + StartCountingDown(const std::string &license_file_path); - // Part 2: Timing check license + ServerError + StopCountingDown(); + +private: static ServerError AlterFile(const std::string &license_file_path, const boost::system::error_code &ec, boost::asio::deadline_timer *pt); - - static ServerError - StartCountingDown(const std::string &license_file_path); - - private: - +private: + boost::asio::io_service io_service_; + std::shared_ptr counting_thread_; }; diff --git a/cpp/src/server/Server.cpp b/cpp/src/server/Server.cpp index 5829f3e6a1..8480c2450c 100644 --- a/cpp/src/server/Server.cpp +++ b/cpp/src/server/Server.cpp @@ -159,15 +159,13 @@ Server::Start() { ConfigNode license_config = config.GetConfig(CONFIG_LICENSE); std::string license_file_path = license_config.GetValue(CONFIG_LICENSE_PATH); SERVER_LOG_INFO << "License path: " << license_file_path; + if(server::LicenseCheck::LegalityCheck(license_file_path) != SERVER_SUCCESS) { SERVER_LOG_ERROR << "License check failed"; exit(1); } - if(server::LicenseCheck::StartCountingDown(license_file_path) != SERVER_SUCCESS) { - SERVER_LOG_ERROR << "License counter start error"; - exit(1); - } + server::LicenseCheck::GetInstance().StartCountingDown(license_file_path); #endif // Handle Signal @@ -217,6 +215,9 @@ Server::Stop() { StopService(); +#ifdef ENABLE_LICENSE + server::LicenseCheck::GetInstance().StopCountingDown(); +#endif SERVER_LOG_INFO << "Vecwise server closed"; }