replay: handle abort in getRemoteFileSize (#23427)

pull/23431/head
Dean Lee 3 years ago committed by GitHub
parent e0338fd77b
commit 86d730774d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      selfdrive/ui/replay/filereader.cc
  2. 4
      selfdrive/ui/replay/main.cc
  3. 5
      selfdrive/ui/replay/replay.cc
  4. 2
      selfdrive/ui/replay/replay.h
  5. 24
      selfdrive/ui/replay/util.cc
  6. 2
      selfdrive/ui/replay/util.h

@ -39,7 +39,7 @@ std::string FileReader::download(const std::string &url, std::atomic<bool> *abor
if (!result.empty()) { if (!result.empty()) {
return result; return result;
} }
if (i != max_retries_) { if (i != max_retries_ && !(abort && *abort)) {
std::cout << "download failed, retrying " << i + 1 << std::endl; std::cout << "download failed, retrying " << i + 1 << std::endl;
} }
} }

@ -11,12 +11,14 @@
const QString DEMO_ROUTE = "4cf7a6ad03080c90|2021-09-29--13-46-36"; const QString DEMO_ROUTE = "4cf7a6ad03080c90|2021-09-29--13-46-36";
struct termios oldt = {}; struct termios oldt = {};
Replay *replay = nullptr;
void sigHandler(int s) { void sigHandler(int s) {
std::signal(s, SIG_DFL); std::signal(s, SIG_DFL);
if (oldt.c_lflag) { if (oldt.c_lflag) {
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
} }
replay->stop();
qApp->quit(); qApp->quit();
} }
@ -143,7 +145,7 @@ int main(int argc, char *argv[]) {
replay_flags |= flag; replay_flags |= flag;
} }
} }
Replay *replay = new Replay(route, allow, block, nullptr, replay_flags, parser.value("data_dir"), &app); replay = new Replay(route, allow, block, nullptr, replay_flags, parser.value("data_dir"), &app);
if (!replay->load()) { if (!replay->load()) {
return 0; return 0;
} }

@ -34,10 +34,15 @@ Replay::Replay(QString route, QStringList allow, QStringList block, SubMaster *s
qRegisterMetaType<FindFlag>("FindFlag"); qRegisterMetaType<FindFlag>("FindFlag");
connect(this, &Replay::seekTo, this, &Replay::doSeek); connect(this, &Replay::seekTo, this, &Replay::doSeek);
connect(this, &Replay::seekToFlag, this, &Replay::doSeekToFlag); connect(this, &Replay::seekToFlag, this, &Replay::doSeekToFlag);
connect(this, &Replay::stop, this, &Replay::doStop);
connect(this, &Replay::segmentChanged, this, &Replay::queueSegment); connect(this, &Replay::segmentChanged, this, &Replay::queueSegment);
} }
Replay::~Replay() { Replay::~Replay() {
doStop();
}
void Replay::doStop() {
if (!stream_thread_ && segments_.empty()) return; if (!stream_thread_ && segments_.empty()) return;
qDebug() << "shutdown: in progress..."; qDebug() << "shutdown: in progress...";

@ -47,9 +47,11 @@ signals:
void segmentChanged(); void segmentChanged();
void seekTo(int seconds, bool relative); void seekTo(int seconds, bool relative);
void seekToFlag(FindFlag flag); void seekToFlag(FindFlag flag);
void stop();
protected slots: protected slots:
void queueSegment(); void queueSegment();
void doStop();
void doSeek(int seconds, bool relative); void doSeek(int seconds, bool relative);
void doSeekToFlag(FindFlag flag); void doSeekToFlag(FindFlag flag);
void segmentLoadFinished(bool sucess); void segmentLoadFinished(bool sucess);

@ -69,7 +69,7 @@ std::string formattedDataSize(size_t size) {
} // namespace } // namespace
size_t getRemoteFileSize(const std::string &url) { size_t getRemoteFileSize(const std::string &url, std::atomic<bool> *abort) {
CURL *curl = curl_easy_init(); CURL *curl = curl_easy_init();
if (!curl) return -1; if (!curl) return -1;
@ -77,14 +77,20 @@ size_t getRemoteFileSize(const std::string &url) {
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, dumy_write_cb); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, dumy_write_cb);
curl_easy_setopt(curl, CURLOPT_HEADER, 1); curl_easy_setopt(curl, CURLOPT_HEADER, 1);
curl_easy_setopt(curl, CURLOPT_NOBODY, 1); curl_easy_setopt(curl, CURLOPT_NOBODY, 1);
CURLcode res = curl_easy_perform(curl);
double content_length = -1; CURLM *cm = curl_multi_init();
if (res == CURLE_OK) { curl_multi_add_handle(cm, curl);
curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &content_length); int still_running = 1;
} else { while (still_running > 0 && !(abort && *abort)) {
std::cout << "Download failed: error code: " << res << std::endl; CURLMcode mc = curl_multi_perform(cm, &still_running);
if (!mc) curl_multi_wait(cm, nullptr, 0, 1000, nullptr);
} }
double content_length = -1;
curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &content_length);
curl_multi_remove_handle(cm, curl);
curl_easy_cleanup(curl); curl_easy_cleanup(curl);
curl_multi_cleanup(cm);
return content_length > 0 ? (size_t)content_length : 0; return content_length > 0 ? (size_t)content_length : 0;
} }
@ -176,7 +182,7 @@ bool httpDownload(const std::string &url, T &buf, size_t chunk_size, size_t cont
} }
std::string httpGet(const std::string &url, size_t chunk_size, std::atomic<bool> *abort) { std::string httpGet(const std::string &url, size_t chunk_size, std::atomic<bool> *abort) {
size_t size = getRemoteFileSize(url); size_t size = getRemoteFileSize(url, abort);
if (size == 0) return {}; if (size == 0) return {};
std::string result(size, '\0'); std::string result(size, '\0');
@ -184,7 +190,7 @@ std::string httpGet(const std::string &url, size_t chunk_size, std::atomic<bool>
} }
bool httpDownload(const std::string &url, const std::string &file, size_t chunk_size, std::atomic<bool> *abort) { bool httpDownload(const std::string &url, const std::string &file, size_t chunk_size, std::atomic<bool> *abort) {
size_t size = getRemoteFileSize(url); size_t size = getRemoteFileSize(url, abort);
if (size == 0) return false; if (size == 0) return false;
std::ofstream of(file, std::ios::binary | std::ios::out); std::ofstream of(file, std::ios::binary | std::ios::out);

@ -9,6 +9,6 @@ std::string decompressBZ2(const std::string &in, std::atomic<bool> *abort = null
std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic<bool> *abort = nullptr); std::string decompressBZ2(const std::byte *in, size_t in_size, std::atomic<bool> *abort = nullptr);
void enableHttpLogging(bool enable); void enableHttpLogging(bool enable);
std::string getUrlWithoutQuery(const std::string &url); std::string getUrlWithoutQuery(const std::string &url);
size_t getRemoteFileSize(const std::string &url); size_t getRemoteFileSize(const std::string &url, std::atomic<bool> *abort = nullptr);
std::string httpGet(const std::string &url, size_t chunk_size = 0, std::atomic<bool> *abort = nullptr); std::string httpGet(const std::string &url, size_t chunk_size = 0, std::atomic<bool> *abort = nullptr);
bool httpDownload(const std::string &url, const std::string &file, size_t chunk_size = 0, std::atomic<bool> *abort = nullptr); bool httpDownload(const std::string &url, const std::string &file, size_t chunk_size = 0, std::atomic<bool> *abort = nullptr);

Loading…
Cancel
Save