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" +

Reply via email to