summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostyantyn Ovechko <fastinetserver@gmail.com>2010-07-18 22:23:26 +0300
committerKostyantyn Ovechko <fastinetserver@gmail.com>2010-07-18 22:23:26 +0300
commit16aeb45578965d635546507c139c59b2d8f32d23 (patch)
treef34166efa143de5c3afca228ee97aba626860fae
parentSplit provide_segment function into 3 parts (diff)
downloadidfetch-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.cpp37
-rw-r--r--segget/connection.h3
-rw-r--r--segget/distfile.cpp166
-rw-r--r--segget/distfile.h21
-rw-r--r--segget/networkbroker.cpp45
-rw-r--r--segget/networkbroker.h21
-rw-r--r--segget/pkg.cpp3
-rw-r--r--segget/responses.h57
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