Author: mcardle
Date: Mon Aug 14 08:28:36 2006
New Revision: 307
URL: https://svndev.jahia.net/websvn/listing.php?sc=1&rev=307&repname=esi_server
Log:
* (Continued) support for aclGroup template sharing and other things
Modified:
trunk/WEB-INF/config/data.xml
trunk/src/net/sf/j2ep/ProxyFilter.java
trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java
trunk/src/org/jahia/esi/EsiConst.java
trunk/src/org/jahia/esi/GetThread.java
trunk/src/org/jahia/esi/Utils.java
trunk/src/org/jahia/esi/cache/FragmentCache.java
trunk/src/org/jahia/esi/cache/RequestInfo.java
trunk/src/org/jahia/esi/cache/UrlCacheObject.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=307&repname=esi_server
==============================================================================
--- trunk/WEB-INF/config/data.xml (original)
+++ trunk/WEB-INF/config/data.xml Mon Aug 14 08:28:36 2006
@@ -233,14 +233,21 @@
<!-- *************** BEGIN : For Advanced Users only **************
-->
<!-- **************************************************************
-->
<!-- enable template caching -->
- <enableTemplateCaching>false</enableTemplateCaching>
+ <enableTemplateCaching>true</enableTemplateCaching>
+
+ <!-- During heavy loads, 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
- hopefully when there is less load.
+ This frees up resources on the ESI server to de
+ This is the amount of time, in seconds, until the browser should
reload the current page
+ -->
+ <metaRefreshWaitTimeInSecs>15</metaRefreshWaitTimeInSecs>
<!-- name of esi cookie (should be identical to esiCookieCookieName in
jahia.properties) -->
<userCookieName>jesid</userCookieName>
<!-- defines the maximum number of simultaenous HTTP connections to
any given host -->
- <maxHttpConnectionsPerHost>30</maxHttpConnectionsPerHost>
+ <maxHttpConnectionsPerHost>60</maxHttpConnectionsPerHost>
<!-- defines the total maximum number of simultaenous HTTP connections
across all hosts -->
- <maxTotalHttpConnections>50</maxTotalHttpConnections>
+ <maxTotalHttpConnections>120</maxTotalHttpConnections>
<!-- force processing of invalidation request before responding to
remote server -->
<processInvalidationRequestBeforeResponse>true</processInvalidationRequestBeforeResponse>
Modified: trunk/src/net/sf/j2ep/ProxyFilter.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/net/sf/j2ep/ProxyFilter.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/net/sf/j2ep/ProxyFilter.java (original)
+++ trunk/src/net/sf/j2ep/ProxyFilter.java Mon Aug 14 08:28:36 2006
@@ -114,6 +114,16 @@
private static Date oldestAllowedUserSession = new Date();
+ private static byte[] metaRefreshPage = null;
+
+ public static byte[] getMetaRefreshPage() {
+ return metaRefreshPage;
+ }
+
+ public static void setMetaRefreshPage(byte[] metaRefreshPage) {
+ ProxyFilter.metaRefreshPage = metaRefreshPage;
+ }
+
public static Date getOldestAllowedUserSession() {
return oldestAllowedUserSession;
}
@@ -461,12 +471,8 @@
multiThreadedHttpConnectionManager = new
MultiThreadedHttpConnectionManager();
multiThreadedHttpConnectionManager.getParams().setDefaultMaxConnectionsPerHost(settings.getMaxHttpConnectionsPerHost());
multiThreadedHttpConnectionManager.getParams().setMaxTotalConnections(settings.getMaxTotalHttpConnections());
- //TODO: remove this!
- threadAvailable = new
Semaphore(settings.getMaxHttpConnectionsPerHost()-10, true); //leaves 10
connections as a safety margin
- executor = new ThreadPoolExecutor(7,
settings.getMaxHttpConnectionsPerHost()+10,
- 3L, TimeUnit.MINUTES,
- new LinkedBlockingQueue());
-
//Executors.newFixedThreadPool(settings.getMaxHttpConnectionsPerHost()-10);
+ threadAvailable = new
Semaphore(settings.getMaxHttpConnectionsPerHost()/2, true);
+ executor = Executors.newCachedThreadPool(); //unlimited number of
threads with 60 second time-to-live
httpClient = new HttpClient(multiThreadedHttpConnectionManager);
httpClient.getParams().setBooleanParameter(HttpClientParams.USE_EXPECT_CONTINUE,
false);
@@ -567,6 +573,9 @@
e.printStackTrace(); //To change body of catch statement use
File | Settings | File Templates.
}
}
+
+ //initialize Meta Refresh Page
+ setMetaRefreshPage(Utils.generateMetaRefreshPage().getBytes());
}
/**
@@ -616,6 +625,6 @@
}
}
- log = null;
+ //log = null;
}
}
\ No newline at end of file
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=307&repname=esi_server
==============================================================================
--- trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java (original)
+++ trunk/src/net/sf/j2ep/responsehandlers/ResponseHandlerBase.java Mon Aug 14
08:28:36 2006
@@ -250,7 +250,7 @@
//fragmentCache.add(cacheKey, this.method, cacheByteContent);
fragmentCache.add(cacheKey, this.methodToServer, cacheByteContent,
this.getClientRequestURL().toString(),
- null, null, null ,null, false, null);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ null, null, null ,null, false, null, null);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
}
@@ -519,8 +519,15 @@
String backupCacheKeyForThrottling = null;
try {
+ //deal with the case when we are overloaded with request, just
return a refresh-later page back to client browser
+ if (ProxyFilter.getThreadAvailable().availablePermits() == 0) {
+ 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());
+ }
//Deal with POSTs and such like
- if (checkforMatchingPassThroughRules(server, clientRequestUrl)) {
+ else if (checkforMatchingPassThroughRules(server,
clientRequestUrl)) {
if (SettingsBean.getInstance().isRequestThrottle()
&& SettingsBean.getInstance().isRequestThrottlePOSTs()) {
@@ -569,7 +576,7 @@
userAclGroupKey = userInfo[1];
requestInfoKey =
CacheAdministrator.getInstance().generateRequestInfoKey(server, clientRequest,
this.getClientRequestURL()) ;
requestInfo = fragmentCache.getRequestInfo(requestInfoKey);
- if (requestInfo!=null)
+ if (requestInfo!=null && userName!=null)
userAclDeclaredForCurrentRequest =
requestInfo.containsUsername(userName);
}
@@ -1014,7 +1021,7 @@
HttpSession userSession =
clientRequest.getSession(false);
if (userSession!=null)
userSession.invalidate();
- if (log.isDebugEnabled())
log.debug("invalidated user session due to cookie set ["+setCookieVal+"].
Session username was : "+userSession.getAttribute("userName"));
+ if (log.isDebugEnabled())
log.debug("invalidated user session due to cookie set ["+setCookieVal+"].
Session username was : "+userSession.getAttribute(EsiConst.USERNAME));
}
}
}
@@ -1376,11 +1383,11 @@
HttpSession userSession = clientRequest.getSession(true);
boolean invalidatedSession = false;
- Date userTimeAdded = (Date)userSession.getAttribute("timeAdded");
+ Date userTimeAdded =
(Date)userSession.getAttribute(EsiConst.TIME_ADDED);
if (userTimeAdded!=null &&
userTimeAdded.before(ProxyFilter.getOldestAllowedUserSession()))
invalidatedSession = true;
- if (userSession.isNew() ||
userSession.getAttribute("userName")==null || invalidatedSession) {
+ if (userSession.isNew() ||
userSession.getAttribute(EsiConst.USERNAME)==null || invalidatedSession) {
org.apache.commons.httpclient.URI requestURI =
methodToServer.getURI();
//TODO: add authentication
@@ -1393,11 +1400,26 @@
String servletPath = path.substring(0,slashIndex);
requestURI.setPath(servletPath+"/servlet/EsiTemplateCachingServlet");
+ log.info("EsiTemplateCachingServlet :"+requestURI);
+
GetMethod userGroupMembershipFetcherMethod = new
GetMethod(requestURI.toString());
+
+ //copy client's request headers to this method (need it for
Jahia session)
+ Header[] hds = methodToServer.getRequestHeaders();
+ for (int i = 0; i < hds.length; i++) {
+ Header hd = hds[i];
+ userGroupMembershipFetcherMethod.setRequestHeader(hd);
+ }
+
try {
int statusCode =
ProxyFilter.getHttpClient().executeMethod(userGroupMembershipFetcherMethod);
- if (statusCode != HttpStatus.SC_OK) {
+ if (statusCode == HttpStatus.SC_NOT_FOUND) {
+ if (log.isDebugEnabled()) log.debug(" User does not
yet have a session on Jahia");
+ return new String[] {null, null};
+ }
+ else if (statusCode != HttpStatus.SC_OK) {
log.error("userGroupMembershipFetcherMethod failed : "
+ userGroupMembershipFetcherMethod.getStatusLine());
+ return new String[] {null, null};
}
else {
// Read the response body.
@@ -1405,28 +1427,28 @@
if (responseBody!=null) {
String responseStr = new String(responseBody,
"UTF-8");
- String[] tokens = responseStr.split("______");
+ String[] tokens =
responseStr.split(EsiConst.ACLGROUP_TEMPLATE_REPONSE_SEPARATOR);
userName = tokens[0];
- userSession.setAttribute("userName",userName);
+
userSession.setAttribute(EsiConst.USERNAME,userName);
userAclGroupKey = tokens[1];
-
userSession.setAttribute("userAclGroupKey",userAclGroupKey);
- userSession.setAttribute("timeAdded",new Date());
+
userSession.setAttribute(EsiConst.USER_ACL_GROUP_KEY,userAclGroupKey);
+ userSession.setAttribute(EsiConst.TIME_ADDED,new
Date());
if (log.isDebugEnabled()) log.debug("Set session
username["+userName+"] and userAclGroupKey["+userAclGroupKey+"]" );
}
}
//TODO: MORE error handling
} catch (HttpException e) {
- log.error("Fatal protocol violation: " + e.getMessage());
+ log.error("EsiTemplateCachingServlet : Fatal protocol
violation: " + e.getMessage());
} catch (IOException e) {
- log.error("Fatal transport error: " + e.getMessage());
+ log.error("EsiTemplateCachingServlet : Fatal transport
error: " + e.getMessage());
} finally {
// Release the connection.
userGroupMembershipFetcherMethod.releaseConnection();
}
}
else {
- userName = (String)userSession.getAttribute("userName");
- userAclGroupKey =
(String)userSession.getAttribute("userAclGroupKey");
+ userName = (String)userSession.getAttribute(EsiConst.USERNAME);
+ userAclGroupKey =
(String)userSession.getAttribute(EsiConst.USER_ACL_GROUP_KEY);
if (userName==null || userAclGroupKey==null) {
log.error("Null values for userName["+userName+"] and/or
userAclGroupKey["+userAclGroupKey+"] for request
"+methodToServer.getURI().toString());
}
Modified: trunk/src/org/jahia/esi/EsiConst.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/EsiConst.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/EsiConst.java (original)
+++ trunk/src/org/jahia/esi/EsiConst.java Mon Aug 14 08:28:36 2006
@@ -106,6 +106,14 @@
public static String ACLGROUP_TEMPLATE_USER_MARKER =
"esiAclGroupedUserMarker";
public static String ACLGROUP_TEMPLATE_USERACLS_HEADER =
"JahiaEsi_UserAcls";
+ public static String ACLGROUP_TEMPLATE_NO_USERACLS_DETECTED = "NONE";
+ public static String ACLGROUP_TEMPLATE_USERACLS_UNSET = "UNSET";
+ public static String ACLGROUP_TEMPLATE_REPONSE_SEPARATOR = "______";
+
+ public static String USERNAME = "UserName";
+ public static String USER_ACL_GROUP_KEY = "userAclGroupKey";
+ public static String TIME_ADDED = "timeAdded";
+
public static HashMap RESERVED_PARAM_NAMES;
static
{
Modified: trunk/src/org/jahia/esi/GetThread.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/GetThread.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/GetThread.java (original)
+++ trunk/src/org/jahia/esi/GetThread.java Mon Aug 14 08:28:36 2006
@@ -366,6 +366,9 @@
if (log.isDebugEnabled()) log.debug(id + "- expiration
time extracted from expiry Headers. Expires in ["+(expiryDate -
now)/1000+"secs]");
+ requestInfo = new RequestInfo(false,
EsiConst.ACLGROUP_TEMPLATE_USERACLS_UNSET);
+ fragmentCache.addRequestInfo(requestInfoKey, requestInfo);
+
fragmentCache.add(urlKey, this.methodToServer, bytes,
this.clientRequestUrl,
null, null, null ,null,
@@ -375,7 +378,8 @@
true,
false, //can put inUse=false since we've sent it
already and won't use it again until another request
!fetchingSkeleton,
- null);
+ null,
+ requestInfoKey);
}
//no expiry info in response, so set cache entry to default
expirations for the moment
else {
@@ -387,7 +391,8 @@
true,
false, //can put inUse=false since we've sent it
already and won't use it again until another request
!fetchingSkeleton,
- null);
+ null,
+ requestInfoKey);
}
}
@@ -448,30 +453,40 @@
if (fetchingSkeleton &&
SettingsBean.getInstance().isEnableTemplateCaching()) {
Header headerAclUserAcls =
methodToServer.getResponseHeader(EsiConst.ACLGROUP_TEMPLATE_USERACLS_HEADER);
- if (requestInfo==null) {
- if (headerAclUserAcls !=null) {
- requestInfo = new RequestInfo(true,
headerAclUserAcls.getValue() );
- fragmentCache.addRequestInfo(requestInfoKey,
requestInfo);
- }
- else {
- requestInfo = new RequestInfo(false, null );
- fragmentCache.addRequestInfo(requestInfoKey,
requestInfo);
- }
- if (log.isDebugEnabled()) log.debug(id + " added
RequestInfo["+requestInfo+"] at key["+requestInfoKey+"] during request urlKey
["+urlToServer+"] ");
+
+ //Compares previous to new RequestInfo //TODO: eventually
remove
+ if (log.isDebugEnabled() && requestInfo!=null) {
+ String hvalue = (headerAclUserAcls
!=null)?headerAclUserAcls.getValue():null;
+ if (hvalue==null) {
+ if (requestInfo.isTemplate())
+ log.debug("Stored as template when return value
isn't template. Stored requestInfo["+requestInfo+"] " +
+ " does not match
headerAclUserAcls.getValue()["+headerAclUserAcls.getValue()+"]");
+ }
+ else if ( hvalue!=null &&
!requestInfo.getAclUsernames().equals(hvalue)) {
+
log.debug("requestInfo.getAclUsernames()["+requestInfo.getAclUsernames()+"] " +
+ " does not match
headerAclUserAcls.getValue()["+headerAclUserAcls.getValue()+"]");
+ }
+ }
+ //(re)generate the RequestInfo it from the response
+ //this is a Jahia page
+ if (headerAclUserAcls !=null) {
+ requestInfo = new RequestInfo(true,
headerAclUserAcls.getValue() );
+ fragmentCache.addRequestInfo(requestInfoKey, requestInfo);
}
- //sanity check
+ //this is not a Jahia page
else {
- String hvalue = (headerAclUserAcls
!=null)?headerAclUserAcls.getValue():null;
- if ( (headerAclUserAcls==null && hvalue!=null)
- ||
!requestInfo.getAclUsernames().equals(hvalue)) {
-
log.warn("requestInfo.getAclUsernames()["+requestInfo.getAclUsernames()+"] " +
- " does not match
headerAclUserAcls.getValue()["+headerAclUserAcls.getValue()+"]");
- }
+ requestInfo = new RequestInfo(false,
EsiConst.ACLGROUP_TEMPLATE_USERACLS_UNSET);
+ fragmentCache.addRequestInfo(requestInfoKey, requestInfo);
}
+ if (log.isDebugEnabled()) log.debug(id + " added
RequestInfo["+requestInfo+"] at key["+requestInfoKey+"] during request urlKey
["+urlToServer+"] ");
+ //sanity check : if RequestObject exists for this object, it
should be the same as the one returned in response
- userAclDeclaredForCurrentRequest =
requestInfo.containsUsername(userName);
- if (log.isDebugEnabled()) log.debug(id + " "+userName+" has
specific permission on RequestInfo["+requestInfo+"] at key["+requestInfoKey+"]
during request urlKey ["+urlToServer+"] ");
+ if (requestInfo.isTemplate()) {
+ userAclDeclaredForCurrentRequest =
requestInfo.containsUsername(userName);
+ if (log.isDebugEnabled() &&
userAclDeclaredForCurrentRequest)
+ log.debug(id + " "+userName+" has specific permission
on RequestInfo["+requestInfo+"] at key["+requestInfoKey+"] during request
urlKey ["+urlToServer+"] ");
+ }
//is this an aclGroup-shared templates?
if (!userAclDeclaredForCurrentRequest //user-based caching
cannot user userGroups
&& requestInfo.isTemplate() //must be a template
@@ -755,6 +770,7 @@
|| //AggregatePageOnTheFly=true but entry is for
user 'guest' (i.e. no cookie marker in UrlKey) -since we want to keep these
whole in cache-
(SettingsBean.getInstance().isAggregateLoggedUserPagesOnTheFly()
&&
Utils.getUserCookieValue(clientRequest)==null)
+ || aclGroupSharedTemplate //no need to do this
if it's an aclGrouped shared template //TODO: review this is we give precedence
to OnTheFly instead
) ) {
//TODO: sanity check, this should not be necessary
if (tagCacheObject==null) {
@@ -869,7 +885,10 @@
valid,
true, //currently inUse
!fetchingSkeleton,
- userName);
+ userName,
+ Utils.replaceUserNameWithMarker(
+
Utils.removeCacheParamInUrl(requestInfoKey, isCacheOffOnce)
+ , userName, !aclGroupSharedTemplate ));
}
//for "/cache/bypass" we just don't store it (by setting
expiration to 0)
if (log.isDebugEnabled()) log.debug("Setting expiration to 0
for "+urlKey);
@@ -896,7 +915,8 @@
valid,
true,
!fetchingSkeleton,
- userName);
+ userName,
+ requestInfoKey);
} catch (Exception e) {
Modified: trunk/src/org/jahia/esi/Utils.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/Utils.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/Utils.java (original)
+++ trunk/src/org/jahia/esi/Utils.java Mon Aug 14 08:28:36 2006
@@ -75,7 +75,7 @@
private static final transient Log log = LogFactory.getLog(Utils.class);
- public static String jahiaEsiServerBuildNumber = "0.2";
+ public static String jahiaEsiServerBuildNumber = "0.3";
public static String stackTraceToString(Exception ex) {
// Append stack trace if not null
@@ -606,6 +606,35 @@
return page.toString();
}
+ public static String generateMetaRefreshPage()
+ {
+ StringBuffer page = new StringBuffer();
+ page.append("<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML//EN\">\n");
+ page.append("<html> <head>\n");
+ page.append("<title>Server Busy - Please Wait</title>\n");
+ page.append("<META http-equiv=\"refresh\"
content=\""+SettingsBean.getInstance().getMetaRefreshWaitTimeInSecs()+"\">\n");
+ page.append("</head>\n" );
+ page.append("\n" );
+ page.append("<body bgcolor=\"white\">\n" );
+ //page.append("<img
src='"+localAddress+"/esierror/img/esi_logo_mini.png' /><br>");
+ //page.append ("<pre> \n" );
+ //page.append (getJahiaWebCacheLogo());
+ //page.append ("</pre>\n");
+ page.append("<fieldset style='border-width: 7px; border-color: red;
border: inset'> <font color=\"red\">\n" );
+ page.append("<h2>The server is busy.</h2>\n" );
+ page.append("</font>\n" );
+ page.append( "Please Wait. Maximum
").append(SettingsBean.getInstance().getMaxHttpConnectionsPerHost()/2).append("
simultaneous connections reached.")
+ .append(" Automatic refresh in
").append(SettingsBean.getInstance().getMetaRefreshWaitTimeInSecs()).append("
seconds.\n");
+ page.append("<p><center> <form><input type=button value=\"Force Retry
Now\" onClick=\"window.location.reload( true )\"></form></center><p>");
+ page.append("\n" );
+ page.append("<hr>\n" );
+ page.append("<p><h3>Jahia ESI Cache Server - version
"+jahiaEsiServerBuildNumber+"</h3></p>\n" );
+ page.append("</fieldset>\n" );
+ page.append("</body> </html>");
+ return page.toString();
+ }
+
+
public static String getJahiaWebCacheLogo() {
StringBuffer logo = new StringBuffer();
logo.append ("\n");
Modified: trunk/src/org/jahia/esi/cache/FragmentCache.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/cache/FragmentCache.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/cache/FragmentCache.java (original)
+++ trunk/src/org/jahia/esi/cache/FragmentCache.java Mon Aug 14 08:28:36 2006
@@ -243,7 +243,7 @@
private static long defaultUnfetchedExpirationDelayInSecs = 86400; //24
hours
public void addUnfectched(String urlKey, HttpMethod method, String
errorMsg,
- String Url, boolean inUse, boolean isFragment
) {
+ String Url, boolean inUse, boolean isFragment ) {
if (SettingsBean.getInstance().isCacheJanitorEnable()) {
synchronized (urlKeyStore) { urlKeyStore.put(urlKey, urlKey); }
@@ -278,7 +278,8 @@
defaultUnfetchedExpirationDelayInSecs,
false,
inUse,
- isFragment
+ isFragment,
+ null
);
//all valid objects in cache have an expiration delay, expect for
unfetched error fragments.
@@ -431,7 +432,8 @@
boolean valid,
boolean inUse,
boolean isFragment,
- String userIdentifier
+ String userIdentifier,
+ String requestInfoKey
) {
add(urlKey, method, byteContent,
Url,
@@ -445,7 +447,8 @@
valid,
inUse,
isFragment,
- userIdentifier );
+ userIdentifier,
+ requestInfoKey);
}
public void add(String urlKey, HttpMethod method, byte[] byteContent,
@@ -455,7 +458,8 @@
int[] referencedObjsStartIndex,
int[] referencedObjsEndIndex,
boolean isFragment,
- String userIdentifier
+ String userIdentifier,
+ String requestInfoKey
) {
add(urlKey, method, byteContent,
Url,
@@ -469,7 +473,8 @@
true,
false,
isFragment,
- userIdentifier );
+ userIdentifier,
+ requestInfoKey );
}
public void add(String urlKey, HttpMethod method, byte[] byteContent,
@@ -484,7 +489,8 @@
boolean valid,
boolean inUse,
boolean isFragment,
- String userIdentifier //this is non-null only when we are
dealing with a aclGrouped shared template
+ String userIdentifier, //this is non-null only when we are
dealing with a aclGrouped shared template
+ String requestInfoKey
) {
if (log.isDebugEnabled()) log.debug("Adding ["+urlKey+"] with
expirationDateInSecs:"+new Date(expirationDateInSecs*1000));
@@ -515,6 +521,7 @@
previousUrlObj.setInUse(inUse);
previousUrlObj.setFragment(isFragment);
previousUrlObj.generatePidFidRefKey(); //update its key
+ previousUrlObj.setRequestInfoKey(requestInfoKey);
updateReferenceCount(refObjs,userIdentifier);
previousUrlObj.incUpdateCount();
urlEntry = updateExpirationDelay(urlEntry, expirationInSecs);
@@ -537,7 +544,8 @@
maxRemovalDelayInSecs,
valid,
inUse,
- isFragment);
+ isFragment,
+ requestInfoKey);
if (!isFragment) {
//only need to add templates to keyStore (since associated
fragments will be deleted if template deleted)
@@ -786,6 +794,8 @@
String contentHashToRemove = urlObj.getContentHash();
removeContentCacheObject(contentObj, contentHashToRemove, urlKey);
+ //in any case, remove its requestInfo object
+ removeRequestInfo(urlObj.getRequestInfoKey());
}
else
log.info("---- could not remove already deleted content
["+urlObj.getContentHash()+"] for urlKey:"+urlKey );
@@ -922,24 +932,35 @@
}
public RequestInfo getRequestInfo(String requestUrl) { //TODO: make sure
requestUrl string is cluster-compatible encoded
- CacheEntry urlEntry = requestInfoStore.getCacheEntry(requestUrl);
- if (urlEntry!=null) {
- if (! (urlEntry.getObject() instanceof RequestInfo) ) {
- log.error("ERROR " + requestUrl);
+ if (requestUrl!=null) {
+ CacheEntry urlEntry = requestInfoStore.getCacheEntry(requestUrl);
+ if (urlEntry!=null) {
+ RequestInfo requestInfo = (RequestInfo) urlEntry.getObject();
+ return requestInfo;
+ }
+ else {
+ if (log.isDebugEnabled()) log.debug("Couldn't get since wasn't
found in the cache: RequestInfo with key ["+requestUrl +"] ");
}
- RequestInfo requestInfo = (RequestInfo) urlEntry.getObject();
- return requestInfo;
- }
- else {
- if (log.isDebugEnabled()) log.debug("wasn't found in the cache:
UrlCacheObject with urlKey ["+requestUrl +"] ");
- return null;
}
+ return null;
}
public void addRequestInfo(String requestInfoKey, RequestInfo requestInfo)
{
CacheEntry newEntry = new CacheEntry();
newEntry.setObject(requestInfo);
- requestInfoStore.put(requestInfoKey, newEntry);
+ requestInfoStore.putCacheEntry(requestInfoKey, newEntry, true);
+ }
+
+ public void removeRequestInfo(String requestUrl) {
+ if (requestUrl!=null) {
+ //CacheEntry urlEntry = requestInfoStore.getCacheEntry(requestUrl);
+ //if (urlEntry!=null) {
+ requestInfoStore.remove(requestUrl);
+ //}
+ //else {
+ // if (log.isDebugEnabled()) log.debug("Couldn't remove since
wasn't found in the cache: RequestInfo with key ["+requestUrl +"] ");
+ //}
+ }
}
public PidFidRefCacheHelper getPidFidRefCacheHelper() {
Modified: trunk/src/org/jahia/esi/cache/RequestInfo.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/cache/RequestInfo.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/cache/RequestInfo.java (original)
+++ trunk/src/org/jahia/esi/cache/RequestInfo.java Mon Aug 14 08:28:36 2006
@@ -75,8 +75,12 @@
* @return
*/
public boolean containsUsername (String username) {
- if (username==null)
- return false;
+ if (!template
+ || username==null
+ ||
aclUsernames.equals(EsiConst.ACLGROUP_TEMPLATE_NO_USERACLS_DETECTED)
+ ||
aclUsernames.equals(EsiConst.ACLGROUP_TEMPLATE_USERACLS_UNSET) )
+ return false;
+
return this.aclUsernames.indexOf(username+
EsiConst.ACLGROUP_TEMPLATE_USERACLS_SEPARATOR)!=-1;
}
Modified: trunk/src/org/jahia/esi/cache/UrlCacheObject.java
URL:
https://svndev.jahia.net/websvn/diff.php?path=/trunk/src/org/jahia/esi/cache/UrlCacheObject.java&rev=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/cache/UrlCacheObject.java (original)
+++ trunk/src/org/jahia/esi/cache/UrlCacheObject.java Mon Aug 14 08:28:36 2006
@@ -93,6 +93,7 @@
protected String urlKey; //a copy of the hashkey where this object is
stored
protected boolean fragment=false; //true if current object is a fragment
of a template, false if it's a template, a binary object or something else
protected String pidFidRefKey; //the key where this object will be
referenced in PidFidRefCache cross-reference cache (used only for Jahia
page/fragment objects only)
+ String requestInfoKey; //pointer to RequestInfo object related to this
object
public UrlCacheObject(String urlKey,
String contentHash,
@@ -106,7 +107,8 @@
long maxRemovalDelayInSecs,
boolean valid,
boolean inUse,
- boolean fragment
+ boolean fragment,
+ String requestInfoKey
) {
this.urlKey = urlKey;
this.referencedObjsUrls = referencedObjsUrls;
@@ -120,6 +122,7 @@
this.expirationDateInSecs = expirationDateInSecs;
this.maxRemovalDelayInSecs = maxRemovalDelayInSecs;
this.valid = valid;
+ this.requestInfoKey = requestInfoKey;
setInUse(inUse);
initCookies();
copyHeaders();
@@ -140,6 +143,14 @@
this.fragment = fragment;
}
+ public String getRequestInfoKey() {
+ return requestInfoKey;
+ }
+
+ public void setRequestInfoKey(String requestInfoKey) {
+ this.requestInfoKey = requestInfoKey;
+ }
+
public String getPidFidRefKey() {
return pidFidRefKey;
}
@@ -511,6 +522,7 @@
", referenceCount=" + referenceCount +
", urlKey=" + urlKey +
", pidFidRefKey=" + pidFidRefKey+
+ ", requestInfoKey='" + requestInfoKey+ "'" +
"}";
}
}
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=307&repname=esi_server
==============================================================================
--- trunk/src/org/jahia/esi/settings/SettingsBean.java (original)
+++ trunk/src/org/jahia/esi/settings/SettingsBean.java Mon Aug 14 08:28:36 2006
@@ -133,6 +133,9 @@
private int requestThrottleMaxWait = 4000; //in ms
private boolean enableTemplateCaching = false;
+
+ private int metaRefreshWaitTimeInSecs = 15; //in secs
+
/**
* The default non-caching rules, which will be traversed to find a
matching non-caching rule.
*/
@@ -222,6 +225,14 @@
//TODO: add these to data.xml -----------------------------------------
//TODO: ***************************** END - Dummy Functions
*********************************
+ public int getMetaRefreshWaitTimeInSecs() {
+ return metaRefreshWaitTimeInSecs;
+ }
+
+ public void setMetaRefreshWaitTimeInSecs(int metaRefreshWaitTimeInSecs) {
+ this.metaRefreshWaitTimeInSecs = metaRefreshWaitTimeInSecs;
+ }
+
public boolean isEnableTemplateCaching() {
return enableTemplateCaching;
}
@@ -695,6 +706,7 @@
", connectionTimeout=" + connectionTimeout + "\n" +
", maxHttpConnectionsPerHost='" + maxHttpConnectionsPerHost +
"'" + "\n" +
", maxTotalHttpConnections='" + maxTotalHttpConnections + "'"
+ "\n" +
+ ", metaRefreshWaitTimeInSecs ='" + metaRefreshWaitTimeInSecs+
"'" + "\n" +
", maxFetchThreadWait='" + maxFetchThreadWait + "' ms" + "\n"
+
", processInvalidationRequestBeforeResponse=" +
processInvalidationRequestBeforeResponse + "\n" +
"\n" +