From 10e0e29487da06eddaa93289148954530356d97c Mon Sep 17 00:00:00 2001 From: Eric Heien Date: Tue, 4 Feb 2003 21:47:12 +0000 Subject: [PATCH] network error catching svn path=/trunk/boinc/; revision=862 --- checkin_notes | 15 +++++++++ client/client_state.C | 3 -- client/client_types.C | 6 ++-- client/cs_files.C | 1 + client/http.C | 8 ++++- client/pers_file_xfer.C | 52 ++++++++++++++++++++------------ client/pers_file_xfer.h | 11 ++++--- client/win/wingui.h | 1 + client/win/wingui_mainwindow.cpp | 28 ++++++++++++++--- client/win/wingui_mainwindow.h | 3 +- todo | 2 ++ 11 files changed, 92 insertions(+), 38 deletions(-) diff --git a/checkin_notes b/checkin_notes index 252738955b..8bd6a9234a 100755 --- a/checkin_notes +++ b/checkin_notes @@ -3079,3 +3079,18 @@ David Jan 30 2003 sched/ db_dump.C handle_request.C + +Eric Feb 04, 2003 + - Cleaned up formatting of client_state.xml + - Added retry message to transfers tab of Windows client + - Added error catching for network transfer failures + + client/ + client_state.C + client_types.C + cs_files.C + http.C + pers_file_xfer.C,h + win/ + wingui.h + wingui_mainwindow.cpp,h diff --git a/client/client_state.C b/client/client_state.C index f11563b3fc..23aca41ad1 100644 --- a/client/client_state.C +++ b/client/client_state.C @@ -501,9 +501,6 @@ int CLIENT_STATE::parse_state_file() { if (fip->pers_file_xfer) { fip->pers_file_xfer->init(fip, fip->upload_when_present); retval = pers_xfers->insert( fip->pers_file_xfer ); - if (retval) { - // TODO: What should we do here? - } } } else { delete fip; diff --git a/client/client_types.C b/client/client_types.C index b96483842c..d36744e3ff 100644 --- a/client/client_types.C +++ b/client/client_types.C @@ -363,17 +363,17 @@ int FILE_INFO::write(FILE* out, bool to_server) { if (file_signature) fprintf(out," \n%s\n", file_signature); } for (i=0; i%s\n", urls[i].text); + fprintf(out, " %s\n", urls[i].text); } if (!to_server && pers_file_xfer) { pers_file_xfer->write(out); } if (!to_server) { if (signed_xml && xml_signature) { - fprintf(out, "\n%s\n", signed_xml); + fprintf(out, " \n%s \n", signed_xml); } if (xml_signature) { - fprintf(out, "\n%s\n", xml_signature); + fprintf(out, " \n%s \n", xml_signature); } } fprintf(out, "\n"); diff --git a/client/cs_files.C b/client/cs_files.C index b2399e89f3..9acaef8c66 100644 --- a/client/cs_files.C +++ b/client/cs_files.C @@ -142,6 +142,7 @@ bool CLIENT_STATE::handle_pers_file_xfers() { pfx->fip->pers_file_xfer = NULL; pers_xfers->remove(pfx); delete pfx; + i--; action = true; } } diff --git a/client/http.C b/client/http.C index 4b1affce39..22fb2c9d4a 100644 --- a/client/http.C +++ b/client/http.C @@ -545,7 +545,13 @@ bool HTTP_OP_SET::poll() { } break; case HTTP_STATE_REPLY_BODY: - if (htp->io_done) { + if (htp->error) { + action = true; + if (log_flags.http_debug) printf("net_xfer returned error %d\n", htp->error); + htp->http_op_state = HTTP_STATE_DONE; + htp->http_op_retval = htp->error; + } + else if (htp->io_done) { action = true; switch(htp->http_op_type) { case HTTP_OP_POST2: diff --git a/client/pers_file_xfer.C b/client/pers_file_xfer.C index e60c4b7946..dfaacbffd8 100644 --- a/client/pers_file_xfer.C +++ b/client/pers_file_xfer.C @@ -41,15 +41,19 @@ // For upload, try to upload the file to the first URL; // if that fails try the others. // -int PERS_FILE_XFER::init(FILE_INFO* f, bool is_file_upload) { - fxp = NULL; - fip = f; + +PERS_FILE_XFER::PERS_FILE_XFER() { nretry = 0; first_request_time = time(0); next_request_time = first_request_time; +} + +int PERS_FILE_XFER::init(FILE_INFO* f, bool is_file_upload) { + fxp = NULL; + fip = f; is_upload = is_file_upload; xfer_done = false; - time_so_far = 0; + time_so_far = 0; return 0; } @@ -93,8 +97,16 @@ bool PERS_FILE_XFER::start_xfer() { ); } else { retval = gstate.file_xfers->insert(file_xfer); - if (retval) return false; fxp = file_xfer; + if (retval) { + if (log_flags.file_xfer) { + printf( "file_xfer insert failed\n" ); + } + fxp->file_xfer_retval = retval; + handle_xfer_failure(aclock); + fxp = NULL; + return false; + } if (log_flags.file_xfer) { printf( "started %s of %s to %s at time: %s\n", @@ -123,18 +135,18 @@ bool PERS_FILE_XFER::poll(unsigned int now) { // See if it's time to try again. // if (now >= (unsigned int)next_request_time) { - bool ok = start_xfer(); - last_time = dtime(); - return ok; + bool ok = start_xfer(); + last_time = dtime(); + return ok; } else { return false; } } - if(dtime() - last_time <= 2) { - time_so_far += dtime() - last_time; - } - last_time = dtime(); + if(dtime() - last_time <= 2) { + time_so_far += dtime() - last_time; + } + last_time = dtime(); if (fxp->file_xfer_done) { if (log_flags.file_xfer) { @@ -197,18 +209,18 @@ void PERS_FILE_XFER::handle_xfer_failure(unsigned int cur_time) { if (fxp->file_xfer_retval == HTTP_STATUS_RANGE_REQUEST_ERROR) { fip->delete_file(); } - + retry_and_backoff(cur_time); // See if it's time to give up on the persistent file xfer // if ((cur_time - first_request_time) > gstate.giveup_after) { // Set the associated files status to a ERR_GIVEUP_DOWNLOAD and ERR_GIVEUP_UPLOAD failure - if(is_upload) - fip->status = ERR_GIVEUP_UPLOAD; - else - fip->status = ERR_GIVEUP_DOWNLOAD; - xfer_done = true; + if(is_upload) + fip->status = ERR_GIVEUP_UPLOAD; + else + fip->status = ERR_GIVEUP_DOWNLOAD; + xfer_done = true; } if (log_flags.file_xfer_debug) { printf("Error: transfer failure for %s: %d\n", fip->name, fip->status); @@ -241,8 +253,8 @@ int PERS_FILE_XFER::retry_and_backoff(unsigned int cur_time) { } if (log_flags.file_xfer_debug) { printf( - "exponential back off is %d, current_time is %s\n", (int) exp_backoff,asctime( newtime ) - ); + "exponential back off is %d, current_time is %s\n", (int) exp_backoff,asctime( newtime ) + ); } return 0; } diff --git a/client/pers_file_xfer.h b/client/pers_file_xfer.h index ee45c213a0..5b71c5bdd9 100644 --- a/client/pers_file_xfer.h +++ b/client/pers_file_xfer.h @@ -35,12 +35,12 @@ #define PERS_RETRY_DELAY_MIN 60 // 1 minute #define PERS_RETRY_DELAY_MAX (60*60*4) // 4 hours -#define PERS_GIVEUP (60*60*24*7*2) // 2 weeks +#define PERS_GIVEUP (60*60*24*7*2) // 2 weeks #ifdef DEBUG -#define PERS_RETRY_DELAY_MIN 1 -#define PERS_RETRY_DELAY_MAX 30 -#define PERS_GIVEUP 30 +#define PERS_RETRY_DELAY_MIN 1 +#define PERS_RETRY_DELAY_MAX 30 +#define PERS_GIVEUP 30 #endif // give up on xfer if this time elapses since last byte xferred @@ -48,15 +48,16 @@ class PERS_FILE_XFER { int nretry; // # of retries so far int first_request_time; // UNIX time of first file request - int next_request_time; // UNIX time to next retry the file request bool is_upload; public: + int next_request_time; // UNIX time to next retry the file request double last_time, time_so_far; bool xfer_done; FILE_XFER* fxp; // nonzero if file xfer in progress FILE_INFO* fip; + PERS_FILE_XFER(); int init(FILE_INFO*, bool is_file_upload); bool poll(unsigned int now); void handle_xfer_failure(unsigned int cur_time); diff --git a/client/win/wingui.h b/client/win/wingui.h index 5e136401d1..76a4cdbd26 100755 --- a/client/win/wingui.h +++ b/client/win/wingui.h @@ -34,6 +34,7 @@ #include "log_flags.h" #include "client_state.h" #include "account.h" +#include "error_numbers.h" #include "resource.h" #include "util.h" #include "win_net.h" diff --git a/client/win/wingui_mainwindow.cpp b/client/win/wingui_mainwindow.cpp index ce94c02637..e9eed5dd33 100755 --- a/client/win/wingui_mainwindow.cpp +++ b/client/win/wingui_mainwindow.cpp @@ -33,7 +33,7 @@ char g_szTabItems[MAX_TABS][256] = { char g_szColumnTitles[MAX_LIST_ID][MAX_COLS][256] = { {"Project", "Account", "Total Credit", "Avg. Credit", "Resource Share", "", ""}, {"Project", "Application", "Name", "CPU time", "Progress", "To Completion", "Status"}, - {"Project", "File", "Progress", "Size", "Time", "Direction", ""}, + {"Project", "File", "Progress", "Size", "Time", "Status", ""}, {"Project", "Time", "Message", "", "", "", ""} }; @@ -54,8 +54,11 @@ char g_szMiscItems[MAX_MISC_STR][256] = { "Acknowledged", "Error: invalid state", "Completed", - "Upload", - "Download" + "Uploading", + "Downloading", + "Retry in", + "Download failed", + "Upload failed" }; ///////////////////////////////////////////////////////////////////////// @@ -336,8 +339,23 @@ void CMainWindow::UpdateGUI(CLIENT_STATE* pcs) strBuf.Format("%0.2d:%0.2d:%0.2d", xhour, xmin, xsec); m_XferListCtrl.SetItemText(i, 4, strBuf.GetBuffer(0)); - // direction - m_XferListCtrl.SetItemText(i, 5, fi->fip->generated_locally?g_szMiscItems[8]:g_szMiscItems[9]); + // status + if (fi->next_request_time > time(0)) { + double xtime = fi->next_request_time-time(0); + int xhour = (int)(xtime / (60 * 60)); + int xmin = (int)(xtime / 60) % 60; + int xsec = (int)(xtime) % 60; + strBuf.Format("%s %0.2d:%0.2d:%0.2d", g_szMiscItems[10], xhour, xmin, xsec); + m_XferListCtrl.SetItemText(i, 5, strBuf); + } else if (fi->fip->status == ERR_GIVEUP_DOWNLOAD) { + strBuf.Format(g_szMiscItems[11]); + m_XferListCtrl.SetItemText(i, 5, strBuf); + } else if (fi->fip->status == ERR_GIVEUP_UPLOAD) { + strBuf.Format(g_szMiscItems[12]); + m_XferListCtrl.SetItemText(i, 5, strBuf); + } else { + m_XferListCtrl.SetItemText(i, 5, fi->fip->generated_locally?g_szMiscItems[8]:g_szMiscItems[9]); + } } m_XferListCtrl.SetRedraw(TRUE); diff --git a/client/win/wingui_mainwindow.h b/client/win/wingui_mainwindow.h index 4f8c49c0b2..e396ef9ed8 100755 --- a/client/win/wingui_mainwindow.h +++ b/client/win/wingui_mainwindow.h @@ -66,7 +66,8 @@ #define MAX_TABS 5 #define MAX_USAGE_STR 5 -#define MAX_MISC_STR 10 +#define MAX_MISC_STR 13 + ////////// // class: CMyApp diff --git a/todo b/todo index e1d213cec1..0252b88b05 100755 --- a/todo +++ b/todo @@ -29,9 +29,11 @@ BUGS (arranged from high to low priority) - client died quickly on Mandrake 9.0 linux (unconfirmed) - make pie chart colors/labels easier to understand - need a way to refresh prefs from client +- Client should display "Upload failed" and "Download failed" when failure occurs - columns expand when window expands - Download speed is not as fast as it should be - Result status should say "downloading files", "uploading files", etc. +- Change vector removal routines to use an iterator ----------------------- HIGH-PRIORITY (should do for beta test)