/*
- * $Id: cache_cf.cc,v 1.359 2000/12/05 08:55:47 wessels Exp $
+ * $Id: cache_cf.cc,v 1.360 2000/12/05 10:10:57 wessels Exp $
*
* DEBUG: section 3 Configuration File Parsing
* AUTHOR: Harvest Derived
p->tcp_up = PEER_TCP_MAGIC_COUNT;
p->test_fd = -1;
#if USE_CARP
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> ((sizeof(u_long)*8)-(n))))
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
if (p->carp.load_factor) {
/* calculate this peers hash for use in CARP */
p->carp.hash = 0;
for (token = p->host; *token != 0; token++)
- p->carp.hash += ROTATE_LEFT(p->carp.hash, 19) + *token;
+ p->carp.hash += ROTATE_LEFT(p->carp.hash, 19) + (unsigned int) *token;
p->carp.hash += p->carp.hash * 0x62531965;
- p->carp.hash += ROTATE_LEFT(p->carp.hash, 21);
+ p->carp.hash = ROTATE_LEFT(p->carp.hash, 21);
}
#endif
/* This must preceed peerDigestCreate */
/*
- * $Id: carp.cc,v 1.13 2000/10/20 23:50:59 hno Exp $
+ * $Id: carp.cc,v 1.14 2000/12/05 10:10:57 wessels Exp $
*
* DEBUG: section 39 Cache Array Routing Protocol
* AUTHOR: Eric Stern
#if USE_CARP
+static OBJH carpCachemgr;
+
void
carpInit(void)
{
/* calculate load factors */
int K = 0;
- float a = 0.0;
- float Xn;
- float P_last;
- float X_last;
+ double a = 0.0;
+ double dJ;
+ double Xn;
+ double P_last;
+ double X_last;
int k;
peer *p;
for (p = Config.peers; p; p = p->next) {
}
if (a == 0.0) {
for (p = Config.peers; p; p = p->next)
- p->carp.load_multiplier = 1;
+ p->carp.load_multiplier = 1.0;
return;
}
/*
k = 1;
P_last = 0;
p = Config.peers;
- p->carp.load_multiplier = pow(K * p->carp.load_factor, 1 / K);
+ p->carp.load_multiplier = pow(p->carp.load_factor * K, 1.0 / K);
Xn = p->carp.load_multiplier;
P_last = p->carp.load_factor;
X_last = p->carp.load_multiplier;
if (!p->next)
return;
for (p = p->next; p; p = p->next) {
- p->carp.load_multiplier = ((K - k + 1) * (p->carp.load_factor - P_last)) / Xn;
- p->carp.load_multiplier += pow(X_last, K - k + 1);
- p->carp.load_multiplier = pow(p->carp.load_multiplier, 1 / (K - k + 1));
+ k++;
+ dJ = (double) (K - k + 1);
+ p->carp.load_multiplier = (dJ * (p->carp.load_factor - P_last)) / Xn;
+ p->carp.load_multiplier += pow(X_last, dJ);
+ p->carp.load_multiplier = pow(p->carp.load_multiplier, 1 / dJ);
Xn *= p->carp.load_multiplier;
X_last = p->carp.load_multiplier;
- k++;
P_last = p->carp.load_factor;
}
+ cachemgrRegister("carp", "CARP information", carpCachemgr, 0, 1);
}
peer *
debug(39, 3) ("carpSelectParent: selected CARP %s\n", p->host);
return p;
}
+
+static void
+carpCachemgr(StoreEntry * sentry)
+{
+ peer *p;
+ int sumfetches = 0;
+ storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n",
+ "Hostname",
+ "Hash",
+ "Multiplier",
+ "Factor",
+ "Actual");
+ for (p = Config.peers; p; p = p->next)
+ sumfetches += p->stats.fetches;
+ for (p = Config.peers; p; p = p->next) {
+ storeAppendPrintf(sentry, "%24s %10x %10f %10f %10f\n",
+ p->host, p->carp.hash,
+ p->carp.load_multiplier,
+ p->carp.load_factor,
+ sumfetches ? (double) p->stats.fetches / sumfetches : -1.0);
+ }
+
+}
+
#endif