diff options
Diffstat (limited to 'segget/distfile.cpp')
-rw-r--r-- | segget/distfile.cpp | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/segget/distfile.cpp b/segget/distfile.cpp index 72dc158..8e85d7a 100644 --- a/segget/distfile.cpp +++ b/segget/distfile.cpp @@ -121,7 +121,26 @@ bool Tdistfile::allows_new_actions(){ // if (downloaded) return false; // else return true; // int time_left=0; - if (status==DDOWNLOADED) return false; + if (status==DDOWNLOADED){ + debug("No new connection for distfile:"+name+". Distfile has DDOWNLOADED status"); + return false; + } + if (status==DFAILED){ + debug("No new connection for distfile:"+name+". Distfile has DFAILED status"); + return false; + } +// debug("Distfile "+Ppkg_array[pkg_num]->distfile_vector[distfile_num]->name+" allows new connections"); +// debug(" distfile_num:"+toString(distfile_num)); + if (active_connections_num<settings.max_connection_num_per_distfile){ + debug("Allow new connection for ============================================= Distfile "+name); + debug("max_connection limit has not been reached"); + return true; + }else{ + debug("No new connection for distfile: "+name+". It already has " + +toString(active_connections_num) + +" connections => choose another distfile."); + return false; + } // if (((status==DPROXY_QUEUED) || (status==DPROXY_DOWNLOADING)) && (time_left<100)) return false; //oterwise allow connections // DNEW, @@ -131,9 +150,6 @@ bool Tdistfile::allows_new_actions(){ // DPROXY_DOWNLOADED, // DWAITING, // DDOWNLOADING, -// DDOWNLOADED, -// DFAILED - return true; } void Tdistfile::init(){ @@ -293,31 +309,34 @@ bool Tdistfile::choose_best_mirror(CURLM* cm, uint connection_num, uint network_ bool Tdistfile::choose_best_local_mirror(CURLM* cm, uint connection_num, uint network_num, uint seg_num){ try{ long best_mirror_num=-1; // the best isn't set let's find it + bool all_mirrors_failed=true; ulong best_mirror_self_rating=-1; ulong curr_mirror_self_rating; debug("Choosing mirror for network"+toString(network_num)); for (ulong mirror_num=0; mirror_num<network_array[network_num].benchmarked_mirror_list.size(); mirror_num++){ debug("Evaluating mirror:"+network_array[network_num].benchmarked_mirror_list[mirror_num].url); - if (network_array[network_num].benchmarked_mirror_list[mirror_num].get_active_num()<settings.max_connections_num_per_mirror){ - curr_mirror_self_rating=network_array[network_num].benchmarked_mirror_list[mirror_num].mirror_on_the_wall(); - if (curr_mirror_self_rating<best_mirror_self_rating){ - best_mirror_num=mirror_num; - best_mirror_self_rating=curr_mirror_self_rating; - } - if (best_mirror_self_rating==0) - // 0 can not be improved - it's one of the best - break; + if (network_distfile_brokers_array[network_num].mirror_fails_vector[mirror_num]){ + debug("mirror:"+network_array[network_num].benchmarked_mirror_list[mirror_num].url+" has FAILED status - will be skipped"); }else{ - debug("Mirror already has:" - +toString(network_array[network_num].benchmarked_mirror_list[mirror_num].get_active_num()) - +" connections which doesn't meet limit:"+toString(settings.max_connections_num_per_mirror)); + all_mirrors_failed=false; + if (network_array[network_num].benchmarked_mirror_list[mirror_num].get_active_num()<settings.max_connections_num_per_mirror){ + curr_mirror_self_rating=network_array[network_num].benchmarked_mirror_list[mirror_num].mirror_on_the_wall(); + if (curr_mirror_self_rating<best_mirror_self_rating){ + best_mirror_num=mirror_num; + best_mirror_self_rating=curr_mirror_self_rating; + } + if (best_mirror_self_rating==0) + // 0 can not be improved - it's one of the best + break; + }else{ + debug("Mirror already has:" + +toString(network_array[network_num].benchmarked_mirror_list[mirror_num].get_active_num()) + +" connections which doesn't meet limit:"+toString(settings.max_connections_num_per_mirror)); + } } } if (best_mirror_num!=-1){ debug("Downloading from BEST_LOCAL_MIRROR:"+network_array[network_num].benchmarked_mirror_list[best_mirror_num].url); - - - // active_connections_num++; connection_array[connection_num].start(cm, network_num, num, &dn_segments[seg_num], best_mirror_num); return R_R_DOWNLOAD_STARTED; @@ -325,6 +344,10 @@ bool Tdistfile::choose_best_local_mirror(CURLM* cm, uint connection_num, uint ne else{ debug("Can't choose LOCAL mirror for segment:"+dn_segments[seg_num].file_name); error_log("Can't choose LOCAL mirror for segment:"+dn_segments[seg_num].file_name); + if (all_mirrors_failed){ + debug("All local mirrors failed in network#"+toString(network_num)); + error_log("All local mirrors failed in network#"+toString(network_num)); + } return 1; } }catch(...){ |