diff options
author | Zack Galbreath <zack.galbreath@kitware.com> | 2017-01-04 15:27:37 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2017-01-20 16:37:27 (GMT) |
commit | 5614a5cd1f7f8fe34f6b31c572476a2ddfd6d9ae (patch) | |
tree | fde1befc0e3198dc331b15ea861842c36c97f7df /Source/CTest/cmCTestSubmitHandler.cxx | |
parent | c628fd2fab273999e959aad00834369924dd9d06 (diff) | |
download | CMake-5614a5cd1f7f8fe34f6b31c572476a2ddfd6d9ae.zip CMake-5614a5cd1f7f8fe34f6b31c572476a2ddfd6d9ae.tar.gz CMake-5614a5cd1f7f8fe34f6b31c572476a2ddfd6d9ae.tar.bz2 |
ctest_submit: Allow RETRY_COUNT for CDASH_UPLOAD
Teach the CDASH_UPLOAD signature of ctest_submit() to honor the
RETRY_COUNT and RETRY_DELAY options.
Also teach HttpRequest() to honor the default 120 second timeout
for curl connections.
Diffstat (limited to 'Source/CTest/cmCTestSubmitHandler.cxx')
-rw-r--r-- | Source/CTest/cmCTestSubmitHandler.cxx | 117 |
1 files changed, 101 insertions, 16 deletions
diff --git a/Source/CTest/cmCTestSubmitHandler.cxx b/Source/CTest/cmCTestSubmitHandler.cxx index 79c3663..8ded15e 100644 --- a/Source/CTest/cmCTestSubmitHandler.cxx +++ b/Source/CTest/cmCTestSubmitHandler.cxx @@ -1022,6 +1022,30 @@ int cmCTestSubmitHandler::HandleCDashUploadFile(std::string const& file, "Only http and https are supported for CDASH_UPLOAD\n"); return -1; } + bool internalTest = cmSystemTools::IsOn(this->GetOption("InternalTest")); + + // Get RETRY_COUNT and RETRY_DELAY values if they were set. + std::string retryDelayString = this->GetOption("RetryDelay") == CM_NULLPTR + ? "" + : this->GetOption("RetryDelay"); + std::string retryCountString = this->GetOption("RetryCount") == CM_NULLPTR + ? "" + : this->GetOption("RetryCount"); + unsigned long retryDelay = 0; + if (retryDelayString != "") { + if (!cmSystemTools::StringToULong(retryDelayString.c_str(), &retryDelay)) { + cmCTestLog(this->CTest, WARNING, "Invalid value for 'RETRY_DELAY' : " + << retryDelayString << std::endl); + } + } + unsigned long retryCount = 0; + if (retryCountString != "") { + if (!cmSystemTools::StringToULong(retryCountString.c_str(), &retryCount)) { + cmCTestLog(this->CTest, WARNING, "Invalid value for 'RETRY_DELAY' : " + << retryCountString << std::endl); + } + } + char md5sum[33]; md5sum[32] = 0; cmSystemTools::ComputeFileMD5(file, md5sum); @@ -1058,7 +1082,33 @@ int cmCTestSubmitHandler::HandleCDashUploadFile(std::string const& file, << "\nfile: " << file << "\n", this->Quiet); std::string response; - if (!curl.HttpRequest(url, fields, response)) { + + bool requestSucceeded = curl.HttpRequest(url, fields, response); + if (!internalTest && !requestSucceeded) { + // If request failed, wait and retry. + for (unsigned long i = 0; i < retryCount; i++) { + cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT, + " Request failed, waiting " << retryDelay + << " seconds...\n", + this->Quiet); + + double stop = cmSystemTools::GetTime() + static_cast<double>(retryDelay); + while (cmSystemTools::GetTime() < stop) { + cmSystemTools::Delay(100); + } + + cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT, + " Retry request: Attempt " + << (i + 1) << " of " << retryCount << std::endl, + this->Quiet); + + requestSucceeded = curl.HttpRequest(url, fields, response); + if (requestSucceeded) { + break; + } + } + } + if (!internalTest && !requestSucceeded) { cmCTestLog(this->CTest, ERROR_MESSAGE, "Error in HttpRequest\n" << response); return -1; @@ -1068,30 +1118,32 @@ int cmCTestSubmitHandler::HandleCDashUploadFile(std::string const& file, this->Quiet); Json::Value json; Json::Reader reader; - if (!reader.parse(response, json)) { + if (!internalTest && !reader.parse(response, json)) { cmCTestLog(this->CTest, ERROR_MESSAGE, "error parsing json string [" << response << "]\n" << reader.getFormattedErrorMessages() << "\n"); return -1; } - if (json["status"].asInt() != 0) { + if (!internalTest && json["status"].asInt() != 0) { cmCTestLog(this->CTest, ERROR_MESSAGE, "Bad status returned from CDash: " << json["status"].asInt()); return -1; } - if (json["datafilesmd5"].isArray()) { - int datares = json["datafilesmd5"][0].asInt(); - if (datares == 1) { - cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT, - "File already exists on CDash, skip upload " << file - << "\n", - this->Quiet); - return 0; + if (!internalTest) { + if (json["datafilesmd5"].isArray()) { + int datares = json["datafilesmd5"][0].asInt(); + if (datares == 1) { + cmCTestOptionalLog(this->CTest, HANDLER_VERBOSE_OUTPUT, + "File already exists on CDash, skip upload " + << file << "\n", + this->Quiet); + return 0; + } + } else { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "bad datafilesmd5 value in response " << response << "\n"); + return -1; } - } else { - cmCTestLog(this->CTest, ERROR_MESSAGE, - "bad datafilesmd5 value in response " << response << "\n"); - return -1; } std::string upload_as = cmSystemTools::GetFilenameName(file); @@ -1100,7 +1152,40 @@ int cmCTestSubmitHandler::HandleCDashUploadFile(std::string const& file, << "md5=" << md5sum << "&" << "filename=" << curl.Escape(upload_as) << "&" << "buildid=" << json["buildid"].asString(); - if (!curl.UploadFile(file, url, fstr.str(), response)) { + + bool uploadSucceeded = false; + if (!internalTest) { + uploadSucceeded = curl.UploadFile(file, url, fstr.str(), response); + } + + if (!uploadSucceeded) { + // If upload failed, wait and retry. + for (unsigned long i = 0; i < retryCount; i++) { + cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT, + " Upload failed, waiting " << retryDelay + << " seconds...\n", + this->Quiet); + + double stop = cmSystemTools::GetTime() + static_cast<double>(retryDelay); + while (cmSystemTools::GetTime() < stop) { + cmSystemTools::Delay(100); + } + + cmCTestOptionalLog(this->CTest, HANDLER_OUTPUT, + " Retry upload: Attempt " + << (i + 1) << " of " << retryCount << std::endl, + this->Quiet); + + if (!internalTest) { + uploadSucceeded = curl.UploadFile(file, url, fstr.str(), response); + } + if (uploadSucceeded) { + break; + } + } + } + + if (!uploadSucceeded) { cmCTestLog(this->CTest, ERROR_MESSAGE, "error uploading to CDash. " << file << " " << url << " " << fstr.str()); return -1; |