diff options
author | Kostyantyn Ovechko <fastinetserver@gmail.com> | 2010-07-18 22:23:26 +0300 |
---|---|---|
committer | Kostyantyn Ovechko <fastinetserver@gmail.com> | 2010-07-18 22:23:26 +0300 |
commit | 16aeb45578965d635546507c139c59b2d8f32d23 (patch) | |
tree | f34166efa143de5c3afca228ee97aba626860fae | |
parent | Split provide_segment function into 3 parts (diff) | |
download | idfetch-16aeb45578965d635546507c139c59b2d8f32d23.tar.gz idfetch-16aeb45578965d635546507c139c59b2d8f32d23.tar.bz2 idfetch-16aeb45578965d635546507c139c59b2d8f32d23.zip |
Improve network selection algorithm.
0) Segget starts from the highest priority networks.
1) Segget tries local mirrors and mirrors provided by proxy-fetchers first.
2) If no success and requests to proxy-fetchers are allowed => segget selects proxy-fetcher and requests from it.
3) If proxy-fetcher replied that file has been downloaded => segget starts from step 1 again.
4) If no download started till now and remote-mirrors are allowed => segget selects a remote network and selects a mirror from it.
5) If no success on step 4, segget switches to lower priority networks
-rw-r--r-- | segget/connection.cpp | 37 | ||||
-rw-r--r-- | segget/connection.h | 3 | ||||
-rw-r--r-- | segget/distfile.cpp | 166 | ||||
-rw-r--r-- | segget/distfile.h | 21 | ||||
-rw-r--r-- | segget/networkbroker.cpp | 45 | ||||
-rw-r--r-- | segget/networkbroker.h | 21 | ||||
-rw-r--r-- | segget/pkg.cpp | 3 | ||||
-rw-r--r-- | segget/responses.h | 57 |
8 files changed, 271 insertions, 82 deletions
diff --git a/segget/connection.cpp b/segget/connection.cpp index d64fc16..d2b0e2c 100644 --- a/segget/connection.cpp +++ b/segget/connection.cpp @@ -36,6 +36,7 @@ void init_connections(){ void Tconnection::start(CURLM *cm, uint network_number, uint distfile_num, Tsegment *started_segment, uint best_mirror_num){ try{ + segment=started_segment; debug("Starting connection for distfile: "+segment->parent_distfile->name); mirror_num=best_mirror_num; @@ -45,6 +46,11 @@ void Tconnection::start(CURLM *cm, uint network_number, uint distfile_num, Tsegm gettimeofday(&start_time,NULL); active=true; debug("Connecting network"+toString(network_num)); + + if (network_array[network_number].network_mode==MODE_PROXY_FETCHER){ + connection_start_time_network_phase_for_pf_networks=segment->parent_distfile->network_distfile_brokers_array[network_number].phase; + } + network_array[network_num].connect(); segment->prepare_for_connection(cm, connection_num, network_num, distfile_num, mirror_num); debug("Started connection for distfile: "+segment->parent_distfile->name); @@ -63,7 +69,7 @@ void Tconnection::stop(uint connection_result){ Tdistfile* prnt_distfile=segment->parent_distfile; prnt_distfile->active_connections_num--; - +/* Tmirror *Pcurr_mirror; if (network_array[network_num].network_mode==MODE_LOCAL){ Pcurr_mirror=&network_array[network_num].benchmarked_mirror_list[mirror_num]; @@ -72,11 +78,39 @@ void Tconnection::stop(uint connection_result){ }else{ Pcurr_mirror=find_mirror(strip_mirror_name(segment->url)); } +*/ + + Tmirror *Pcurr_mirror; + if (network_array[network_num].network_mode==MODE_REMOTE){ + Pcurr_mirror=find_mirror(strip_mirror_name(segment->url)); + }else{ + Pcurr_mirror=&network_array[network_num].benchmarked_mirror_list[mirror_num]; + } timeval now_time; gettimeofday(&now_time,NULL); if (connection_result!=0){ + switch (network_array[network_num].network_mode){ + case MODE_LOCAL:{ + // prnt_distfile->network_distfile_brokers_array[network_num].mirror_fails_vector[mirror_num]=true; + prnt_distfile->network_distfile_brokers_array[network_num].local_mirror_failed(mirror_num); + // find_mirror(strip_mirror_name(segment->url)); + break; + } + case MODE_PROXY_FETCHER:{ + // prnt_distfile->network_distfile_brokers_array[network_num].mirror_fails_vector[mirror_num]=true; + if (connection_start_time_network_phase_for_pf_networks==E_USE_AS_LOCAL_MIRRORS){ + prnt_distfile->network_distfile_brokers_array[network_num].local_mirror_failed(mirror_num); + }else{ // proxy-fetcher mirror failed, if everything correct it must be in phase E_PROXY_FETCHER_DOWNLOADED, + prnt_distfile->network_distfile_brokers_array[network_num].proxy_fetcher_mirror_failed(mirror_num); + } + // find_mirror(strip_mirror_name(segment->url)); + break; + } + default:{ // MODE REMOTE MIRRORS + } + } // error -> start downloading again msg_status2(segment->connection_num, toString(connection_result)+"]- Failed download "+segment->file_name); debug(toString(connection_result)+"]- Failed download "+segment->url); @@ -90,6 +124,7 @@ void Tconnection::stop(uint connection_result){ // no error => count this one and start new log("Succesfully downloaded "+segment->file_name+" on connection#"+toString(connection_num)); debug(" Successful download "+segment->url); + Pcurr_mirror=find_mirror(strip_mirror_name(segment->url)); Pcurr_mirror->stop(time_left_from(connection_array[connection_num].start_time),segment->segment_size); segment->status=SDOWNLOADED; prnt_distfile->inc_dld_segments_count(segment); diff --git a/segget/connection.h b/segget/connection.h index d1f9551..d20ad01 100644 --- a/segget/connection.h +++ b/segget/connection.h @@ -32,12 +32,14 @@ class Tsegment; #include "segment.h" #include "utils.h" +#include "networkbroker.h" using namespace std; class Tconnection{ static uint total_connections; private: + Tnetwork_distfile_broker_phases connection_start_time_network_phase_for_pf_networks; uint network_num; uint mirror_num; ulong total_dld_bytes; @@ -48,6 +50,7 @@ class Tconnection{ timeval start_time; Tsegment *segment; Tconnection(): + connection_start_time_network_phase_for_pf_networks(E_USE_AS_LOCAL_MIRRORS), network_num(0), mirror_num(0), total_dld_bytes(0), diff --git a/segget/distfile.cpp b/segget/distfile.cpp index 08ca098..16d98f0 100644 --- a/segget/distfile.cpp +++ b/segget/distfile.cpp @@ -27,11 +27,6 @@ #include "distfile.h" //Make the necessary includes and set up the variables: -#define ALLOW_PROXY_FETCHER_NETWORKS 201 -#define DO_NOT_ALLOW_PROXY_FETCHER_NETWORKS 202 -#define ALLOW_REMOTE_NETWORKS 203 -#define DO_NOT_ALLOW_REMOTE_NETWORKS 204 -#define ALLOW_LOWER_PRIORITY_NETWORKS 205 using namespace std; int Tdistfile::decode_server_response(string server_response){ @@ -39,24 +34,34 @@ int Tdistfile::decode_server_response(string server_response){ /* #define R_LM_WAIT_FOR_LOCAL_MIRRORS 100 -#define R_PF_BE_MORE_PATIENT 101 -#define R_PF_ERROR_ADDING_TO_PROXY_QUEUE 102 -#define R_PF_ADDED_TO_PROXY_QUEUE 103 -#define R_PF_ALREADY_WAS_IN_QUEUE 104 -#define R_PF_DOWNLOADED 105 +#define R_PF_ADDED_TO_PROXY_QUEUE 101 +#define R_PF_ALREADY_WAS_IN_QUEUE 102 +#define R_PF_DOWNLOADED 103 +#define R_PF_BE_MORE_PATIENT 104 +#define R_PF_ERROR_ADDING_TO_PROXY_QUEUE 105 #define R_PF_FAILED 106 -#define R_PF_WAIT_FOR_PROXY_FETCHER_MIRRORS 100 +#define R_PF_REJECTED 107 // 0 for succesfull return of provide_segment() #define R_R_DOWNLOAD_STARTED 0 -#define R_R_WAITING 107 -#define R_R_DOWNLOADING 108 +#define R_R_WAITING 108 +#define R_R_DOWNLOADING 109 -#define R_LM_PF_R_NO_FREE_NETWORK_CONNECTION_FOUND 109 +#define R_LM_PF_R_NO_FREE_NETWORK_CONNECTION_FOUND 110 + +#define ALLOW_PROXY_FETCHER_NETWORKS 201 +#define DO_NOT_ALLOW_PROXY_FETCHER_NETWORKS 202 +#define ALLOW_REMOTE_NETWORKS 203 +#define DO_NOT_ALLOW_REMOTE_NETWORKS 204 +#define ALLOW_LOWER_PRIORITY_NETWORKS 205 */ - int int_server_response=atoi(server_response.c_str()); +int int_server_response=atoi(server_response.c_str()); switch (int_server_response){ + case R_PF_REJECTED:{ + debug("Server response:"+server_response+" - R_PF_REJECTED"); + return int_server_response; + }; case R_PF_ERROR_ADDING_TO_PROXY_QUEUE:{ debug("Server response:"+server_response+" - R_PF_ERROR_ADDING_TO_PROXY_QUEUE"); return int_server_response; @@ -367,24 +372,42 @@ uint Tdistfile::provide_local_network(CURLM* cm, uint connection_num, uint seg_n if (network_array[network_num].priority==network_priority){ debug(" network_priority="+toString(network_array[network_num].priority)); if (network_array[network_num].network_mode==MODE_LOCAL){ - if (network_array[network_num].has_free_connections()){ - if (network_distfile_brokers_array[network_num].some_mirrors_have_NOT_failed_yet()){ + if (network_distfile_brokers_array[network_num].phase==E_USE_AS_LOCAL_MIRRORS){ + if (network_array[network_num].has_free_connections()){ // debug(" Allowed network#:"+toString(network_num)); if ((best_local_network_num==-1) or (network_array[best_local_network_num].active_connections_num>network_array[network_num].active_connections_num)){ best_local_network_num=network_num; debug(" Replace best LOCAL network to network#:"+toString(network_num)); } - } - }else{ - if (network_array[network_num].only_local_when_possible){ - if (network_distfile_brokers_array[network_num].some_mirrors_have_NOT_failed_yet()){ + }else{ + if (network_array[network_num].only_local_when_possible){ allow_proxy_fetcher_mirrors=false; debug("Network"+toString(network_num)+" forbids using remote mirrors because not all local mirrors have failed"); } } } } + if (network_array[network_num].network_mode==MODE_PROXY_FETCHER) + { + if ((network_distfile_brokers_array[network_num].phase==E_USE_AS_LOCAL_MIRRORS) + or (network_distfile_brokers_array[network_num].phase==E_PROXY_FETCHER_DOWNLOADED)) + { + if (network_array[network_num].has_free_connections()){ +// debug(" Allowed network#:"+toString(network_num)); + if ((best_local_network_num==-1) + or (network_array[best_local_network_num].active_connections_num>network_array[network_num].active_connections_num)){ + best_local_network_num=network_num; + debug(" Replace best LOCAL network to network#:"+toString(network_num)); + } + }else{ + if (network_array[network_num].only_local_when_possible){ + allow_proxy_fetcher_mirrors=false; + debug("Network"+toString(network_num)+" forbids using remote mirrors because not all local mirrors have failed"); + } + } + } + } } } if (best_local_network_num!=-1){ @@ -394,19 +417,19 @@ uint Tdistfile::provide_local_network(CURLM* cm, uint connection_num, uint seg_n return choose_best_local_mirror(cm, connection_num, best_local_network_num, seg_num); }else{ if (allow_proxy_fetcher_mirrors){ - return ALLOW_PROXY_FETCHER_NETWORKS; + return ALLOW_REQUESTS_TO_PROXY_FETCHERS; }else{ debug("NOT all local mirrors have failed - restricted to local mirrors only."); - return DO_NOT_ALLOW_PROXY_FETCHER_NETWORKS; + return DO_NOT_ALLOW_REQUESTS_TO_PROXY_FETCHERS; } } }catch(...){ - error_log("Error: distfile.cpp: provide_local_network()"); + error_log("Error: distfile.cpp: provlocal_networkwork()"); return 1; } } -uint Tdistfile::provide_proxy_fetcher_network(CURLM* cm, uint connection_num, uint seg_num, uint network_priority){ +uint Tdistfile::request_proxy_fetcher_network(uint network_priority){ // TO-DO: Add option to go for remote networks or low priority networks even if already DPROXY_QUEUED // TO-DO: There can be several proxy-fetchers of the same priority level, define a rule to make a choice try{ @@ -420,12 +443,22 @@ uint Tdistfile::provide_proxy_fetcher_network(CURLM* cm, uint connection_num, ui //replace this one by does_not_reject_connections // if (network_array[network_num].has_free_connections()){ if ((best_proxy_fetcher_network_num==-1) + // or // (network_array[best_proxy_fetcher_network_num].active_connections_num>network_array[network_num].active_connections_num) - ){ - best_proxy_fetcher_network_num=network_num; - debug(" Replace best_proxy_fetcher_network_num to network#:"+toString(best_proxy_fetcher_network_num)); - } + + ){ + switch (network_distfile_brokers_array[best_proxy_fetcher_network_num].proxy_fetcher_response){ + case R_PF_DOWNLOADED:break; + case R_PF_ERROR_ADDING_TO_PROXY_QUEUE:break; + case R_PF_FAILED:break; + case R_PF_REJECTED:break; + default:{ + best_proxy_fetcher_network_num=network_num; + debug(" Replace best_proxy_fetcher network_num to network#:"+toString(best_proxy_fetcher_network_num)); + break; + } + } /* }else{ if (network_array[network_num].only_local_when_possible){ @@ -436,6 +469,7 @@ uint Tdistfile::provide_proxy_fetcher_network(CURLM* cm, uint connection_num, ui } } */ + } } } } @@ -445,15 +479,21 @@ uint Tdistfile::provide_proxy_fetcher_network(CURLM* cm, uint connection_num, ui return R_PF_BE_MORE_PATIENT; }else{ // request from proxy fethcer - int request_result=request(best_proxy_fetcher_network_num, json_data); + network_distfile_brokers_array[best_proxy_fetcher_network_num].proxy_fetcher_response=request(best_proxy_fetcher_network_num, json_data); + if ((network_distfile_brokers_array[best_proxy_fetcher_network_num].proxy_fetcher_response==R_PF_DOWNLOADED) + and (network_distfile_brokers_array[best_proxy_fetcher_network_num].phase==E_ALL_LOCAL_MIRRORS_FAILED)) + { + network_distfile_brokers_array[best_proxy_fetcher_network_num].phase=E_PROXY_FETCHER_DOWNLOADED; + } debug("Trying to dowload distfile"+name+" via proxy_fetcher. status="+toString(status)); - if (request_result==R_PF_DOWNLOADED){ + if (network_distfile_brokers_array[best_proxy_fetcher_network_num].phase==E_PROXY_FETCHER_DOWNLOADED){ // start download from the proxy_fetcher debug(" So best proxy_fetcher_network is network#:"+toString(best_proxy_fetcher_network_num)); - return choose_best_local_mirror(cm, connection_num, best_proxy_fetcher_network_num, seg_num); + return R_PF_DOWNLOADED; + //choose_best_local_mirror(cm, connection_num, best_proxy_fetcher_network_num, seg_num); } //return - don't switch to low priority networks - return request_result; + return network_distfile_brokers_array[best_proxy_fetcher_network_num].proxy_fetcher_response; } }else{ if (allow_remote_mirrors){ @@ -465,7 +505,7 @@ uint Tdistfile::provide_proxy_fetcher_network(CURLM* cm, uint connection_num, ui } } }catch(...){ - error_log("Error: distfile.cpp: provide_proxy_fetcher_network()"); + error_log("Error: distfile.cpp: provproxy_fetcher_networkwork()"); return 1; } } @@ -511,30 +551,37 @@ uint Tdistfile::provide_remote_network(CURLM* cm, uint connection_num, uint seg_ } } - int Tdistfile::provide_segment(CURLM* cm, uint connection_num, uint seg_num){ try{ - int result; + int result=R_NOT_SET; for (uint network_priority=10; network_priority>0; network_priority--){ - result=provide_local_network(cm, connection_num, seg_num, network_priority); - if (result==ALLOW_PROXY_FETCHER_NETWORKS){ - debug("Switching to proxy-fetcher networks with priority:"+toString(network_priority)); - result=provide_proxy_fetcher_network(cm, connection_num, seg_num, network_priority); - if (result==ALLOW_REMOTE_NETWORKS){ - debug("Switching to remote networks with priority:"+toString(network_priority)); - result=provide_remote_network(cm, connection_num, seg_num, network_priority); - // if not lower_priority_networks -> result found -> return it - if (result!=ALLOW_LOWER_PRIORITY_NETWORKS){ - return result; + { + result=provide_local_network(cm, connection_num, seg_num, network_priority); + if (result==ALLOW_REQUESTS_TO_PROXY_FETCHERS){ + debug("Switching to proxy-fetcher networks with priority:"+toString(network_priority)); + result=request_proxy_fetcher_network(network_priority); + switch (result){ + case ALLOW_REMOTE_NETWORKS:{ + debug("Switching to remote networks with priority:"+toString(network_priority)); + result=provide_remote_network(cm, connection_num, seg_num, network_priority); + // if not lower_priority_networks => result found => return it + if (result!=ALLOW_LOWER_PRIORITY_NETWORKS){ + return result; + }; + break; + } + // don't switch to remote and lower priority networks => return results + case DO_NOT_ALLOW_REMOTE_NETWORKS: return result; + case R_PF_DOWNLOADED: break; } }else{ - // don't switch to low priority networks - return results + // don't switch to proxy-fetcher requests, remote, + // and lower priority networks => return results return result; } - }else{ - // don't switch to low priority networks - return results - return result; - } + // try to download from local mirrors again because one of the proxy-fetcher + // claims that distfile has been donwloaded + }while (result==R_PF_DOWNLOADED); } // haven't found anything suitable return R_LM_PF_R_NO_FREE_NETWORK_CONNECTION_FOUND; @@ -552,16 +599,23 @@ void Tdistfile::inc_dld_segments_count(Tsegment* current_segment){ error_log("Error: distfile.cpp: inc_dld_segments_count()"); } } +long is_symlink_restricted(string distfile_name){ + for(ulong pattern_num=0; pattern_num<settings.provide_mirror_files_restricted_patterns_vector.size(); pattern_num++){ + if (distfile_name.find(settings.provide_mirror_files_restricted_patterns_vector[pattern_num],0)!=distfile_name.npos){ + return pattern_num; + } + } + return -1; +} void Tdistfile::symlink_distfile_to_provide_mirror_dir(){ try{ - for(ulong pattern_num=0; pattern_num<settings.provide_mirror_files_restricted_patterns_vector.size(); pattern_num++){ - if (name.find(settings.provide_mirror_files_restricted_patterns_vector[pattern_num],0)!=name.npos){ - log("Symlink to distfile:"+name+" was restricted by pattern <" + long pattern_num=is_symlink_restricted(name); + if (pattern_num>=0){ + log("Symlink to distfile:"+name+" was restricted by pattern <" +settings.provide_mirror_files_restricted_patterns_vector[pattern_num] +"> from line "+toString(pattern_num+1)+" of restrict.conf file"); - return; - } + return; } string new_mirror_name; string old_distfile_name; diff --git a/segget/distfile.h b/segget/distfile.h index 3618ba3..ea92fe3 100644 --- a/segget/distfile.h +++ b/segget/distfile.h @@ -52,6 +52,7 @@ #include "network.h" #include "networkbroker.h" #include "segment.h" +#include "responses.h" class Tsegment; //#include <sys/types.h> @@ -72,22 +73,6 @@ using namespace std; typedef unsigned int uint; -#define R_LM_WAIT_FOR_LOCAL_MIRRORS 100 - -#define R_PF_BE_MORE_PATIENT 101 -#define R_PF_ERROR_ADDING_TO_PROXY_QUEUE 102 -#define R_PF_ADDED_TO_PROXY_QUEUE 103 -#define R_PF_ALREADY_WAS_IN_QUEUE 104 -#define R_PF_DOWNLOADED 105 -#define R_PF_FAILED 106 - -// 0 for succesfull return of provide_segment() -#define R_R_DOWNLOAD_STARTED 0 -#define R_R_WAITING 107 -#define R_R_DOWNLOADING 108 - -#define R_LM_PF_R_NO_FREE_NETWORK_CONNECTION_FOUND 109 - enum Tdistfile_status{ DNEW, D_NOT_PROXY_REQUESTED, @@ -102,6 +87,8 @@ enum Tdistfile_status{ DFAILED }; +long is_symlink_restricted(string distfile_name); + class Tdistfile{ private: uint dld_segments_count; @@ -157,7 +144,7 @@ class Tdistfile{ void load_url_list(json_object* json_array_distfile_urllist); void split_into_segments(); uint provide_local_network(CURLM* cm, uint connection_num, uint seg_num, uint network_priority); - uint provide_proxy_fetcher_network(CURLM* cm, uint connection_num, uint seg_num, uint network_priority); + uint request_proxy_fetcher_network(uint network_priority); uint provide_remote_network(CURLM* cm, uint connection_num, uint seg_num, uint network_priority); int provide_segment(CURLM* cm, uint connection_num, uint seg_num); void inc_dld_segments_count(Tsegment * current_segment); diff --git a/segget/networkbroker.cpp b/segget/networkbroker.cpp index dfe1e01..8062ab6 100644 --- a/segget/networkbroker.cpp +++ b/segget/networkbroker.cpp @@ -39,16 +39,49 @@ void Tnetwork_distfile_broker::init(ulong network_number){ } } +void Tnetwork_distfile_broker::local_mirror_failed(uint mirror_num){ + if (phase==E_USE_AS_LOCAL_MIRRORS){ + if (! mirror_fails_vector[mirror_num]){ + mirror_fails_vector[mirror_num]=true; + failed_mirrors_num++; + } + if (failed_mirrors_num>=mirror_fails_vector.size()){ + phase=E_ALL_LOCAL_MIRRORS_FAILED; + failed_mirrors_num=0; + } + } +} + +void Tnetwork_distfile_broker::proxy_fetcher_mirror_failed(uint mirror_num){ + if (phase==E_PROXY_FETCHER_DOWNLOADED){ + if (! mirror_fails_vector[mirror_num]){ + mirror_fails_vector[mirror_num]=true; + failed_mirrors_num++; + } + if (failed_mirrors_num>=mirror_fails_vector.size()){ + phase=E_ALL_PROXY_FETCHER_MIRRORS_FAILED; + failed_mirrors_num=0; + } + } +} + +/* bool Tnetwork_distfile_broker::some_mirrors_have_NOT_failed_yet(){ try{ - for (ulong cur_mirror_num=0; cur_mirror_num<mirror_fails_vector.size();cur_mirror_num++){ - if (! mirror_fails_vector[cur_mirror_num]){ - return true; - } + if (failed_mirrors_num<mirror_fails_vector.size()){ + return false; + }else{ + return true; } - return false; +// for (ulong cur_mirror_num=0; cur_mirror_num<mirror_fails_vector.size();cur_mirror_num++){ +// if (! mirror_fails_vector[cur_mirror_num]){ +// return true; +// } +// } +// return false; }catch(...){ error_log("Error in networkbroker.cpp: init()"); return false; } -}
\ No newline at end of file +} +*/
\ No newline at end of file diff --git a/segget/networkbroker.h b/segget/networkbroker.h index 0f03fc8..bb6ba49 100644 --- a/segget/networkbroker.h +++ b/segget/networkbroker.h @@ -29,21 +29,38 @@ #include <vector> #include "shorttypes.h" #include "network.h" +#include "responses.h" using namespace std; +enum Tnetwork_distfile_broker_phases{ + E_USE_AS_LOCAL_MIRRORS, + E_ALL_LOCAL_MIRRORS_FAILED, + E_PROXY_FETCHER_DOWNLOADED, + E_ALL_PROXY_FETCHER_MIRRORS_FAILED +}; + class Tnetwork_distfile_broker{ public: // map<string,Tmirror *> benchmarked_mirror_list; vector<bool> mirror_fails_vector; timeval last_request_time; ulong network_num; + ulong failed_mirrors_num; + Tnetwork_distfile_broker_phases phase; + uint proxy_fetcher_response; Tnetwork_distfile_broker(): mirror_fails_vector(), last_request_time(), - network_num(0) + network_num(0), + failed_mirrors_num(0), + phase(E_USE_AS_LOCAL_MIRRORS), + proxy_fetcher_response(R_PF_NOT_REQUESTED_YET) {}; void init(ulong network_number); - bool some_mirrors_have_NOT_failed_yet(); +// void mirror_failed(uint mirror_num); + void local_mirror_failed(uint mirror_num); + void proxy_fetcher_mirror_failed(uint mirror_num); +// bool some_mirrors_have_NOT_failed_yet(); }; #endif diff --git a/segget/pkg.cpp b/segget/pkg.cpp index 83ec95b..72cf539 100644 --- a/segget/pkg.cpp +++ b/segget/pkg.cpp @@ -56,6 +56,9 @@ int Tpkg::try_adding_distfile_to_proxy_fetchers_queue(json_object* json_obj_dist string distfile_name; try{ distfile_name=json_object_get_string(json_object_object_get(json_obj_distfile,"name")); + if (is_symlink_restricted(distfile_name)){ + return R_PF_REJECTED; + } for (ulong distfile_num=0; distfile_num<distfile_count; distfile_num++){ if (Pdistfile_list[distfile_num]->name==distfile_name){ switch (Pdistfile_list[distfile_num]->status){ diff --git a/segget/responses.h b/segget/responses.h new file mode 100644 index 0000000..331b4ee --- /dev/null +++ b/segget/responses.h @@ -0,0 +1,57 @@ +/* +* Copyright (C) 2010 Robin H.Johnson, Ovechko Kostyantyn <fastinetserver@gmail.com>. +* +* Project: IDFetch. +* Developer: Ovechko Kostyantyn Olexandrovich (Kharkiv State Technical University of Construction and Architecture, Ukraine). +* Mentor: Robin H. Johnson (Gentoo Linux: Developer, Trustee & Infrastructure Lead). +* Mentoring organization: Gentoo Linux. +* Sponsored by GSOC 2010. +* +* This file is part of Segget. +* +* Segget is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version. +* +* Segget is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with Segget; if not, write to the Free Software +* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#ifndef __RESPONSES_H__ +#define __RESPONSES_H__ + +using namespace std; + +#define R_NOT_SET 300 +#define R_LM_WAIT_FOR_LOCAL_MIRRORS 50 + +#define R_PF_NOT_REQUESTED_YET 100 +#define R_PF_ADDED_TO_PROXY_QUEUE 101 +#define R_PF_ALREADY_WAS_IN_QUEUE 102 +#define R_PF_DOWNLOADED 103 +#define R_PF_BE_MORE_PATIENT 104 +#define R_PF_ERROR_ADDING_TO_PROXY_QUEUE 105 +#define R_PF_FAILED 106 +#define R_PF_REJECTED 107 + +// 0 for succesfull return of provide_segment() +#define R_R_DOWNLOAD_STARTED 0 +#define R_R_WAITING 108 +#define R_R_DOWNLOADING 109 + +#define R_LM_PF_R_NO_FREE_NETWORK_CONNECTION_FOUND 110 + +#define ALLOW_REQUESTS_TO_PROXY_FETCHERS 201 +#define DO_NOT_ALLOW_REQUESTS_TO_PROXY_FETCHERS 202 +#define ALLOW_REMOTE_NETWORKS 203 +#define DO_NOT_ALLOW_REMOTE_NETWORKS 204 +#define ALLOW_LOWER_PRIORITY_NETWORKS 205 + +#endif
\ No newline at end of file |