Author: mcardle
Date: Mon Aug 21 07:49:50 2006
New Revision: 311
URL: https://svndev.jahia.net/websvn/listing.php?sc=1&rev=311&repname=esi_server
Log:
* adds more settings to control Meta Refresh pages
* now waits and polls for available resources for a settable amount of time,
before returning a Meta Refresh page
Modified:
trunk/WEB-INF/config/data.xml
trunk/src/net/sf/j2ep/ConfigParser.java
trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java
trunk/src/org/jahia/esi/FetcherTask.java
trunk/src/org/jahia/esi/settings/SettingsBean.java
Modified: trunk/WEB-INF/config/data.xml
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/WEB-INF/config/data.xml&rev=311&repname=esi_server
==============================================================================
--- trunk/WEB-INF/config/data.xml (original)
+++ trunk/WEB-INF/config/data.xml Mon Aug 21 07:49:50 2006
@@ -12,7 +12,7 @@
or false if you want the favicon.ico of your remote server to be used
instead -->
<useLocalFavicon>true</useLocalFavicon>
- <!-- Sets the timeout in milliseconds a invalidation message
connection is held. A value of
+ <!-- Sets the timeout in milliseconds a connection to the remote
server or an invalidation message connection is held. A value of
zero means the timeout is not used. -->
<connectionTimeout>120000</connectionTimeout>
@@ -243,17 +243,25 @@
<!-- defines the maximum number of simultaenous threads to fetch
passthrough content (such as all requests verifying
the passthrough-rule: POSTS, Ajax ) from all the remote servers. (Set
to '-1' for unlimited threads) -->
<maxPassThroughFetchers>40</maxPassThroughFetchers>
- <!-- defines the maximum number of simultaenous HTTP connections to
any given host.-->
- <maxHttpConnectionsPerHost>80</maxHttpConnectionsPerHost>
- <!-- defines the total maximum number of simultaenous HTTP connections
across all hosts -->
- <maxTotalHttpConnections>160</maxTotalHttpConnections>
+ <!-- defines the maximum number of simultaneous HTTP connections to
any given host.-->
+ <maxHttpConnectionsPerHost>150</maxHttpConnectionsPerHost>
+ <!-- defines the total maximum number of simultaneous HTTP connections
across all hosts -->
+ <maxTotalHttpConnections>200</maxTotalHttpConnections>
<!-- During heavy loads or remote server timeouts, the ESI server will
return a default page with a Meta Refresh Tag
in it so that the browser will try again the request at a later time.
This frees up resources on the ESI server to finish the other queued
tasks.
metaRefreshWaitTimeInSecs is the amount of time, in seconds, the
browser
- should wait before reloading the current page
+ should wait before reloading the current page:
-->
<metaRefreshWaitTimeInSecs>15</metaRefreshWaitTimeInSecs>
+ <!-- This setting enables or disables Meta Refresh page responses
during remote server timeouts: -->
+
<enableMetaRefreshOnRemoteServerTimeOut>yes</enableMetaRefreshOnRemoteServerTimeOut>
+ <!-- This setting enables or disables Meta Refresh page responses
during heavy loads: -->
+ <enableMetaRefreshOnHeavyLoad>yes</enableMetaRefreshOnHeavyLoad>
+ <!-- During heavy loads, this is the time the ESI server waits to
check for available resources to
+ complete the request before returning a Meta Refresh page: -->
+
<waitTimeBeforeReturningMetaRefreshPageInSecs>8</waitTimeBeforeReturningMetaRefreshPageInSecs>
+
<!-- force processing of invalidation request before responding to
remote server -->
<processInvalidationRequestBeforeResponse>true</processInvalidationRequestBeforeResponse>
Modified: trunk/src/net/sf/j2ep/ConfigParser.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/net/sf/j2ep/ConfigParser.java&rev=311&repname=esi_server
==============================================================================
--- trunk/src/net/sf/j2ep/ConfigParser.java (original)
+++ trunk/src/net/sf/j2ep/ConfigParser.java Mon Aug 21 07:49:50 2006
@@ -203,6 +203,10 @@
digester.addBeanPropertySetter(
"config/generalsettings/maxCacheableContentFetchers",
"maxCacheableContentFetchers" );
digester.addBeanPropertySetter(
"config/generalsettings/maxPassThroughFetchers", "maxPassThroughFetchers" );
+ digester.addBeanPropertySetter(
"config/generalsettings/enableMetaRefreshOnRemoteServerTimeOut",
"enableMetaRefreshOnRemoteServerTimeOut" );
+ digester.addBeanPropertySetter(
"config/generalsettings/enableMetaRefreshOnHeavyLoad",
"enableMetaRefreshOnHeavyLoad" );
+ digester.addBeanPropertySetter(
"config/generalsettings/waitTimeBeforeReturningMetaRefreshPageInSecs",
"waitTimeBeforeReturningMetaRefreshPageInSecs" );
+
SettingsBean settingsBean = (SettingsBean) digester.parse(data);
SettingsBean.setInstance(settingsBean);
Modified: trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java&rev=311&repname=esi_server
==============================================================================
--- trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java (original)
+++ trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java Mon Aug 21
07:49:50 2006
@@ -645,13 +645,20 @@
byte[] wholePageBytes = null;
//deal with the case when we are overloaded with request, just
return a refresh-later page back to client browser
- if (!cached &&
ProxyFilter.getCacheableThreadsAvailable().availablePermits() == 0) {
- if (log.isInfoEnabled()) log.info("Meta Refresh Page
returned for "+clientRequest.getMethod()+" - "+clientRequestUrl);
-
clientResponse.setStatus(HttpStatus.SC_SERVICE_UNAVAILABLE);
- if (!methodToServer.getName().equals("HEAD")) //since
there is no content for HEAD requests
- sendStreamToClientFromCache (clientResponse ,
ProxyFilter.getMetaRefreshPage());
+ boolean resourcesNowAvailable = true;
+ if (
SettingsBean.getInstance().isEnableMetaRefreshOnHeavyLoad()
+ && !cached
+ &&
ProxyFilter.getCacheableThreadsAvailable().availablePermits() == 0) {
+ resourcesNowAvailable = waitLoop();
+ if (!resourcesNowAvailable) {
+ if (log.isInfoEnabled()) log.info("Meta Refresh Page
returned for "+clientRequest.getMethod()+" - "+clientRequestUrl);
+
clientResponse.setStatus(HttpStatus.SC_SERVICE_UNAVAILABLE);
+ if (!methodToServer.getName().equals("HEAD")) //since
there is no content for HEAD requests
+ sendStreamToClientFromCache (clientResponse ,
ProxyFilter.getMetaRefreshPage());
+ }
}
- else {
+
+ if (resourcesNowAvailable) {
if (!cached ) {
if (SettingsBean.getInstance().isRequestThrottle()) {
ProxyFilter.getRequestThrottle().checkRequest(cacheKey);
@@ -1147,10 +1154,17 @@
StringBuffer errorMsg = new StringBuffer("<b>ESI
ERROR: Could not fetch the object with urlKey [")
.append(runnableFetcher.getUrlKey()).append("]
due to Timed-Out error. TimeOut is currently at
").append(SettingsBean.getInstance().getMaxFetchThreadWait()).append(" msecs");
errorMsg.append("<br>Client request:
").append(clientRequestUrl);
+
+ String responsePage=null;
+ if
(SettingsBean.getInstance().isEnableMetaRefreshOnRemoteServerTimeOut())
+ responsePage =
Utils.getTimeOutErrorPage(clientRequest, errorMsg.toString());
+ else
+ responsePage = Utils.getErrorPage(clientRequest,
errorMsg.toString());
+
fragmentCache.addUnfectched (
runnableFetcher.getUrlKey(),
- runnableFetcher.getMethodToServer(),
- Utils.getTimeOutErrorPage(clientRequest,
errorMsg.toString()) ,
- clientRequestUrl, true, false);
+ runnableFetcher.getMethodToServer(),
+ responsePage ,
+ clientRequestUrl, true, false);
log.debug("throwing TransferFailedException due to
TimeOut");
throw new TransferFailedException("server Timeout
detected while waiting on thread "+ runnableFetcher.getThreadName()
@@ -1562,6 +1576,23 @@
}
/**
+ * polls for available resources for a while then quits
+ * @return
+ */
+ private boolean waitLoop() {
+ long endWaitTime = System.currentTimeMillis() +
SettingsBean.getInstance().getWaitTimeBeforeReturningMetaRefreshPageInSecs()*1000;
+
+ while (endWaitTime > System.currentTimeMillis() ) {
+ try {
+ this.wait(2000);
+ } catch (InterruptedException e) {}
+ if
(ProxyFilter.getCacheableThreadsAvailable().availablePermits()!=0)
+ return true;
+ }
+ return false;
+ }
+
+ /**
* unGZIPs a GZIP-compressed byte[]
*
*/
Modified: trunk/src/org/jahia/esi/FetcherTask.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/FetcherTask.java&rev=311&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/FetcherTask.java (original)
+++ trunk/src/org/jahia/esi/FetcherTask.java Mon Aug 21 07:49:50 2006
@@ -739,10 +739,17 @@
StringBuffer errorMsg = new StringBuffer("<b>ESI
ERROR: Could not fetch the object with urlKey [")
.append(runnableFetcher.getUrlKey()).append("]
due to Timed-Out error. TimeOut is currently at
").append(SettingsBean.getInstance().getMaxFetchThreadWait()).append(" msecs");
errorMsg.append("<br>Client request:
").append(clientRequestUrl);
+
+ String responsePage=null;
+ if
(SettingsBean.getInstance().isEnableMetaRefreshOnRemoteServerTimeOut())
+ responsePage =
Utils.getTimeOutErrorPage(clientRequest, errorMsg.toString());
+ else
+ responsePage =
Utils.getErrorPage(clientRequest, errorMsg.toString());
+
fragmentCache.addUnfectched (
runnableFetcher.getUrlKey(),
- runnableFetcher.getMethodToServer(),
- Utils.getTimeOutErrorPage(clientRequest,
errorMsg.toString()) ,
- this.clientRequestUrl, true,
!fetchingSkeleton);
+ runnableFetcher.getMethodToServer(),
+ responsePage ,
+ this.clientRequestUrl, true,
!fetchingSkeleton);
return;
} catch (InterruptedException ex) {
String errMsg = "Main Thread was interrupted while waiting
on [" + runnableFetcher.getThreadName() + "] for urlKey [" +
runnableFetcher.getUrlKey() + "] : " + ex;
Modified: trunk/src/org/jahia/esi/settings/SettingsBean.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/settings/SettingsBean.java&rev=311&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/settings/SettingsBean.java (original)
+++ trunk/src/org/jahia/esi/settings/SettingsBean.java Mon Aug 21 07:49:50 2006
@@ -139,6 +139,10 @@
private int maxCacheableContentFetchers = 30;
private int maxPassThroughFetchers = -1;
+ private boolean enableMetaRefreshOnRemoteServerTimeOut = true;
+ private boolean enableMetaRefreshOnHeavyLoad = true;
+ private int waitTimeBeforeReturningMetaRefreshPageInSecs = 10;
+
/**
* The default non-caching rules, which will be traversed to find a
matching non-caching rule.
*/
@@ -228,6 +232,30 @@
//TODO: add these to data.xml -----------------------------------------
//TODO: ***************************** END - Dummy Functions
*********************************
+ public boolean isEnableMetaRefreshOnRemoteServerTimeOut() {
+ return enableMetaRefreshOnRemoteServerTimeOut;
+ }
+
+ public void setEnableMetaRefreshOnRemoteServerTimeOut(boolean
enableMetaRefreshOnRemoteServerTimeOut) {
+ this.enableMetaRefreshOnRemoteServerTimeOut =
enableMetaRefreshOnRemoteServerTimeOut;
+ }
+
+ public boolean isEnableMetaRefreshOnHeavyLoad() {
+ return enableMetaRefreshOnHeavyLoad;
+ }
+
+ public void setEnableMetaRefreshOnHeavyLoad(boolean
enableMetaRefreshOnHeavyLoad) {
+ this.enableMetaRefreshOnHeavyLoad = enableMetaRefreshOnHeavyLoad;
+ }
+
+ public int getWaitTimeBeforeReturningMetaRefreshPageInSecs() {
+ return waitTimeBeforeReturningMetaRefreshPageInSecs;
+ }
+
+ public void setWaitTimeBeforeReturningMetaRefreshPageInSecs(int
waitTimeBeforeReturningMetaRefreshPageInSecs) {
+ this.waitTimeBeforeReturningMetaRefreshPageInSecs =
waitTimeBeforeReturningMetaRefreshPageInSecs;
+ }
+
public int getMaxCacheableContentFetchers() {
return maxCacheableContentFetchers;
}
@@ -728,6 +756,9 @@
", maxHttpConnectionsPerHost='" + maxHttpConnectionsPerHost +
"'" + "\n" +
", maxTotalHttpConnections='" + maxTotalHttpConnections + "'"
+ "\n" +
", metaRefreshWaitTimeInSecs ='" + metaRefreshWaitTimeInSecs+
"'" + "\n" +
+ ", waitTimeBeforeReturningMetaRefreshPageInSecs ='" +
waitTimeBeforeReturningMetaRefreshPageInSecs+ "'" + "\n" +
+ ", enableMetaRefreshOnHeavyLoad ='" +
enableMetaRefreshOnHeavyLoad + "'" + "\n" +
+ ", enableMetaRefreshOnRemoteServerTimeOut ='" +
enableMetaRefreshOnRemoteServerTimeOut+ "'" + "\n" +
", maxFetchThreadWait='" + maxFetchThreadWait + "' ms" + "\n"
+
", processInvalidationRequestBeforeResponse=" +
processInvalidationRequestBeforeResponse + "\n" +
"\n" +