You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by am...@apache.org on 2015/07/19 16:14:48 UTC
[8/8] trafficserver git commit: TS-974: Partial Object Caching.
TS-974: Partial Object Caching.
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/1c06db83
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/1c06db83
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/1c06db83
Branch: refs/heads/poc-6-0-x
Commit: 1c06db83123c336d462083002eda9ffcd4852730
Parents: a0b75bc
Author: Alan M. Carroll <so...@yahoo-inc.com>
Authored: Wed Mar 25 20:13:14 2015 -0500
Committer: Alan M. Carroll <so...@yahoo-inc.com>
Committed: Sun Jul 19 08:34:30 2015 -0500
----------------------------------------------------------------------
cmd/traffic_cop/traffic_cop.cc | 29 +-
cmd/traffic_crashlog/procinfo.cc | 12 +-
cmd/traffic_crashlog/traffic_crashlog.cc | 6 +-
cmd/traffic_crashlog/traffic_crashlog.h | 3 +-
cmd/traffic_ctl/alarm.cc | 3 +-
cmd/traffic_ctl/metric.cc | 6 +-
cmd/traffic_ctl/traffic_ctl.h | 3 +-
cmd/traffic_line/traffic_line.cc | 29 +-
cmd/traffic_manager/AddConfigFilesHere.cc | 1 -
cmd/traffic_manager/StatProcessor.cc | 11 -
cmd/traffic_manager/StatProcessor.h | 1 -
cmd/traffic_manager/StatType.cc | 36 -
cmd/traffic_manager/StatType.h | 2 -
cmd/traffic_manager/StatXML.cc | 1 -
cmd/traffic_manager/StatXML.h | 1 -
cmd/traffic_manager/WebOverview.cc | 13 +-
cmd/traffic_top/stats.h | 12 +-
cmd/traffic_top/traffic_top.cc | 26 +-
cmd/traffic_via/traffic_via.cc | 23 +-
doc/arch/cache/cache-data-structures.en.rst | 3 +-
iocore/cache/Cache.cc | 76 ++-
iocore/cache/CacheDir.cc | 132 ++--
iocore/cache/CacheHttp.cc | 325 ++++++++-
iocore/cache/CacheRead.cc | 713 +++++++++----------
iocore/cache/CacheTest.cc | 4 +-
iocore/cache/CacheVol.cc | 5 +-
iocore/cache/CacheWrite.cc | 417 +++++++++---
iocore/cache/I_Cache.h | 72 ++
iocore/cache/I_CacheDefs.h | 4 +-
iocore/cache/P_CacheBC.h | 30 +-
iocore/cache/P_CacheDir.h | 97 ++-
iocore/cache/P_CacheHttp.h | 287 +++++++-
iocore/cache/P_CacheInternal.h | 105 ++-
iocore/cache/P_CacheVol.h | 10 +-
iocore/cluster/ClusterCache.cc | 2 +-
iocore/cluster/ClusterVConnection.cc | 1 +
iocore/cluster/P_Cluster.h | 3 +-
iocore/cluster/P_ClusterCache.h | 22 +
lib/ts/CryptoHash.h | 47 +-
lib/ts/InkErrno.h | 2 +
lib/ts/ParseRules.cc | 18 +
lib/ts/ParseRules.h | 20 +
lib/ts/TsBuffer.h | 97 ++-
lib/ts/ink_code.cc | 29 +
mgmt/Alarms.cc | 13 +-
mgmt/Alarms.h | 1 -
mgmt/BaseManager.cc | 5 -
mgmt/BaseManager.h | 4 -
mgmt/FileManager.cc | 40 +-
mgmt/LocalManager.cc | 82 ++-
mgmt/MultiFile.cc | 1 -
mgmt/ProcessManager.cc | 22 +-
mgmt/ProxyConfig.h | 6 +-
mgmt/RecordsConfig.h | 4 +-
mgmt/RecordsConfigUtils.cc | 21 +-
mgmt/Rollback.cc | 45 +-
mgmt/Rollback.h | 3 +-
mgmt/WebMgmtUtils.cc | 10 +-
mgmt/api/APITestCliRemote.cc | 64 +-
mgmt/api/CfgContextImpl.cc | 19 +-
mgmt/api/CfgContextManager.cc | 5 -
mgmt/api/CfgContextManager.h | 2 -
mgmt/api/CfgContextUtils.cc | 19 +-
mgmt/api/CfgContextUtils.h | 2 -
mgmt/api/CoreAPI.cc | 7 +-
mgmt/api/CoreAPI.h | 4 +-
mgmt/api/CoreAPIRemote.cc | 3 +-
mgmt/api/CoreAPIShared.cc | 20 +-
mgmt/api/EventCallback.cc | 12 +-
mgmt/api/EventControlMain.cc | 27 +-
mgmt/api/GenericParser.cc | 25 +-
mgmt/api/GenericParser.h | 1 -
mgmt/api/INKMgmtAPI.cc | 9 +-
mgmt/api/NetworkMessage.cc | 9 +-
mgmt/api/NetworkMessage.h | 9 +-
mgmt/api/NetworkUtilsLocal.cc | 6 +-
mgmt/api/NetworkUtilsRemote.cc | 15 +-
mgmt/api/NetworkUtilsRemote.h | 3 +-
mgmt/api/TSControlMain.cc | 24 +-
mgmt/cluster/ClusterCom.cc | 166 ++---
mgmt/cluster/ClusterCom.h | 17 +-
mgmt/cluster/VMap.cc | 58 +-
mgmt/cluster/VMap.h | 6 +-
mgmt/utils/MgmtHashTable.h | 1 -
mgmt/utils/MgmtMarshall.h | 12 +-
mgmt/utils/MgmtUtils.cc | 3 +-
mgmt/utils/test_marshall.cc | 6 +-
proxy/ControlMatcher.cc | 9 +-
proxy/ControlMatcher.h | 6 +-
proxy/CoreUtils.cc | 13 +-
proxy/Crash.cc | 12 +-
proxy/DynamicStats.h | 13 +-
proxy/EventName.cc | 4 -
proxy/FetchSM.cc | 12 +-
proxy/ICP.cc | 2 -
proxy/ICPConfig.cc | 8 +-
proxy/ICPProcessor.cc | 1 -
proxy/ICPProcessor.h | 1 -
proxy/ICPlog.h | 1 -
proxy/IPAllow.cc | 7 +-
proxy/InkAPITest.cc | 307 ++++-----
proxy/InkAPITestTool.cc | 20 +-
proxy/InkIOCoreAPI.cc | 7 -
proxy/Main.h | 1 -
proxy/ParentSelection.cc | 49 +-
proxy/Plugin.cc | 7 +-
proxy/PluginVC.cc | 9 +-
proxy/Prefetch.cc | 61 +-
proxy/Prefetch.h | 1 -
proxy/ProtoSM.h | 1 -
proxy/ProtocolProbeSessionAccept.cc | 12 +-
proxy/ProtocolProbeSessionAccept.h | 3 +-
proxy/ProxyClientSession.h | 6 +-
proxy/ReverseProxy.h | 3 +-
proxy/Show.h | 1 -
proxy/StatSystem.cc | 7 +-
proxy/TestClusterHash.cc | 1 -
proxy/TestPreProc.cc | 2 -
proxy/TestProxy.cc | 1 -
proxy/TestSimpleProxy.cc | 1 -
proxy/TimeTrace.h | 1 -
proxy/Transform.h | 1 -
proxy/UDPAPIClientTest.cc | 2 -
proxy/api/ts/InkAPIPrivateIOCore.h | 1 -
proxy/api/ts/remap.h | 40 +-
proxy/api/ts/ts.h | 76 ++-
proxy/hdrs/HTTP.cc | 798 ++++++++++++++++++----
proxy/hdrs/HTTP.h | 826 ++++++++++++++++++++---
proxy/http/HttpCacheSM.cc | 31 +
proxy/http/HttpCacheSM.h | 9 +-
proxy/http/HttpDebugNames.cc | 2 +
proxy/http/HttpSM.cc | 280 +++++---
proxy/http/HttpSM.h | 4 +-
proxy/http/HttpTransact.cc | 209 ++++--
proxy/http/HttpTransact.h | 93 ++-
proxy/http/HttpTransactHeaders.cc | 13 +
proxy/http/HttpTransactHeaders.h | 1 +
proxy/http/HttpTunnel.cc | 14 +-
proxy/http2/HPACK.cc | 10 +-
proxy/http2/HPACK.h | 9 +-
proxy/http2/HTTP2.cc | 25 +-
proxy/http2/HTTP2.h | 35 +-
proxy/http2/Http2ClientSession.cc | 18 +-
proxy/http2/Http2ClientSession.h | 4 +-
proxy/http2/Http2ConnectionState.h | 13 +-
proxy/http2/Http2SessionAccept.cc | 11 +-
proxy/http2/Http2SessionAccept.h | 12 +-
proxy/logging/Log.cc | 29 +-
proxy/logging/Log.h | 4 +-
proxy/logging/LogAccess.cc | 11 +-
proxy/logging/LogAccessHttp.cc | 18 +-
proxy/logging/LogAccessHttp.h | 1 -
proxy/logging/LogAccessICP.h | 1 -
proxy/logging/LogAccessTest.h | 1 -
proxy/logging/LogBuffer.cc | 3 -
proxy/logging/LogBuffer.h | 10 +-
proxy/logging/LogCollationHostSM.cc | 3 +-
proxy/logging/LogConfig.h | 5 -
proxy/logging/LogField.cc | 5 -
proxy/logging/LogField.h | 3 -
proxy/logging/LogFieldAliasMap.h | 6 +-
proxy/logging/LogFile.cc | 4 +-
proxy/logging/LogFile.h | 1 -
proxy/logging/LogFilter.cc | 16 +-
proxy/logging/LogFilter.h | 3 -
proxy/logging/LogFormat.cc | 17 +-
proxy/logging/LogFormat.h | 3 +-
proxy/logging/LogObject.cc | 46 +-
proxy/logging/LogObject.h | 4 +-
proxy/logging/LogSock.h | 1 -
proxy/logging/LogStandalone.cc | 2 -
proxy/logging/LogUtils.cc | 6 +-
proxy/logstats.cc | 45 +-
173 files changed, 4738 insertions(+), 2187 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_cop/traffic_cop.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_cop/traffic_cop.cc b/cmd/traffic_cop/traffic_cop.cc
index e3476fe..55778ff 100644
--- a/cmd/traffic_cop/traffic_cop.cc
+++ b/cmd/traffic_cop/traffic_cop.cc
@@ -202,7 +202,6 @@ cop_log(int priority, const char *format, ...)
va_end(args);
}
-
void
chown_file_to_admin_user(const char *file)
{
@@ -412,7 +411,6 @@ safe_kill(const char *lockfile_name, const char *pname, bool group)
cop_log_trace("Leaving safe_kill(%s, %s, %d)\n", lockfile_name, pname, group);
}
-
// ink_hrtime milliseconds()
//
// Returns the result of gettimeofday converted to
@@ -817,7 +815,6 @@ spawn_manager()
cop_log_trace("Leaving spawn_manager()\n");
}
-
static int
poll_read_or_write(int fd, int timeout, int inorout)
{
@@ -917,7 +914,8 @@ open_socket(int port, const char *ip = NULL, char const *ip_to_bind = NULL)
((sockaddr_in6 *)result_to_bind->ai_addr)->sin6_port = htons(source_port);
}
- // also set REUSEADDR so that previous cop connections in the TIME_WAIT state
+ // also set REUSEADDR so that previous cop connections in the TIME_WAIT
+ // state
// do not interfere
if (safe_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, SOCKOPT_ON, sizeof(int)) < 0) {
cop_log(COP_WARNING, "(test) unable to set REUSEADDR socket option [%d '%s']\n", errno, strerror(errno));
@@ -1176,7 +1174,6 @@ read_mgmt_cli_int(const char *variable, int *value)
return 0;
}
-
static int
test_rs_port()
{
@@ -1196,7 +1193,6 @@ test_rs_port()
return 0;
}
-
static int
test_mgmt_cli_port()
{
@@ -1218,7 +1214,6 @@ test_mgmt_cli_port()
return ret;
}
-
static int
test_http_port(int port, char *request, int timeout, char const *ip = NULL, char const *ip_to_bind = NULL)
{
@@ -1301,7 +1296,8 @@ heartbeat_manager()
err = test_rs_port();
if (err < 0) {
- // See heartbeat_server()'s comments for how we determine a server/manager failure.
+ // See heartbeat_server()'s comments for how we determine a server/manager
+ // failure.
manager_failures += 1;
cop_log(COP_WARNING, "manager heartbeat [variable] failed [%d]\n", manager_failures);
@@ -1401,7 +1397,6 @@ server_up()
}
}
-
// | state | status | action
// --------|---------|----------|---------------
// manager | up | ok | nothing
@@ -1416,7 +1411,6 @@ server_up()
// manager | up | ok | kill server
// server | up | bad |
-
static void
check_programs()
{
@@ -1653,7 +1647,8 @@ check(void *arg)
// the SIGALRM signal which we use to heartbeat the cop.
millisleep(sleep_time * 1000);
- // We do this after the first round of checks, since the first "check" will spawn traffic_manager
+ // We do this after the first round of checks, since the first "check" will
+ // spawn traffic_manager
if (!mgmt_init) {
ats_scoped_str runtimedir(config_read_runtime_dir());
TSInit(runtimedir, static_cast<TSInitOptionT>(TS_MGMT_OPT_NO_EVENTS));
@@ -1673,7 +1668,6 @@ check(void *arg)
return arg;
}
-
static void
check_lockfile()
{
@@ -1795,8 +1789,9 @@ init_config_file()
if (stat(config_file, &info) < 0) {
Layout::relative_to(config_file, sizeof(config_file), config_dir, "records.config");
if (stat(config_file, &info) < 0) {
- cop_log(COP_FATAL, "unable to locate \"%s/records.config\" or \"%s/records.config.shadow\"\n", (const char *)config_dir,
- (const char *)config_dir);
+ cop_log(COP_FATAL, "unable to locate \"%s/records.config\" or "
+ "\"%s/records.config.shadow\"\n",
+ (const char *)config_dir, (const char *)config_dir);
exit(1);
}
}
@@ -1810,7 +1805,8 @@ init()
cop_log_trace("Entering init()\n");
- // Start up the records store and load the defaults so that we can locate our configuration.
+ // Start up the records store and load the defaults so that we can locate our
+ // configuration.
RecConfigFileInit();
RecordsConfigIterate(config_register_default, NULL);
@@ -1823,7 +1819,8 @@ init()
runtime_dir = config_read_runtime_dir();
if (stat(runtime_dir, &info) < 0) {
cop_log(COP_FATAL, "unable to locate local state directory '%s'\n", runtime_dir);
- cop_log(COP_FATAL, " please try setting correct root path in either env variable TS_ROOT \n");
+ cop_log(COP_FATAL, " please try setting correct root path in either env "
+ "variable TS_ROOT \n");
exit(1);
}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_crashlog/procinfo.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_crashlog/procinfo.cc b/cmd/traffic_crashlog/procinfo.cc
index cb15b87..b8a9414 100644
--- a/cmd/traffic_crashlog/procinfo.cc
+++ b/cmd/traffic_crashlog/procinfo.cc
@@ -146,9 +146,12 @@ crashlog_write_backtrace(FILE *fp, const crashlog_target &)
TSString trace = NULL;
TSMgmtError mgmterr;
- // NOTE: sometimes we can't get a backtrace because the ptrace attach will fail with
- // EPERM. I've seen this happen when a debugger is attached, which makes sense, but it
- // can also happen without a debugger. Possibly in that case, there is a race with the
+ // NOTE: sometimes we can't get a backtrace because the ptrace attach will
+ // fail with
+ // EPERM. I've seen this happen when a debugger is attached, which makes
+ // sense, but it
+ // can also happen without a debugger. Possibly in that case, there is a race
+ // with the
// kernel locking the process information?
if ((mgmterr = TSProxyBacktraceGet(0, &trace)) != TS_ERR_OKAY) {
@@ -177,7 +180,8 @@ crashlog_write_records(FILE *fp, const crashlog_target &)
goto done;
}
- // If the RPC call failed, the list will be empty, so we won't print anything. Otherwise,
+ // If the RPC call failed, the list will be empty, so we won't print anything.
+ // Otherwise,
// print all the results, freeing them as we go.
for (TSRecordEle *rec_ele = (TSRecordEle *)TSListDequeue(list); rec_ele; rec_ele = (TSRecordEle *)TSListDequeue(list)) {
if (!success) {
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_crashlog/traffic_crashlog.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_crashlog/traffic_crashlog.cc b/cmd/traffic_crashlog/traffic_crashlog.cc
index 7c5599f..1460488 100644
--- a/cmd/traffic_crashlog/traffic_crashlog.cc
+++ b/cmd/traffic_crashlog/traffic_crashlog.cc
@@ -101,8 +101,10 @@ main(int /* argc ATS_UNUSED */, const char **argv)
kill(getpid(), SIGSTOP);
}
- // XXX This is a hack. traffic_manager starts traffic_server with the euid of the admin user. We are still
- // privileged, but won't be able to open files in /proc or ptrace the target. This really should be fixed
+ // XXX This is a hack. traffic_manager starts traffic_server with the euid of
+ // the admin user. We are still
+ // privileged, but won't be able to open files in /proc or ptrace the target.
+ // This really should be fixed
// in traffic_manager.
if (getuid() == 0) {
ATS_UNUSED_RETURN(seteuid(0));
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_crashlog/traffic_crashlog.h
----------------------------------------------------------------------
diff --git a/cmd/traffic_crashlog/traffic_crashlog.h b/cmd/traffic_crashlog/traffic_crashlog.h
index 0b066d1..6da4128 100644
--- a/cmd/traffic_crashlog/traffic_crashlog.h
+++ b/cmd/traffic_crashlog/traffic_crashlog.h
@@ -27,7 +27,8 @@
#include "libts.h"
#include "mgmtapi.h"
-// ucontext.h is deprecated on Darwin, and we really only need it on Linux, so only
+// ucontext.h is deprecated on Darwin, and we really only need it on Linux, so
+// only
// include it if we are planning to use it.
#if defined(__linux__)
#include <ucontext.h>
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_ctl/alarm.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_ctl/alarm.cc b/cmd/traffic_ctl/alarm.cc
index c341ffa..88754e9 100644
--- a/cmd/traffic_ctl/alarm.cc
+++ b/cmd/traffic_ctl/alarm.cc
@@ -128,7 +128,8 @@ subcommand_alarm(unsigned argc, const char **argv)
{alarm_clear, "clear", "Clear all current alarms"},
{alarm_list, "list", "List all current alarms"},
- // Note that we separate resolve one from resolve all for the same reasons that
+ // Note that we separate resolve one from resolve all for the same reasons
+ // that
// we have "metric zero" and "metric clear".
{alarm_resolve, "resolve", "Resolve the listed alarms"},
/* XXX describe a specific alarm? */
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_ctl/metric.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_ctl/metric.cc b/cmd/traffic_ctl/metric.cc
index 36a8b6e..9c8d124 100644
--- a/cmd/traffic_ctl/metric.cc
+++ b/cmd/traffic_ctl/metric.cc
@@ -132,8 +132,10 @@ subcommand_metric(unsigned argc, const char **argv)
{metric_match, "match", "Get metrics matching a regular expression"},
{CtrlUnimplementedCommand, "monitor", "Display the value of a metric over time"},
- // We could allow clearing all the metrics in the "clear" subcommand, but that seems error-prone. It
- // would be too easy to just expect a help message and accidentally nuke all the metrics.
+ // We could allow clearing all the metrics in the "clear" subcommand, but
+ // that seems error-prone. It
+ // would be too easy to just expect a help message and accidentally nuke all
+ // the metrics.
{metric_zero, "zero", "Clear one or more metric values"},
};
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_ctl/traffic_ctl.h
----------------------------------------------------------------------
diff --git a/cmd/traffic_ctl/traffic_ctl.h b/cmd/traffic_ctl/traffic_ctl.h
index b77ee40..b83c60e 100644
--- a/cmd/traffic_ctl/traffic_ctl.h
+++ b/cmd/traffic_ctl/traffic_ctl.h
@@ -193,7 +193,8 @@ struct CtrlCommandLine {
this->args.push_back(argv[i]);
}
- // Always NULL-terminate to keep ink_args happy. Note that we adjust arg() accordingly.
+ // Always NULL-terminate to keep ink_args happy. Note that we adjust arg()
+ // accordingly.
this->args.push_back(NULL);
}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_line/traffic_line.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_line/traffic_line.cc b/cmd/traffic_line/traffic_line.cc
index 0c10839..743e69d 100644
--- a/cmd/traffic_line/traffic_line.cc
+++ b/cmd/traffic_line/traffic_line.cc
@@ -90,13 +90,16 @@ handleArgInvocation()
TSRecordEleDestroy(rec_ele);
return TSStatsReset(*ZeroCluster ? true : false, name);
} else if (QueryDeadhosts == 1) {
- fprintf(stderr, "Query Deadhosts is not implemented, it requires support for congestion control.\n");
- fprintf(stderr, "For more details, examine the old code in cli/CLI.cc: QueryDeadhosts()\n");
+ fprintf(stderr, "Query Deadhosts is not implemented, it requires support "
+ "for congestion control.\n");
+ fprintf(stderr, "For more details, examine the old code in cli/CLI.cc: "
+ "QueryDeadhosts()\n");
return TS_ERR_FAIL;
} else if (*StorageCmdOffline) {
return TSStorageDeviceCmdOffline(StorageCmdOffline);
} else if (ShowAlarms == 1) {
- // Show all active alarms, this was moved from the old traffic_shell implementation (show:alarms).
+ // Show all active alarms, this was moved from the old traffic_shell
+ // implementation (show:alarms).
TSList events = TSListCreate();
if (TS_ERR_OKAY != TSActiveEventGetMlt(events)) {
@@ -119,7 +122,8 @@ handleArgInvocation()
TSListDestroy(events);
return TS_ERR_OKAY;
} else if (*ClearAlarms != '\0') {
- // Clear (some) active alarms, this was moved from the old traffic_shell implementation (config:alarm)
+ // Clear (some) active alarms, this was moved from the old traffic_shell
+ // implementation (config:alarm)
TSList events = TSListCreate();
size_t len = strlen(ClearAlarms);
@@ -189,7 +193,9 @@ handleArgInvocation()
return err;
} else if (*ReadVar != '\0') { // Handle a value read
if (*SetVar != '\0' || *VarValue != '\0') {
- fprintf(stderr, "%s: Invalid Argument Combination: Can not read and set values at the same time\n", program_name);
+ fprintf(stderr, "%s: Invalid Argument Combination: Can not read and set "
+ "values at the same time\n",
+ program_name);
return TS_ERR_FAIL;
} else {
TSMgmtError err;
@@ -222,7 +228,9 @@ handleArgInvocation()
}
} else if (*MatchVar != '\0') { // Handle a value read
if (*SetVar != '\0' || *VarValue != '\0') {
- fprintf(stderr, "%s: Invalid Argument Combination: Can not read and set values at the same time\n", program_name);
+ fprintf(stderr, "%s: Invalid Argument Combination: Can not read and set "
+ "values at the same time\n",
+ program_name);
return TS_ERR_FAIL;
} else {
TSMgmtError err;
@@ -234,7 +242,8 @@ handleArgInvocation()
ats_free(msg);
}
- // If the RPC call failed, the list will be empty, so we won't print anything. Otherwise,
+ // If the RPC call failed, the list will be empty, so we won't print
+ // anything. Otherwise,
// print all the results, freeing them as we go.
for (TSRecordEle *rec_ele = (TSRecordEle *)TSListDequeue(list); rec_ele; rec_ele = (TSRecordEle *)TSListDequeue(list)) {
switch (rec_ele->rec_type) {
@@ -334,7 +343,8 @@ main(int /* argc ATS_UNUSED */, const char **argv)
ShowStatus = 0;
ClearAlarms[0] = '\0';
- /* Argument description table used to describe how to parse command line args, */
+ /* Argument description table used to describe how to parse command line args,
+ */
/* see 'ink_args.h' for meanings of the various fields */
ArgumentDescription argument_descriptions[] = {
{"query_deadhosts", 'q', "Query congested sites", "F", &QueryDeadhosts, NULL, NULL},
@@ -367,7 +377,8 @@ main(int /* argc ATS_UNUSED */, const char **argv)
// Connect to Local Manager and do it.
if (TS_ERR_OKAY != TSInit(NULL, static_cast<TSInitOptionT>(TS_MGMT_OPT_NO_EVENTS | TS_MGMT_OPT_NO_SOCK_TESTS))) {
- fprintf(stderr, "error: could not connect to management port, make sure traffic_manager is running\n");
+ fprintf(stderr, "error: could not connect to management port, make sure "
+ "traffic_manager is running\n");
exit(1);
}
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/AddConfigFilesHere.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/AddConfigFilesHere.cc b/cmd/traffic_manager/AddConfigFilesHere.cc
index ea9066b..76c223b 100644
--- a/cmd/traffic_manager/AddConfigFilesHere.cc
+++ b/cmd/traffic_manager/AddConfigFilesHere.cc
@@ -42,7 +42,6 @@ testcall(char *foo, bool /* incVersion */)
Debug("lm", "Received Callback that %s has changed\n", foo);
}
-
//
// initializeRegistry()
//
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/StatProcessor.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/StatProcessor.cc b/cmd/traffic_manager/StatProcessor.cc
index 9202aca..0261689 100644
--- a/cmd/traffic_manager/StatProcessor.cc
+++ b/cmd/traffic_manager/StatProcessor.cc
@@ -64,7 +64,6 @@ xml_strcmp(const xmlchar *s1, const char *s2)
return strcmp((const char *)s1, s2);
}
-
static void
elementStart(void * /* userData ATS_UNUSED */, const xmlchar *name, const xmlchar **atts)
{
@@ -138,7 +137,6 @@ elementStart(void * /* userData ATS_UNUSED */, const xmlchar *name, const xmlcha
}
}
-
static void
elementEnd(void * /* userData ATS_UNUSED */, const xmlchar * /* name ATS_UNUSED */)
{
@@ -158,7 +156,6 @@ elementEnd(void * /* userData ATS_UNUSED */, const xmlchar * /* name ATS_UNUSED
}
}
-
static void
charDataHandler(void * /* userData ATS_UNUSED */, const xmlchar *name, int /* len ATS_UNUSED */)
{
@@ -179,13 +176,11 @@ charDataHandler(void * /* userData ATS_UNUSED */, const xmlchar *name, int /* le
}
}
-
StatProcessor::StatProcessor(FileManager *configFiles) : m_lmgmt(NULL), m_overviewGenerator(NULL)
{
rereadConfig(configFiles);
}
-
void
StatProcessor::rereadConfig(FileManager *configFiles)
{
@@ -256,19 +251,16 @@ StatProcessor::rereadConfig(FileManager *configFiles)
xmlFreeParserCtxt(parser);
#endif
-
delete fileContent;
Debug(MODULE_INIT, "\n\n---------- END OF PARSING & INITIALIZING ---------\n\n");
}
-
StatProcessor::~StatProcessor()
{
Debug(MODULE_INIT, "[StatProcessor] Destructing Statistics Processor\n");
}
-
void
setTest()
{
@@ -287,7 +279,6 @@ setTest()
}
}
-
void
verifyTest()
{
@@ -319,7 +310,6 @@ verifyTest()
}
}
-
/**
* Updating the statistics NOW.
**/
@@ -337,7 +327,6 @@ StatProcessor::processStat()
return (result);
}
-
/**
* ExpressionEval
* --------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/StatProcessor.h
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/StatProcessor.h b/cmd/traffic_manager/StatProcessor.h
index c6b3dd8..caa2eab 100644
--- a/cmd/traffic_manager/StatProcessor.h
+++ b/cmd/traffic_manager/StatProcessor.h
@@ -75,7 +75,6 @@ public:
overviewPage *m_overviewGenerator;
};
-
/**
* External expression evaluation API.
*
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/StatType.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/StatType.cc b/cmd/traffic_manager/StatType.cc
index 11b1484..d500a62 100644
--- a/cmd/traffic_manager/StatType.cc
+++ b/cmd/traffic_manager/StatType.cc
@@ -53,7 +53,6 @@ StatExprToken::StatExprToken()
memset(&m_token_value_delta, 0, sizeof(m_token_value_delta));
}
-
/**
* StatExprToken::copy()
* ---------------------
@@ -84,7 +83,6 @@ StatExprToken::copy(const StatExprToken &source)
m_sum_var = source.m_sum_var;
}
-
/**
* StatExprToken::assignTokenName()
* --------------------------------
@@ -135,7 +133,6 @@ StatExprToken::assignTokenName(const char *name)
}
}
-
/**
* assignTokenType()
* -----------------
@@ -164,7 +161,6 @@ StatExprToken::assignTokenType()
return (m_token_type != RECD_NULL);
}
-
void
StatExprToken::clean()
{
@@ -172,7 +168,6 @@ StatExprToken::clean()
delete m_token_value_delta;
}
-
/**
* FOR DEBUGGING ONLY
* Print the token according to its type in a human-readable format. :)
@@ -187,7 +182,6 @@ StatExprToken::print(const char *prefix)
}
}
-
/**
* StatExprToken::precedence()
* ---------------------------
@@ -214,7 +208,6 @@ StatExprToken::precedence()
}
}
-
/**
* StatExprToken::statVarSet()
* ---------------------------
@@ -280,7 +273,6 @@ StatExprToken::statVarSet(RecDataT type, RecData value)
return varSetData(m_token_type, m_token_name, converted_value);
}
-
/***********************************************************************
StatExprList
**********************************************************************/
@@ -293,7 +285,6 @@ StatExprList::StatExprList() : m_size(0)
{
}
-
/**
* StatExprList::clean()
* ---------------------
@@ -310,7 +301,6 @@ StatExprList::clean()
ink_assert(m_size == 0);
}
-
void
StatExprList::enqueue(StatExprToken *entry)
{
@@ -319,7 +309,6 @@ StatExprList::enqueue(StatExprToken *entry)
m_size += 1;
}
-
void
StatExprList::push(StatExprToken *entry)
{
@@ -328,7 +317,6 @@ StatExprList::push(StatExprToken *entry)
m_size += 1;
}
-
StatExprToken *
StatExprList::dequeue()
{
@@ -339,7 +327,6 @@ StatExprList::dequeue()
return (StatExprToken *)m_tokenList.dequeue();
}
-
StatExprToken *
StatExprList::pop()
{
@@ -350,7 +337,6 @@ StatExprList::pop()
return m_tokenList.pop();
}
-
StatExprToken *
StatExprList::top()
{
@@ -360,7 +346,6 @@ StatExprList::top()
return m_tokenList.head;
}
-
StatExprToken *
StatExprList::first()
{
@@ -370,7 +355,6 @@ StatExprList::first()
return m_tokenList.head;
}
-
StatExprToken *
StatExprList::next(StatExprToken *current)
{
@@ -380,7 +364,6 @@ StatExprList::next(StatExprToken *current)
return (current->link).next;
}
-
/**
* StatExprList::print()
* ---------------------
@@ -394,7 +377,6 @@ StatExprList::print(const char *prefix)
}
}
-
/**
* StatExprToken::count()
* ----------------------
@@ -406,12 +388,10 @@ StatExprList::count()
return m_size;
}
-
/***********************************************************************
StatObject
**********************************************************************/
-
/**
* StatObject::StatObject()
* ------------------------
@@ -424,7 +404,6 @@ StatObject::StatObject()
{
}
-
StatObject::StatObject(unsigned identifier)
: m_id(identifier), m_debug(false), m_expr_string(NULL), m_node_dest(NULL), m_cluster_dest(NULL), m_expression(NULL),
m_postfix(NULL), m_last_update(-1), m_current_time(-1), m_update_interval(-1), m_stats_max(FLT_MAX), m_stats_min(FLT_MIN),
@@ -432,7 +411,6 @@ StatObject::StatObject(unsigned identifier)
{
}
-
/**
* StatObject::clean()
* -------------------
@@ -446,7 +424,6 @@ StatObject::clean()
delete m_postfix;
}
-
/**
* StatObject::assignDst()
* -----------------------
@@ -489,7 +466,6 @@ StatObject::assignDst(const char *str, bool m_node_var, bool m_sum_var)
}
}
-
/**
* StatObject::assignExpr()
* ------------------------
@@ -553,7 +529,6 @@ StatObject::assignExpr(char *str)
infix2postfix();
}
-
/**
* StatObject::infix2postfix()
* ---------------------------
@@ -628,7 +603,6 @@ StatObject::infix2postfix()
m_expression = NULL;
}
-
/**
* StatObject::NodeStatEval()
* --------------------------
@@ -715,7 +689,6 @@ StatObject::NodeStatEval(RecDataT *result_type, bool cluster)
return tempValue;
}
-
/**
* StatObject::ClusterStatEval()
* -----------------------------
@@ -743,7 +716,6 @@ StatObject::ClusterStatEval(RecDataT *result_type)
}
}
-
/**
* StatObject::setTokenValue()
* ---------------------------
@@ -804,7 +776,6 @@ StatObject::setTokenValue(StatExprToken *token, bool cluster)
} // m_token_name?
}
-
/**
* StatObject::StatBinaryEval()
* ------------------------
@@ -934,7 +905,6 @@ StatObject::StatBinaryEval(StatExprToken *left, char op, StatExprToken *right, b
return (result);
}
-
/***********************************************************************
StatObjectList
**********************************************************************/
@@ -943,7 +913,6 @@ StatObjectList::StatObjectList() : m_size(0)
{
}
-
void
StatObjectList::clean()
{
@@ -957,7 +926,6 @@ StatObjectList::clean()
ink_assert(m_size == 0);
}
-
void
StatObjectList::enqueue(StatObject *object)
{
@@ -972,21 +940,18 @@ StatObjectList::enqueue(StatObject *object)
m_size += 1;
}
-
StatObject *
StatObjectList::first()
{
return m_statList.head;
}
-
StatObject *
StatObjectList::next(StatObject *current)
{
return (current->link).next;
}
-
/**
* StatObjectList::Eval()
* ----------------------
@@ -1128,7 +1093,6 @@ StatObjectList::Eval()
return count;
} /* Eval() */
-
/**
* StatObjectList::print()
* --------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/StatType.h
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/StatType.h b/cmd/traffic_manager/StatType.h
index 3ab0367..5f87134 100644
--- a/cmd/traffic_manager/StatType.h
+++ b/cmd/traffic_manager/StatType.h
@@ -112,7 +112,6 @@ public:
bool statVarSet(RecDataT, RecData);
};
-
/**
* StatExprList
* simply a list of StatExprToken.
@@ -181,7 +180,6 @@ private:
void infix2postfix();
};
-
/**
* StatObjectList
* simply a list of StatObject.
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/StatXML.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/StatXML.cc b/cmd/traffic_manager/StatXML.cc
index 1d6a7ba..57474e2 100644
--- a/cmd/traffic_manager/StatXML.cc
+++ b/cmd/traffic_manager/StatXML.cc
@@ -56,7 +56,6 @@ XML_extractContent(const char *name, char *content, size_t result_len)
return (strlen(content));
}
-
//
// Returns true if 'c'is an operator (in our definition),
// false otherwise
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/StatXML.h
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/StatXML.h b/cmd/traffic_manager/StatXML.h
index 249be2f..f7428ca 100644
--- a/cmd/traffic_manager/StatXML.h
+++ b/cmd/traffic_manager/StatXML.h
@@ -21,7 +21,6 @@
limitations under the License.
*/
-
#ifndef _STATXML_H_
#define _STATXML_H_
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_manager/WebOverview.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_manager/WebOverview.cc b/cmd/traffic_manager/WebOverview.cc
index 252820d..6ce5a24 100644
--- a/cmd/traffic_manager/WebOverview.cc
+++ b/cmd/traffic_manager/WebOverview.cc
@@ -76,7 +76,6 @@ overviewRecord::overviewRecord(unsigned long inet_addr, bool local, ClusterPeerI
RecGetRecordOrderAndId(node_rec_data.recs[0].name, &node_rec_first_ix, NULL);
}
-
// Query for the name of the node. If it is not there, some
// their cluster ip address
name_l = this->readString("proxy.node.hostname_FQ", &name_found);
@@ -278,7 +277,7 @@ overviewPage::overviewPage() : sortRecords(10, false)
nodeRecords = ink_hash_table_create(InkHashTableKeyType_Word);
numHosts = 0;
ourAddr = 0; // We will update this when we add the record for
- // this machine
+ // this machine
}
overviewPage::~overviewPage()
@@ -331,7 +330,6 @@ overviewPage::checkForUpdates()
ink_mutex_release(&accessLock);
}
-
// overrviewPage::sortHosts()
//
// resorts sortRecords, but always leaves the local node
@@ -428,7 +426,8 @@ overviewPage::findNodeByName(const char *nodeName)
}
}
-// MgmtString overviewPage::readString(const char* nodeName, char* *name, bool *found = NULL)
+// MgmtString overviewPage::readString(const char* nodeName, char* *name, bool
+// *found = NULL)
//
// Looks up a node record for a specific by nodeName
// CALLEE deallocates the string with free()
@@ -457,7 +456,8 @@ overviewPage::readString(const char *nodeName, const char *name, bool *found)
return r;
}
-// MgmtInt overviewPage::readInteger(const char* nodeName, char* *name, bool *found = NULL)
+// MgmtInt overviewPage::readInteger(const char* nodeName, char* *name, bool
+// *found = NULL)
//
// Looks up a node record for a specific by nodeName
//
@@ -485,7 +485,8 @@ overviewPage::readInteger(const char *nodeName, const char *name, bool *found)
return r;
}
-// MgmtFloat overviewPage::readFloat(const char* nodeName, char* *name, bool *found = NULL)
+// MgmtFloat overviewPage::readFloat(const char* nodeName, char* *name, bool
+// *found = NULL)
//
// Looks up a node record for a specific by nodeName
//
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_top/stats.h
----------------------------------------------------------------------
diff --git a/cmd/traffic_top/stats.h b/cmd/traffic_top/stats.h
index 78d7f89..2b5c312 100644
--- a/cmd/traffic_top/stats.h
+++ b/cmd/traffic_top/stats.h
@@ -55,7 +55,6 @@ const char seperator[] = "\": \"";
const char end[] = "\",\n";
};
-
//----------------------------------------------------------------------------
class Stats
{
@@ -116,7 +115,6 @@ public:
lookup_table.insert(make_pair("server_req_conn", LookupItem("Req/Conn", "server_req", "server_conn", 3)));
lookup_table.insert(make_pair("server_curr_conn", LookupItem("Curr Conn", "proxy.process.http.current_server_connections", 1)));
-
lookup_table.insert(
make_pair("client_head", LookupItem("Head Bytes", "proxy.process.http.user_agent_response_header_total_size", 2)));
lookup_table.insert(
@@ -132,7 +130,6 @@ public:
lookup_table.insert(make_pair("ka_total", LookupItem("KA Total", "proxy.process.net.dynamic_keep_alive_timeout_in_total", 2)));
lookup_table.insert(make_pair("ka_count", LookupItem("KA Count", "proxy.process.net.dynamic_keep_alive_timeout_in_count", 2)));
-
lookup_table.insert(make_pair("client_abort", LookupItem("Clnt Abort", "proxy.process.http.err_client_abort_count_stat", 2)));
lookup_table.insert(make_pair("conn_fail", LookupItem("Conn Fail", "proxy.process.http.err_connect_fail_count_stat", 2)));
lookup_table.insert(make_pair("abort", LookupItem("Abort", "proxy.process.http.transaction_counts.errors.aborts", 2)));
@@ -222,7 +219,6 @@ public:
lookup_table.insert(make_pair("s_1m", LookupItem("1 MB", "proxy.process.http.response_document_size_1M", 5)));
lookup_table.insert(make_pair("s_>1m", LookupItem("> 1 MB", "proxy.process.http.response_document_size_inf", 5)));
-
// sum together
lookup_table.insert(make_pair("ram_hit_miss", LookupItem("Ram Hit+Miss", "ram_hit", "ram_miss", 6)));
lookup_table.insert(make_pair("client_net", LookupItem("Net (bits)", "client_head", "client_body", 7)));
@@ -233,7 +229,6 @@ public:
lookup_table.insert(make_pair("server_size", LookupItem("Total Size", "server_head", "server_body", 6)));
lookup_table.insert(make_pair("server_avg_size", LookupItem("Avg Size", "server_size", "server_req", 3)));
-
lookup_table.insert(make_pair("total_time", LookupItem("Total Time", "proxy.process.http.total_transactions_time", 2)));
// ratio
@@ -268,8 +263,10 @@ public:
(*_stats)[key] = strValue;
} else {
if (TSRecordGetInt(item.name, &value) != TS_ERR_OKAY) {
- fprintf(stderr, "Error getting stat: %s when calling TSRecordGetInt() failed: file \"%s\", line %d\n\n", item.name,
- __FILE__, __LINE__);
+ fprintf(stderr, "Error getting stat: %s when calling "
+ "TSRecordGetInt() failed: file \"%s\", line "
+ "%d\n\n",
+ item.name, __FILE__, __LINE__);
abort();
}
string key = item.name;
@@ -344,7 +341,6 @@ public:
getStat(key, value, strtmp, typetmp, overrideType);
}
-
void
getStat(const string &key, string &value)
{
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_top/traffic_top.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_top/traffic_top.cc b/cmd/traffic_top/traffic_top.cc
index df447c2..85bbd3b 100644
--- a/cmd/traffic_top/traffic_top.cc
+++ b/cmd/traffic_top/traffic_top.cc
@@ -154,7 +154,8 @@ response_code_page(Stats &stats)
{
attron(COLOR_PAIR(colorPair::border));
attron(A_BOLD);
- mvprintw(0, 0, " RESPONSE CODES ");
+ mvprintw(0, 0, " RESPONSE CODES "
+ " ");
attroff(COLOR_PAIR(colorPair::border));
attroff(A_BOLD);
@@ -229,22 +230,24 @@ help(const string &host, const string &version)
attron(A_BOLD);
mvprintw(0, 0, "Overview:");
attroff(A_BOLD);
- mvprintw(
- 1, 0,
- "traffic_top is a top like program for Apache Traffic Server (ATS). "
- "There is a lot of statistical information gathered by ATS. "
- "This program tries to show some of the more important stats and gives a good overview of what the proxy server is doing. "
- "Hopefully this can be used as a tool for diagnosing the proxy server if there are problems.");
+ mvprintw(1, 0, "traffic_top is a top like program for Apache Traffic Server (ATS). "
+ "There is a lot of statistical information gathered by ATS. "
+ "This program tries to show some of the more important stats and gives "
+ "a good overview of what the proxy server is doing. "
+ "Hopefully this can be used as a tool for diagnosing the proxy server "
+ "if there are problems.");
attron(A_BOLD);
mvprintw(7, 0, "Definitions:");
attroff(A_BOLD);
mvprintw(8, 0, "Fresh => Requests that were servered by fresh entries in cache");
- mvprintw(9, 0, "Revalidate => Requests that contacted the origin to verify if still valid");
+ mvprintw(9, 0, "Revalidate => Requests that contacted the origin to verify "
+ "if still valid");
mvprintw(10, 0, "Cold => Requests that were not in cache at all");
mvprintw(11, 0, "Changed => Requests that required entries in cache to be updated");
mvprintw(12, 0, "Changed => Requests that can't be cached for some reason");
- mvprintw(12, 0, "No Cache => Requests that the client sent Cache-Control: no-cache header");
+ mvprintw(12, 0, "No Cache => Requests that the client sent "
+ "Cache-Control: no-cache header");
attron(COLOR_PAIR(colorPair::border));
attron(A_BOLD);
@@ -400,7 +403,8 @@ main(int argc, char **argv)
string url = "";
if (optind >= argc) {
if (TS_ERR_OKAY != TSInit(NULL, static_cast<TSInitOptionT>(TS_MGMT_OPT_NO_EVENTS | TS_MGMT_OPT_NO_SOCK_TESTS))) {
- fprintf(stderr, "Error: missing URL on command line or error connecting to the local manager\n");
+ fprintf(stderr, "Error: missing URL on command line or error connecting "
+ "to the local manager\n");
usage();
}
} else {
@@ -424,7 +428,6 @@ main(int argc, char **argv)
init_pair(colorPair::border, COLOR_WHITE, COLOR_BLUE);
// mvchgat(0, 0, -1, A_BLINK, 1, NULL);
-
enum Page {
MAIN_PAGE,
RESPONSE_PAGE,
@@ -447,7 +450,6 @@ main(int argc, char **argv)
attroff(COLOR_PAIR(colorPair::border));
attroff(A_BOLD);
-
if (page == MAIN_PAGE) {
main_stats_page(stats);
} else if (page == RESPONSE_PAGE) {
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/cmd/traffic_via/traffic_via.cc
----------------------------------------------------------------------
diff --git a/cmd/traffic_via/traffic_via.cc b/cmd/traffic_via/traffic_via.cc
index 7426d1b..b377d5c 100644
--- a/cmd/traffic_via/traffic_via.cc
+++ b/cmd/traffic_via/traffic_via.cc
@@ -84,12 +84,16 @@ detailViaLookup(char flag)
// Cache Lookup Result
viaTable->next = new VIA("Cache Lookup Result");
viaTable->next->viaData[(unsigned char)'C'] = "cache hit but config forces revalidate";
- viaTable->next->viaData[(unsigned char)'I'] = "conditional miss (client sent conditional, fresh in cache, returned 412)";
+ viaTable->next->viaData[(unsigned char)'I'] = "conditional miss (client "
+ "sent conditional, fresh in "
+ "cache, returned 412)";
viaTable->next->viaData[(unsigned char)' '] = "cache miss or no cache lookup";
viaTable->next->viaData[(unsigned char)'U'] = "cache hit, but client forces revalidate (e.g. Pragma: no-cache)";
viaTable->next->viaData[(unsigned char)'D'] = "cache hit, but method forces revalidated (e.g. ftp, not anonymous)";
viaTable->next->viaData[(unsigned char)'M'] = "cache miss (url not in cache)";
- viaTable->next->viaData[(unsigned char)'N'] = "conditional hit (client sent conditional, doc fresh in cache, returned 304)";
+ viaTable->next->viaData[(unsigned char)'N'] = "conditional hit (client "
+ "sent conditional, doc fresh "
+ "in cache, returned 304)";
viaTable->next->viaData[(unsigned char)'H'] = "cache hit";
viaTable->next->viaData[(unsigned char)'S'] = "cache hit, but expired";
viaTable->next->viaData[(unsigned char)'K'] = "cookie miss";
@@ -254,8 +258,11 @@ decodeViaHeader(const char *str)
// Invalid header size, come out.
printf("\nInvalid VIA header. VIA header length should be 6 or 24 characters\n");
printf("Valid via header format is "
- "[u<client-stuff>c<cache-lookup-stuff>s<server-stuff>f<cache-fill-stuff>p<proxy-stuff>]e<error-codes>:t<tunneling-info>c<"
- "cache type><cache-lookup-result>i<icp-conn-info>p<parent-proxy-conn-info>s<server-conn-info>]");
+ "[u<client-stuff>c<cache-lookup-stuff>s<server-stuff>f<cache-fill-"
+ "stuff>p<proxy-stuff>]e<error-codes>:t<tunneling-info>c<"
+ "cache "
+ "type><cache-lookup-result>i<icp-conn-info>p<parent-proxy-conn-info>s<"
+ "server-conn-info>]");
return TS_ERR_FAIL;
}
@@ -270,8 +277,8 @@ filterViaHeader()
int errOffset;
int pcreExecCode;
int i;
- const char *viaPattern =
- "\\[([ucsfpe]+[^\\]]+)\\]"; // Regex to match via header with in [] which can start with character class ucsfpe
+ const char *viaPattern = "\\[([ucsfpe]+[^\\]]+)\\]"; // Regex to match via header with in [] which
+ // can start with character class ucsfpe
char *viaHeaderString;
char viaHeader[1024];
@@ -301,7 +308,9 @@ filterViaHeader()
// Match successful, but too many substrings
if (pcreExecCode == 0) {
pcreExecCode = SUBSTRING_VECTOR_COUNT / 3;
- printf("Too many substrings were found. %d substrings couldn't fit into subStringVector\n", pcreExecCode - 1);
+ printf("Too many substrings were found. %d substrings couldn't fit into "
+ "subStringVector\n",
+ pcreExecCode - 1);
}
// Loop based on number of matches found
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/doc/arch/cache/cache-data-structures.en.rst
----------------------------------------------------------------------
diff --git a/doc/arch/cache/cache-data-structures.en.rst b/doc/arch/cache/cache-data-structures.en.rst
index 1158051..b172999 100644
--- a/doc/arch/cache/cache-data-structures.en.rst
+++ b/doc/arch/cache/cache-data-structures.en.rst
@@ -24,7 +24,8 @@ Cache Data Structures
.. cpp:class:: OpenDir
- An open directory entry. It contains all the information of a
+ This represents an open directory entry. An entry is open when there is an active write on the object. Read operations do not of themselves require an `OpenDir` but if there is already one for the object it will be used by the read operation to coordinate with the write operations.
+
:cpp:class:`Dir` plus additional information from the first :cpp:class:`Doc`.
.. cpp:class:: CacheVC
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/iocore/cache/Cache.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc
index 330aedd..cb7468d 100644
--- a/iocore/cache/Cache.cc
+++ b/iocore/cache/Cache.cc
@@ -312,7 +312,7 @@ CacheVC::CacheVC() : alternate_index(CACHE_ALT_INDEX_DEFAULT)
}
#ifdef HTTP_CACHE
-HTTPInfo::FragOffset *
+HTTPInfo::FragmentDescriptorTable *
CacheVC::get_frag_table()
{
ink_assert(alternate.valid());
@@ -482,10 +482,29 @@ CacheVC::set_http_info(CacheHTTPInfo *ainfo)
} else
f.allow_empty_doc = 0;
alternate.copy_shallow(ainfo);
+ // This is not a good place to do this but I can't figure out a better one. We must do it
+ // no earlier than this, because there's no actual alternate to store the value in before this
+ // and I don't know of any later point that's guaranteed to be called before this is needed.
+ alternate.m_alt->m_fixed_fragment_size = cache_config_target_fragment_size - sizeofDoc;
ainfo->clear();
}
#endif
+int64_t
+CacheVC::set_inbound_range(int64_t min, int64_t max)
+{
+ resp_range.clear();
+ resp_range.getRangeSpec().add(min, max);
+ return 1 + (max - min);
+}
+
+void
+CacheVC::set_full_content_length(int64_t cl)
+{
+ alternate.object_size_set(cl);
+ resp_range.apply(cl);
+}
+
bool
CacheVC::set_pin_in_cache(time_t time_pin)
{
@@ -501,6 +520,25 @@ CacheVC::set_pin_in_cache(time_t time_pin)
return true;
}
+void
+CacheVC::set_content_range(HTTPRangeSpec const &r)
+{
+ resp_range.getRangeSpec() = r;
+ resp_range.start();
+}
+
+bool
+CacheVC::get_uncached(HTTPRangeSpec const &req, HTTPRangeSpec &result, int64_t initial)
+{
+ HTTPRangeSpec::Range r =
+ od ? write_vector->get_uncached_hull(earliest_key, req, initial) : alternate.get_uncached_hull(req, initial);
+ if (r.isValid()) {
+ result.add(r);
+ return true;
+ }
+ return false;
+}
+
bool
CacheVC::set_disk_io_priority(int priority)
{
@@ -559,6 +597,7 @@ Vol::close_read(CacheVC *cont)
EThread *t = cont->mutex->thread_holding;
ink_assert(t == this_ethread());
ink_assert(t == mutex->thread_holding);
+ open_dir.close_entry(cont);
if (dir_is_empty(&cont->earliest_dir))
return 1;
int i = dir_evac_bucket(&cont->earliest_dir);
@@ -1112,6 +1151,12 @@ CacheProcessor::open_read(Continuation *cont, const CacheKey *key, bool cluster_
}
inkcoreapi Action *
+CacheProcessor::open_read(Continuation *cont, CacheVConnection* writer, HTTPHdr* client_request_hdr)
+{
+ return caches[CACHE_FRAG_TYPE_HTTP]->open_read(cont, writer, client_request_hdr);
+}
+
+inkcoreapi Action *
CacheProcessor::open_write(Continuation *cont, CacheKey *key, bool cluster_cache_local ATS_UNUSED, CacheFragType frag_type,
int expected_size ATS_UNUSED, int options, time_t pin_in_cache, char *hostname, int host_len)
{
@@ -2164,6 +2209,19 @@ CacheVC::is_pread_capable()
return !f.read_from_writer_called;
}
+#if 0
+void
+CacheVC::get_missing_ranges(HTTPRangeSpec& missing)
+{
+ missing.reset();
+ if (0 == alternate.);
+ // For now we'll just compute the convex hull of the missing data.
+ for ( RangeBox::const_iterator spot = req.begin(), limit = req.end() ; spot != limit ; ++spot ) {
+
+ }
+}
+#endif
+
#define STORE_COLLISION 1
#ifdef HTTP_CACHE
@@ -2189,7 +2247,7 @@ unmarshal_helper(Doc *doc, Ptr<IOBufferData> &buf, int &okay)
@internal I looked at doing this in place (rather than a copy & modify) but
- The in place logic would be even worse than this mess
- It wouldn't save you that much, since you end up doing inserts early in the buffer.
- Without extreme care in the logic it could end up doing more copying thatn
+ Without extreme care in the logic it could end up doing more copying than
the simpler copy & modify.
@internal This logic presumes the existence of some slack at the end of the buffer, which
@@ -2208,6 +2266,7 @@ upgrade_doc_version(Ptr<IOBufferData> &buf)
if (0 == doc->hlen) {
Debug("cache_bc", "Doc %p without header, no upgrade needed.", doc);
} else if (CACHE_FRAG_TYPE_HTTP_V23 == doc->doc_type) {
+ typedef cache_bc::HTTPCacheFragmentTable::FragOffset FragOffset;
cache_bc::HTTPCacheAlt_v21 *alt = reinterpret_cast<cache_bc::HTTPCacheAlt_v21 *>(doc->hdr());
if (alt && alt->is_unmarshalled_format()) {
Ptr<IOBufferData> d_buf(ioDataAllocator.alloc());
@@ -2215,9 +2274,8 @@ upgrade_doc_version(Ptr<IOBufferData> &buf)
char *src;
char *dst;
char *hdr_limit = doc->data();
- HTTPInfo::FragOffset *frags =
- reinterpret_cast<HTTPInfo::FragOffset *>(static_cast<char *>(buf->data()) + cache_bc::sizeofDoc_v23);
- int frag_count = doc->_flen / sizeof(HTTPInfo::FragOffset);
+ FragOffset *frags = reinterpret_cast<FragOffset *>(static_cast<char *>(buf->data()) + cache_bc::sizeofDoc_v23);
+ int frag_count = doc->_flen / sizeof(FragOffset);
size_t n = 0;
size_t content_size = doc->data_len();
@@ -2450,6 +2508,11 @@ CacheVC::handleRead(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
io.action = this;
io.thread = mutex->thread_holding->tt == DEDICATED ? AIO_CALLBACK_THREAD_ANY : mutex->thread_holding;
SET_HANDLER(&CacheVC::handleReadDone);
+ {
+ char xt[33];
+ Debug("amc", "cache read : key = %s %" PRId64 " bytes at stripe offset =% " PRId64, key.toHexStr(xt), io.aiocb.aio_nbytes,
+ io.aiocb.aio_offset);
+ }
ink_assert(ink_aio_read(&io) >= 0);
CACHE_DEBUG_INCREMENT_DYN_STAT(cache_pread_count_stat);
return EVENT_CONT;
@@ -2514,7 +2577,7 @@ CacheVC::removeEvent(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
goto Lfree;
}
if (!f.remove_aborted_writers) {
- if (vol->open_write(this, true, 1)) {
+ if (vol->open_write(this)) {
// writer exists
ink_release_assert(od = vol->open_read(&key));
od->dont_update_directory = 1;
@@ -3256,7 +3319,6 @@ CacheProcessor::open_read(Continuation *cont, const HttpCacheKey *key, bool clus
return caches[type]->open_read(cont, &key->hash, request, params, type, key->hostname, key->hostlen);
}
-
//----------------------------------------------------------------------------
Action *
CacheProcessor::open_write(Continuation *cont, int expected_size, const HttpCacheKey *key, bool cluster_cache_local,
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/iocore/cache/CacheDir.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheDir.cc b/iocore/cache/CacheDir.cc
index 000bc46..6fe0ddb 100644
--- a/iocore/cache/CacheDir.cc
+++ b/iocore/cache/CacheDir.cc
@@ -63,52 +63,44 @@ OpenDir::OpenDir()
SET_HANDLER(&OpenDir::signal_readers);
}
-/*
- If allow_if_writers is false, open_write fails if there are other writers.
- max_writers sets the maximum number of concurrent writers that are
- allowed. Only The first writer can set the max_writers. It is ignored
- for later writers.
- Returns 1 on success and 0 on failure.
- */
-int
-OpenDir::open_write(CacheVC *cont, int allow_if_writers, int max_writers)
+OpenDirEntry *
+OpenDir::open_entry(Vol *vol, CryptoHash const &key, bool force_p)
{
- ink_assert(cont->vol->mutex->thread_holding == this_ethread());
- unsigned int h = cont->first_key.slice32(0);
+ ink_assert(vol->mutex->thread_holding == this_ethread());
+ unsigned int h = key.slice32(0);
int b = h % OPEN_DIR_BUCKETS;
for (OpenDirEntry *d = bucket[b].head; d; d = d->link.next) {
- if (!(d->writers.head->first_key == cont->first_key))
+ if (!(d->first_key == key))
continue;
- if (allow_if_writers && d->num_writers < d->max_writers) {
- d->writers.push(cont);
- d->num_writers++;
- cont->od = d;
- cont->write_vector = &d->vector;
- return 1;
- }
- return 0;
+ ++(d->num_active);
+ // cont->od = d;
+ // cont->write_vector = &d->vector;
+ return d;
}
- OpenDirEntry *od = THREAD_ALLOC(openDirEntryAllocator, cont->mutex->thread_holding);
- od->readers.head = NULL;
- od->writers.push(cont);
- od->num_writers = 1;
- od->max_writers = max_writers;
+
+ if (!force_p)
+ return NULL;
+
+ OpenDirEntry *od = THREAD_ALLOC(openDirEntryAllocator, vol->mutex->thread_holding);
+ od->mutex = new_ProxyMutex();
+ od->first_key = key;
+ od->num_active = 1;
od->vector.data.data = &od->vector.data.fast_data[0];
od->dont_update_directory = 0;
od->move_resident_alt = 0;
od->reading_vec = 0;
od->writing_vec = 0;
dir_clear(&od->first_dir);
- cont->od = od;
- cont->write_vector = &od->vector;
+ // cont->od = od;
+ // cont->write_vector = &od->vector;
bucket[b].push(od);
- return 1;
+ return od;
}
int
OpenDir::signal_readers(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
{
- Queue<CacheVC, Link_CacheVC_opendir_link> newly_delayed_readers;
+ CacheVCQ newly_delayed_readers;
EThread *t = mutex->thread_holding;
CacheVC *c = NULL;
while ((c = delayed_readers.dequeue())) {
@@ -130,32 +122,29 @@ OpenDir::signal_readers(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
return 0;
}
-int
-OpenDir::close_write(CacheVC *cont)
+void
+OpenDir::close_entry(CacheVC *vc)
{
- ink_assert(cont->vol->mutex->thread_holding == this_ethread());
- cont->od->writers.remove(cont);
- cont->od->num_writers--;
- if (!cont->od->writers.head) {
- unsigned int h = cont->first_key.slice32(0);
+ ink_assert(vc->vol->mutex->thread_holding == this_ethread());
+ if (vc->od && --(vc->od->num_active) < 1) {
+ unsigned int h = vc->od->first_key.slice32(0);
int b = h % OPEN_DIR_BUCKETS;
- bucket[b].remove(cont->od);
- delayed_readers.append(cont->od->readers);
- signal_readers(0, 0);
- cont->od->vector.clear();
- THREAD_FREE(cont->od, openDirEntryAllocator, cont->mutex->thread_holding);
+ bucket[b].remove(vc->od);
+ vc->od->vector.clear();
+ vc->od->mutex = 0;
+ THREAD_FREE(vc->od, openDirEntryAllocator, vc->vol->mutex->thread_holding);
}
- cont->od = NULL;
- return 0;
+ vc->od = NULL;
}
+#if 0
OpenDirEntry *
OpenDir::open_read(const CryptoHash *key)
{
unsigned int h = key->slice32(0);
int b = h % OPEN_DIR_BUCKETS;
for (OpenDirEntry *d = bucket[b].head; d; d = d->link.next)
- if (d->writers.head->first_key == *key)
+ if (d->first_key == *key)
return d;
return NULL;
}
@@ -170,6 +159,61 @@ OpenDirEntry::wait(CacheVC *cont, int msec)
readers.push(cont);
return EVENT_CONT;
}
+#endif
+
+int
+OpenDirEntry::index_of(CacheKey const &alt_key)
+{
+ return vector.index_of(alt_key);
+}
+
+bool
+OpenDirEntry::has_writer(CacheKey const &alt_key)
+{
+ return vector.has_writer(alt_key);
+}
+
+OpenDirEntry &
+OpenDirEntry::write_active(CacheKey const &alt_key, CacheVC *vc, int64_t offset)
+{
+ Debug("amc", "VC %p write active @ %" PRId64, vc, offset);
+ vector.write_active(alt_key, vc, offset);
+ return *this;
+}
+
+OpenDirEntry &
+OpenDirEntry::write_complete(CacheKey const &alt_key, CacheVC *vc, bool success)
+{
+ Debug("amc", "[OpenDir::write_complete] VC %p write %s", vc, (success ? "succeeded" : "failed"));
+ vector.write_complete(alt_key, vc, success);
+ return *this;
+}
+
+bool
+OpenDirEntry::is_write_active(CacheKey const &alt_key, int64_t offset)
+{
+ return vector.is_write_active(alt_key, offset);
+}
+
+CacheKey const &
+OpenDirEntry::key_for(CacheKey const &alt_key, int64_t offset)
+{
+ return vector.key_for(alt_key, offset);
+}
+
+bool
+OpenDirEntry::wait_for(CacheKey const &alt_key, CacheVC *vc, int64_t offset)
+{
+ Debug("amc", "vc %p waiting for %" PRId64, vc, offset);
+ return vector.wait_for(alt_key, vc, offset);
+}
+
+OpenDirEntry &
+OpenDirEntry::close_writer(CacheKey const &alt_key, CacheVC *vc)
+{
+ vector.close_writer(alt_key, vc);
+ return *this;
+}
//
// Cache Directory
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1c06db83/iocore/cache/CacheHttp.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheHttp.cc b/iocore/cache/CacheHttp.cc
index 3d7dfba..0ba989d 100644
--- a/iocore/cache/CacheHttp.cc
+++ b/iocore/cache/CacheHttp.cc
@@ -29,10 +29,10 @@
/*-------------------------------------------------------------------------
-------------------------------------------------------------------------*/
-static vec_info default_vec_info;
+// Guaranteed to be all zero?
+static CacheHTTPInfoVector::Item default_vec_info;
#ifdef HTTP_CACHE
-static CacheHTTPInfo default_http_info;
CacheHTTPInfoVector::CacheHTTPInfoVector() : magic(NULL), data(&default_vec_info, 4), xcount(0)
{
@@ -46,7 +46,7 @@ CacheHTTPInfoVector::~CacheHTTPInfoVector()
int i;
for (i = 0; i < xcount; i++) {
- data[i].alternate.destroy();
+ data[i]._alternate.destroy();
}
vector_buf.clear();
magic = NULL;
@@ -61,7 +61,7 @@ CacheHTTPInfoVector::insert(CacheHTTPInfo *info, int index)
if (index == CACHE_ALT_INDEX_DEFAULT)
index = xcount++;
- data(index).alternate.copy_shallow(info);
+ data(index)._alternate.copy_shallow(info);
return index;
}
@@ -77,8 +77,8 @@ CacheHTTPInfoVector::detach(int idx, CacheHTTPInfo *r)
ink_assert(idx >= 0);
ink_assert(idx < xcount);
- r->copy_shallow(&data[idx].alternate);
- data[idx].alternate.destroy();
+ r->copy_shallow(&data[idx]._alternate);
+ data[idx]._alternate.destroy();
for (i = idx; i < (xcount - 1); i++) {
data[i] = data[i + i];
@@ -94,7 +94,7 @@ void
CacheHTTPInfoVector::remove(int idx, bool destroy)
{
if (destroy)
- data[idx].alternate.destroy();
+ data[idx]._alternate.destroy();
for (; idx < (xcount - 1); idx++)
data[idx] = data[idx + 1];
@@ -112,7 +112,7 @@ CacheHTTPInfoVector::clear(bool destroy)
if (destroy) {
for (i = 0; i < xcount; i++) {
- data[i].alternate.destroy();
+ data[i]._alternate.destroy();
}
}
xcount = 0;
@@ -134,14 +134,14 @@ CacheHTTPInfoVector::print(char *buffer, size_t buf_size, bool temps)
purl = 1;
for (i = 0; i < xcount; i++) {
- if (data[i].alternate.valid()) {
+ if (data[i]._alternate.valid()) {
if (purl) {
Arena arena;
char *url;
purl = 0;
URL u;
- data[i].alternate.request_url_get(&u);
+ data[i]._alternate.request_url_get(&u);
url = u.string_get(&arena);
if (url) {
snprintf(p, buf_size, "[%s] ", url);
@@ -151,8 +151,8 @@ CacheHTTPInfoVector::print(char *buffer, size_t buf_size, bool temps)
}
}
- if (temps || !(data[i].alternate.object_key_get() == zero_key)) {
- snprintf(p, buf_size, "[%d %s]", data[i].alternate.id_get(), CacheKey(data[i].alternate.object_key_get()).toHexStr(buf));
+ if (temps || !(data[i]._alternate.object_key_get() == zero_key)) {
+ snprintf(p, buf_size, "[%d %s]", data[i]._alternate.id_get(), CacheKey(data[i]._alternate.object_key_get()).toHexStr(buf));
tmp = strlen(p);
p += tmp;
buf_size -= tmp;
@@ -170,7 +170,7 @@ CacheHTTPInfoVector::marshal_length()
int length = 0;
for (int i = 0; i < xcount; i++) {
- length += data[i].alternate.marshal_length();
+ length += data[i]._alternate.marshal_length();
}
return length;
@@ -187,7 +187,7 @@ CacheHTTPInfoVector::marshal(char *buf, int length)
ink_assert(!(((intptr_t)buf) & 3)); // buf must be aligned
for (int i = 0; i < xcount; i++) {
- int tmp = data[i].alternate.marshal(buf, length);
+ int tmp = data[i]._alternate.marshal(buf, length);
length -= tmp;
buf += tmp;
count++;
@@ -199,8 +199,10 @@ CacheHTTPInfoVector::marshal(char *buf, int length)
return buf - start;
}
-int
-CacheHTTPInfoVector::unmarshal(const char *buf, int length, RefCountObj *block_ptr)
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+uint32_t
+CacheHTTPInfoVector::get_handles(const char *buf, int length, RefCountObj *block_ptr)
{
ink_assert(!(((intptr_t)buf) & 3)); // buf must be aligned
@@ -208,50 +210,299 @@ CacheHTTPInfoVector::unmarshal(const char *buf, int length, RefCountObj *block_p
CacheHTTPInfo info;
xcount = 0;
+ vector_buf = block_ptr;
+
while (length - (buf - start) > (int)sizeof(HTTPCacheAlt)) {
- int tmp = HTTPInfo::unmarshal((char *)buf, length - (buf - start), block_ptr);
+ int tmp = info.get_handle((char *)buf, length - (buf - start));
if (tmp < 0) {
- return -1;
+ ink_assert(!"CacheHTTPInfoVector::unmarshal get_handle() failed");
+ return (uint32_t)-1;
}
- info.m_alt = (HTTPCacheAlt *)buf;
buf += tmp;
- data(xcount).alternate = info;
+ data(xcount)._alternate = info;
xcount++;
}
return ((caddr_t)buf - (caddr_t)start);
}
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
+int
+CacheHTTPInfoVector::index_of(CacheKey const &alt_key)
+{
+ int zret;
+ for (zret = 0; zret < xcount && alt_key != data[zret]._alternate.object_key_get(); ++zret)
+ ;
+ return zret < xcount ? zret : -1;
+}
/*-------------------------------------------------------------------------
-------------------------------------------------------------------------*/
-uint32_t
-CacheHTTPInfoVector::get_handles(const char *buf, int length, RefCountObj *block_ptr)
+
+CacheKey const &
+CacheHTTPInfoVector::key_for(CacheKey const &alt_key, int64_t offset)
{
- ink_assert(!(((intptr_t)buf) & 3)); // buf must be aligned
+ int idx = this->index_of(alt_key);
+ Item &item = data[idx];
+ return item._alternate.get_frag_key_of(offset);
+}
- const char *start = buf;
- CacheHTTPInfo info;
- xcount = 0;
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
- vector_buf = block_ptr;
+CacheHTTPInfoVector &
+CacheHTTPInfoVector::write_active(CacheKey const &alt_key, CacheVC *vc, int64_t offset)
+{
+ int idx = this->index_of(alt_key);
+ Item &item = data[idx];
- while (length - (buf - start) > (int)sizeof(HTTPCacheAlt)) {
- int tmp = info.get_handle((char *)buf, length - (buf - start));
- if (tmp < 0) {
- ink_assert(!"CacheHTTPInfoVector::unmarshal get_handle() failed");
- return (uint32_t)-1;
+ Debug("amc", "[CacheHTTPInfoVector::write_active] VC %p write %" PRId64, vc, offset);
+
+ vc->fragment = item._alternate.get_frag_index_of(offset);
+ item._active.push(vc);
+ return *this;
+}
+
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
+CacheHTTPInfoVector &
+CacheHTTPInfoVector::write_complete(CacheKey const &alt_key, CacheVC *vc, bool success)
+{
+ int idx = this->index_of(alt_key);
+ Item &item = data[idx];
+ CacheVC *reader;
+
+ Debug("amc", "[CacheHTTPInfoVector::write_complete] VC %p write %s", vc, (success ? "succeeded" : "failed"));
+
+ item._active.remove(vc);
+ if (success)
+ item._alternate.mark_frag_write(vc->fragment);
+
+ // Kick all the waiters, success or fail.
+ while (NULL != (reader = item._waiting.pop())) {
+ Debug("amc", "[write_complete] wake up %p", reader);
+ reader->wake_up_thread->schedule_imm(reader)->cookie = reinterpret_cast<void *>(0x56);
+ }
+
+ return *this;
+}
+
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
+bool
+CacheHTTPInfoVector::has_writer(CacheKey const &alt_key)
+{
+ int alt_idx = this->index_of(alt_key);
+ return alt_idx >= 0 && data[alt_idx]._writers.head != NULL;
+}
+
+bool
+CacheHTTPInfoVector::is_write_active(CacheKey const &alt_key, int64_t offset)
+{
+ int alt_idx = this->index_of(alt_key);
+ Item &item = data[alt_idx];
+ int frag_idx = item._alternate.get_frag_index_of(offset);
+ for (CacheVC *vc = item._active.head; vc; vc = item._active.next(vc)) {
+ if (vc->fragment == frag_idx)
+ return true;
+ }
+ return false;
+}
+
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
+bool
+CacheHTTPInfoVector::wait_for(CacheKey const &alt_key, CacheVC *vc, int64_t offset)
+{
+ bool zret = true;
+ int alt_idx = this->index_of(alt_key);
+ Item &item = data[alt_idx];
+ int frag_idx = item._alternate.get_frag_index_of(offset);
+ vc->fragment = frag_idx; // really? Shouldn't this already be set?
+ if (item.has_writers()) {
+ if (!item._waiting.in(vc))
+ item._waiting.push(vc);
+ } else {
+ zret = false;
+ }
+ return zret;
+}
+
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
+CacheHTTPInfoVector &
+CacheHTTPInfoVector::close_writer(CacheKey const &alt_key, CacheVC *vc)
+{
+ CacheVC *reader;
+ int alt_idx = this->index_of(alt_key);
+ Item &item = data[alt_idx];
+ item._writers.remove(vc);
+ while (NULL != (reader = item._waiting.pop())) {
+ Debug("amc", "[close_writer] wake up %p", reader);
+ reader->wake_up_thread->schedule_imm(reader)->cookie = reinterpret_cast<void *>(0x56);
+ }
+ return *this;
+}
+
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
+HTTPRangeSpec::Range
+CacheHTTPInfoVector::get_uncached_hull(CacheKey const &alt_key, HTTPRangeSpec const &req, int64_t initial)
+{
+ int alt_idx = this->index_of(alt_key);
+ Item &item = data[alt_idx];
+ Queue<CacheVC, Link_CacheVC_OpenDir_Link> writers;
+ CacheVC *vc;
+ CacheVC *cycle_vc = NULL;
+ // Yeah, this need to be tunable.
+ uint64_t DELTA = item._alternate.get_frag_fixed_size() * 16;
+ HTTPRangeSpec::Range r(item._alternate.get_uncached_hull(req, initial));
+
+ if (r.isValid()) {
+ /* Now clip against the writers.
+ We move all the writers to a local list and move them back as we are done using them to clip.
+ This is so we don't skip a potentially valid writer because they are not in start order.
+ */
+ writers.append(item._writers);
+ item._writers.clear();
+ while (r._min < r._max && NULL != (vc = writers.pop())) {
+ uint64_t base = static_cast<int64_t>(writers.head->resp_range.getOffset());
+ uint64_t delta = static_cast<int64_t>(writers.head->resp_range.getRemnantSize());
+
+ if (base + delta < r._min || base > r._max) {
+ item._writers.push(vc); // of no use to us, just put it back.
+ } else if (base < r._min + DELTA) {
+ r._min = base + delta; // we can wait, so depend on this writer and clip.
+ item._writers.push(vc); // we're done with it, put it back.
+ cycle_vc = NULL; // we did something so clear cycle indicator
+ } else if (vc == cycle_vc) { // we're looping.
+ item._writers.push(vc); // put this one back.
+ while (NULL != (vc = writers.pop()))
+ item._writers.push(vc); // and the rest.
+ } else {
+ writers.enqueue(vc); // put it back to later checking.
+ if (NULL == cycle_vc)
+ cycle_vc = vc; // but keep an eye out for it coming around again.
+ }
}
- buf += tmp;
+ }
+ return r;
+}
- data(xcount).alternate = info;
- xcount++;
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
+void
+CacheRange::clear()
+{
+ _offset = 0;
+ _idx = -1;
+ _pending_range_shift_p = false;
+ _ct_field = NULL; // need to do real cleanup at some point.
+ _r.clear();
+}
+
+bool
+CacheRange::init(HTTPHdr *req)
+{
+ bool zret = true;
+ MIMEField *rf = req->field_find(MIME_FIELD_RANGE, MIME_LEN_RANGE);
+ if (rf) {
+ int len;
+ char const *val = rf->value_get(&len);
+ zret = _r.parseRangeFieldValue(val, len);
}
+ return zret;
+}
- return ((caddr_t)buf - (caddr_t)start);
+bool
+CacheRange::start()
+{
+ bool zret = true;
+
+ if (_r.hasRanges()) {
+ _offset = _r[_idx = 0]._min;
+ _pending_range_shift_p = _r.isMulti();
+ } else if (_r.isEmpty()) {
+ _offset = 0;
+ } else {
+ zret = false;
+ }
+ return zret;
+}
+
+bool
+CacheRange::apply(uint64_t len)
+{
+ bool zret = _r.apply(len);
+ if (zret) {
+ _len = len;
+ if (_r.hasRanges()) {
+ _offset = _r[_idx = 0]._min;
+ if (_r.isMulti())
+ _pending_range_shift_p = true;
+ }
+ }
+ return zret;
+}
+
+uint64_t
+CacheRange::consume(uint64_t size)
+{
+ switch (_r._state) {
+ case HTTPRangeSpec::EMPTY:
+ _offset += size;
+ break;
+ case HTTPRangeSpec::SINGLE:
+ _offset += std::min(size, (_r._single._max - _offset) + 1);
+ break;
+ case HTTPRangeSpec::MULTI:
+ ink_assert(_idx < static_cast<int>(_r.count()));
+ // Must not consume more than 1 range or the boundary strings won't get sent.
+ ink_assert(!_pending_range_shift_p);
+ ink_assert(size <= (_r[_idx]._max - _offset) + 1);
+ _offset += size;
+ if (_offset > _r[_idx]._max && ++_idx < static_cast<int>(_r.count())) {
+ _offset = _r[_idx]._min;
+ _pending_range_shift_p = true;
+ }
+ break;
+ default:
+ break;
+ }
+
+ return _offset;
+}
+
+CacheRange &
+CacheRange::generateBoundaryStr(CacheKey const &key)
+{
+ uint64_t rnd = this_ethread()->generator.random();
+ snprintf(_boundary, sizeof(_boundary), "%016" PRIx64 "%016" PRIx64 "..%016" PRIx64, key.slice64(0), key.slice64(1), rnd);
+ // GAH! snprintf null terminates so we can't actually print the last nybble that way and all of
+ // the internal hex converters do the same thing. This is crazy code I need to fix at some point.
+ // It is critical to print every nybble or the content lengths won't add up.
+ _boundary[HTTP_RANGE_BOUNDARY_LEN - 1] = "0123456789abcdef"[rnd & 0xf];
+ return *this;
+}
+
+uint64_t
+CacheRange::calcContentLength() const
+{
+ return _r.calcContentLength(_len, _ct_field ? _ct_field->m_len_value : 0);
}
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
+
#else // HTTP_CACHE
CacheHTTPInfoVector::CacheHTTPInfoVector() : data(&default_vec_info, 4), xcount(0)
@@ -348,5 +599,7 @@ CacheHTTPInfoVector::get_handles(const char * /* buf ATS_UNUSED */, int /* lengt
ink_assert(0);
return 0;
}
+/*-------------------------------------------------------------------------
+ -------------------------------------------------------------------------*/
#endif // HTTP_CACHE