Re: delay_initial_bucket_level fails

From: Henrik Nordstrom <hno@dont-contact.us>
Date: Wed, 19 May 1999 23:02:54 +0200

Rainer Klier wrote:

> Max: 50000000
> Restore: 578
> Current: -17946782
> ----------------------------
>
> Even a restart of squid resulted in about -17 million
> buckets. Is this a bug ?

It is a misfeature. max * initial_level must be less than 2^31, or the
integer maths will overflow.

Please try the attached patch.

--
Henrik Nordstrom
Spare time Squid hacker

Index: squid/src/delay_pools.c
diff -u squid/src/delay_pools.c:1.1.1.8.4.2 squid/src/delay_pools.c:1.1.1.8.4.3
--- squid/src/delay_pools.c:1.1.1.8.4.2 Wed May 5 11:33:50 1999
+++ squid/src/delay_pools.c Wed May 19 23:01:48 1999
@@ -211,18 +211,18 @@
      */
     switch (class) {
     case 1:
- delay_data[pool].class1->aggregate = (rates->aggregate.max_bytes *
- Config.Delay.initial) / 100;
+ delay_data[pool].class1->aggregate = (int)(((double)rates->aggregate.max_bytes *
+ Config.Delay.initial) / 100);
         break;
     case 2:
- delay_data[pool].class2->aggregate = (rates->aggregate.max_bytes *
- Config.Delay.initial) / 100;
+ delay_data[pool].class2->aggregate = (int)(((double)rates->aggregate.max_bytes *
+ Config.Delay.initial) / 100);
         delay_data[pool].class2->individual_map[0] = 255;
         delay_data[pool].class2->individual_255_used = 0;
         break;
     case 3:
- delay_data[pool].class3->aggregate = (rates->aggregate.max_bytes *
- Config.Delay.initial) / 100;
+ delay_data[pool].class3->aggregate = (int)(((double)rates->aggregate.max_bytes *
+ Config.Delay.initial) / 100);
         delay_data[pool].class3->network_map[0] = 255;
         delay_data[pool].class3->network_255_used = 0;
         memset(&delay_data[pool].class3->individual_255_used, '\0',
@@ -296,8 +296,8 @@
             if (!delay_data[pool].class2->individual_255_used) {
                 delay_data[pool].class2->individual_255_used = 1;
                 delay_data[pool].class2->individual[255] =
- (Config.Delay.rates[pool]->individual.max_bytes *
- Config.Delay.initial) / 100;
+ (int)(((double)Config.Delay.rates[pool]->individual.max_bytes *
+ Config.Delay.initial) / 100);
             }
             return delayId(pool + 1, 255);
         }
@@ -308,8 +308,8 @@
                 delay_data[pool].class2->individual_map[i] = host;
                 delay_data[pool].class2->individual_map[i + 1] = 255;
                 delay_data[pool].class2->individual[i] =
- (Config.Delay.rates[pool]->individual.max_bytes *
- Config.Delay.initial) / 100;
+ (int)(((double)Config.Delay.rates[pool]->individual.max_bytes *
+ Config.Delay.initial) / 100);
                 break;
             }
         }
@@ -324,8 +324,8 @@
         if (!delay_data[pool].class3->network_255_used) {
             delay_data[pool].class3->network_255_used = 1;
             delay_data[pool].class3->network[255] =
- (Config.Delay.rates[pool]->network.max_bytes *
- Config.Delay.initial) / 100;
+ (int)(((double)Config.Delay.rates[pool]->network.max_bytes *
+ Config.Delay.initial) / 100);
         }
     } else {
         for (i = 0;; i++) {
@@ -336,8 +336,8 @@
                 delay_data[pool].class3->individual_map[i][0] = 255;
                 delay_data[pool].class3->network_map[i + 1] = 255;
                 delay_data[pool].class3->network[i] =
- (Config.Delay.rates[pool]->network.max_bytes *
- Config.Delay.initial) / 100;
+ (int)(((double)Config.Delay.rates[pool]->network.max_bytes *
+ Config.Delay.initial) / 100);
                 break;
             }
         }
@@ -348,8 +348,8 @@
         if (!(delay_data[pool].class3->individual_255_used[i / 8] & (1 << (i % 8)))) {
             delay_data[pool].class3->individual_255_used[i / 8] |= (1 << (i % 8));
             delay_data[pool].class3->individual[position] =
- (Config.Delay.rates[pool]->individual.max_bytes *
- Config.Delay.initial) / 100;
+ (int)(((double)Config.Delay.rates[pool]->individual.max_bytes *
+ Config.Delay.initial) / 100);
         }
         return delayId(pool + 1, position);
     }
@@ -362,8 +362,8 @@
             delay_data[pool].class3->individual_map[i][j] = host;
             delay_data[pool].class3->individual_map[i][j + 1] = 255;
             delay_data[pool].class3->individual[position |= j] =
- (Config.Delay.rates[pool]->individual.max_bytes *
- Config.Delay.initial) / 100;
+ (int)(((double)Config.Delay.rates[pool]->individual.max_bytes *
+ Config.Delay.initial) / 100);
             break;
         }
     }
Received on Wed May 19 1999 - 15:06:03 MDT

This archive was generated by hypermail pre-2.1.9 : Tue Dec 09 2003 - 16:46:20 MST