Procházet zdrojové kódy

WIP start randomizing

Michael Vogt před 12 roky
rodič
revize
e5f34ad3b0
2 změnil soubory, kde provedl 34 přidání a 2 odebrání
  1. 29 2
      apt-pkg/contrib/srvrec.cc
  2. 5 0
      apt-pkg/contrib/srvrec.h

+ 29 - 2
apt-pkg/contrib/srvrec.cc

@@ -105,10 +105,37 @@ bool GetSrvRecords(std::string name, std::vector<SrvRec> &Result)
       Result.push_back(rec);
    }
 
-   // sort them
+   // implement load balancing as specified in RFC-2782
+
+   // sort them by priority
    std::stable_sort(Result.begin(), Result.end());
 
-   // FIXME: implement weight selection as specified in RFC-2782
+   // assign random number ranges
+   int prev_weight = 0;
+   int prev_priority = 0;
+   for(std::vector<SrvRec>::iterator I = Result.begin();
+      I != Result.end(); ++I)
+   {
+      if(prev_priority != I->priority)
+         prev_weight = 0;
+      I->random_number_range_start = prev_weight;
+      I->random_number_range_end = prev_weight + I->weight;
+      prev_weight = I->random_number_range_end;
+      prev_priority = I->priority;
+   }
+
+   // go over the code in reverse order and note the max random range
+   int max = 0;
+   prev_priority = 0;
+   for(std::vector<SrvRec>::iterator I = Result.end();
+      I != Result.begin(); --I)
+   {
+      if(prev_priority != I->priority)
+         max = I->random_number_range_end;
+      I->random_number_range_max = max;
+   }
+
+   // now shuffle 
 
    return true;
 }

+ 5 - 0
apt-pkg/contrib/srvrec.h

@@ -21,6 +21,11 @@ class SrvRec
    u_int16_t weight;
    u_int16_t port;
 
+   // each server is assigned a interval [start, end] in the space of [0, max]
+   int random_number_range_start;
+   int random_number_range_end;
+   int random_number_range_max;
+
    bool operator<(SrvRec const &other) const { 
       return this->priority < other.priority; 
    }