-
/*
- * DEBUG: section 39 Cache Array Routing Protocol
- * AUTHOR: Henrik Nordstrom
- * BASED ON: carp.c by Eric Stern and draft-vinod-carp-v1-03.txt
- *
- * SQUID Web Proxy Cache http://www.squid-cache.org/
- * ----------------------------------------------------------
- *
- * Squid is the result of efforts by numerous individuals from
- * the Internet community; see the CONTRIBUTORS file for full
- * details. Many organizations have provided support for Squid's
- * development; see the SPONSORS file for full details. Squid is
- * Copyrighted (C) 2001 by the Regents of the University of
- * California; see the COPYRIGHT file for full details. Squid
- * incorporates software developed and/or copyrighted by other
- * sources; see the CREDITS file for full details.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program 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 General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
+ * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
*
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
*/
+/* DEBUG: section 39 Cache Array Routing Protocol */
+
#include "squid.h"
+#include "CachePeer.h"
#include "HttpRequest.h"
#include "mgr/Registration.h"
#include "neighbors.h"
+#include "SquidConfig.h"
#include "Store.h"
#include "URL.h"
-#include "URLScheme.h"
-#if HAVE_MATH_H
-#include <math.h>
-#endif
+#include <cmath>
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
static int n_carp_peers = 0;
-static peer **carp_peers = NULL;
+static CachePeer **carp_peers = NULL;
static OBJH carpCachemgr;
static int
peerSortWeight(const void *a, const void *b)
{
- const peer *const *p1 = (const peer *const *)a;
- const peer *const *p2 = (const peer *const *)b;
+ const CachePeer *const *p1 = (const CachePeer *const *)a;
+ const CachePeer *const *p2 = (const CachePeer *const *)b;
return (*p1)->weight - (*p2)->weight;
}
int K;
int k;
double P_last, X_last, Xn;
- peer *p;
- peer **P;
+ CachePeer *p;
+ CachePeer **P;
char *t;
/* Clean up */
if (n_carp_peers == 0)
return;
- carp_peers = (peer **)xcalloc(n_carp_peers, sizeof(*carp_peers));
+ carp_peers = (CachePeer **)xcalloc(n_carp_peers, sizeof(*carp_peers));
/* Build a list of the found peers and calculate hashes and load factors */
for (P = carp_peers, p = Config.peers; p; p = p->next) {
*/
K = n_carp_peers;
- P_last = 0.0; /* Empty P_0 */
+ P_last = 0.0; /* Empty P_0 */
- Xn = 1.0; /* Empty starting point of X_1 * X_2 * ... * X_{x-1} */
+ Xn = 1.0; /* Empty starting point of X_1 * X_2 * ... * X_{x-1} */
- X_last = 0.0; /* Empty X_0, nullifies the first pow statement */
+ X_last = 0.0; /* Empty X_0, nullifies the first pow statement */
for (k = 1; k <= K; ++k) {
double Kk1 = (double) (K - k + 1);
}
}
-peer *
+CachePeer *
carpSelectParent(HttpRequest * request)
{
int k;
- peer *p = NULL;
- peer *tp;
+ CachePeer *p = NULL;
+ CachePeer *tp;
unsigned int user_hash = 0;
unsigned int combined_hash;
double score;
return NULL;
/* calculate hash key */
- debugs(39, 2, "carpSelectParent: Calculating hash for " << urlCanonical(request));
+ debugs(39, 2, "carpSelectParent: Calculating hash for " << request->effectiveRequestUri());
- /* select peer */
+ /* select CachePeer */
for (k = 0; k < n_carp_peers; ++k) {
- String key;
+ SBuf key;
tp = carp_peers[k];
if (tp->options.carp_key.set) {
- //this code follows urlCanonical's pattern.
- // corner cases should use the canonical URL
+ // this code follows URI syntax pattern.
+ // corner cases should use the full effective request URI
if (tp->options.carp_key.scheme) {
- // temporary, until bug 1961 URL handling is fixed.
- const URLScheme sch = request->protocol;
- key.append(sch.const_str());
- if (key.size()) //if the scheme is not empty
+ key.append(request->url.getScheme().image());
+ if (key.length()) //if the scheme is not empty
key.append("://");
}
if (tp->options.carp_key.host) {
- key.append(request->GetHost());
+ key.append(request->url.host());
}
if (tp->options.carp_key.port) {
- static char portbuf[7];
- snprintf(portbuf,7,":%d", request->port);
- key.append(portbuf);
+ key.appendf(":%u", request->url.port());
}
if (tp->options.carp_key.path) {
- String::size_type pos;
- if ((pos=request->urlpath.find('?'))!=String::npos)
- key.append(request->urlpath.substr(0,pos));
- else
- key.append(request->urlpath);
+ // XXX: fix when path and query are separate
+ key.append(request->url.path().substr(0,request->url.path().find('?'))); // 0..N
}
if (tp->options.carp_key.params) {
- String::size_type pos;
- if ((pos=request->urlpath.find('?'))!=String::npos)
- key.append(request->urlpath.substr(pos,request->urlpath.size()));
+ // XXX: fix when path and query are separate
+ SBuf::size_type pos;
+ if ((pos=request->url.path().find('?')) != SBuf::npos)
+ key.append(request->url.path().substr(pos)); // N..npos
}
}
// if the url-based key is empty, e.g. because the user is
// asking to balance on the path but the request doesn't supply any,
- // then fall back to canonical URL
+ // then fall back to the effective request URI
- if (key.size()==0)
- key=urlCanonical(request);
+ if (key.isEmpty())
+ key=request->effectiveRequestUri();
- for (const char *c = key.rawBuf(), *e=key.rawBuf()+key.size(); c < e; ++c)
+ for (const char *c = key.rawContent(), *e=key.rawContent()+key.length(); c < e; ++c)
user_hash += ROTATE_LEFT(user_hash, 19) + *c;
combined_hash = (user_hash ^ tp->carp.hash);
combined_hash += combined_hash * 0x62531965;
static void
carpCachemgr(StoreEntry * sentry)
{
- peer *p;
+ CachePeer *p;
int sumfetches = 0;
storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n",
"Hostname",
sumfetches ? (double) p->stats.fetches / sumfetches : -1.0);
}
}
+