From: <fg...@us...> - 2011-06-11 08:21:50
|
Revision: 3520 http://openutils.svn.sourceforge.net/openutils/?rev=3520&view=rev Author: fgiust Date: 2011-06-11 08:21:43 +0000 (Sat, 11 Jun 2011) Log Message: ----------- multiple changes to locking and flushing Modified Paths: -------------- trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCacheManager.java trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCachedItem.java trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filters/CacheFilter.java trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/lock/LockableCacheContent.java trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/managers/CacheManager.java Modified: trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCacheManager.java =================================================================== --- trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCacheManager.java 2011-06-11 07:57:38 UTC (rev 3519) +++ trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCacheManager.java 2011-06-11 08:21:43 UTC (rev 3520) @@ -269,7 +269,7 @@ * @param request * @return */ - protected String getKey(HttpServletRequest request) + public String getKey(HttpServletRequest request) { String key = (String) request.getAttribute(cacheKeyInRequest); if (key == null) @@ -350,10 +350,17 @@ // handle concurrent cache flushing if (content != null) { - content.lockToWrite(); + boolean locked = content.lockToWrite(); content.flush(); contents.remove(getKey(request)); - content.releaseLockToWrite(); + if (locked) + { + content.releaseLockToWrite(); + } + else + { + log.debug("Content not locked: {}", request.getRequestURI()); + } } } @@ -416,7 +423,7 @@ repository = StringUtils.substringBefore(repositoryUrl, ":"); path = StringUtils.substringAfter(repositoryUrl, ":"); } - ObservationUtil.registerChangeListener(repository, path, this); + ObservationUtil.registerDeferredChangeListener(repository, path, this, 5000, 30000); } } } @@ -474,12 +481,13 @@ public void run() { log.info("Deleting stale cache dir {}", cacheDir.getAbsolutePath()); - boolean deleted = renamedDir.delete(); - if (deleted) + + try { + FileUtils.deleteDirectory(renamedDir); log.info("Cache dir {} successfully deleted", cacheDir.getAbsolutePath()); } - else + catch (IOException e) { log.info("Unable to delete cache dir {}", cacheDir.getAbsolutePath()); } Modified: trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCachedItem.java =================================================================== --- trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCachedItem.java 2011-06-11 07:57:38 UTC (rev 3519) +++ trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filesystem/FSCachedItem.java 2011-06-11 08:21:43 UTC (rev 3520) @@ -188,6 +188,13 @@ */ public boolean endWrite(OutputStream outputStream) throws IOException { + + if (outputStream == null) + { + releaseLockToWrite(); + return false; + } + try { IOUtils.closeQuietly(outputStream); Modified: trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filters/CacheFilter.java =================================================================== --- trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filters/CacheFilter.java 2011-06-11 07:57:38 UTC (rev 3519) +++ trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/filters/CacheFilter.java 2011-06-11 08:21:43 UTC (rev 3520) @@ -39,6 +39,8 @@ import net.sourceforge.openutils.mgnlsimplecache.managers.CachedItem; import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** @@ -53,6 +55,11 @@ private CacheManager cacheManager; /** + * Logger. + */ + private Logger log = LoggerFactory.getLogger(CacheFilter.class); + + /** * Returns the cacheContentManager. * @return the cacheContentManager */ @@ -147,6 +154,7 @@ if (cacheContent == null) { chain.doFilter(request, response); + return; } OutputStream os = null; @@ -154,60 +162,23 @@ { // if someone is writing, returns null os = cacheContent.beginWrite(); + + if (os == null) + { + log.debug("Concurrent request for {} while caching", cacheManager.getKey(request)); + } } // if request is cached (not new or cacheContent.beginWrite returns null) if (os == null) { - InputStream cacheContentInputStream = cacheContent.beginRead(acceptGzip); + boolean gotContentFromCache = returnCachedContent(request, response, acceptGzip, cacheContent); - boolean reset = true; - try + if (!gotContentFromCache) { - if (cacheContentInputStream != null) - { - // user requires cache refresh - // don't confuse client cache with server cache, user requested a refresh of the browser cache, - // this doesn't mean the server can't send the cached page back! - if (!"no-cache".equals(request.getHeader("Cache-Control"))) - { - if (!this.ifModifiedSince(request, cacheContent.getCreationTime())) - { - reset = false; - response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); - return; - } - } - - CacheHeaders cacheHeaders = cacheContent.getCacheHeaders(); - cacheHeaders.apply(response); - - // stream from cache - response.setDateHeader("Last-Modified", cacheContent.getCreationTime()); - response.setContentLength((int) cacheContent.getBodyLength(acceptGzip)); - if (acceptGzip && cacheContent.hasGzip()) - { - response.setHeader("Content-Encoding", "gzip"); - response.setHeader("Vary", "Accept-Encoding"); - } - IOUtils.copy(cacheContentInputStream, response.getOutputStream()); - response.setStatus(HttpServletResponse.SC_OK); - reset = false; - return; - } + log.debug("No content got from cache for {}", cacheManager.getKey(request)); } - catch (Throwable e) - { - throw new ServletException(e); - } - finally - { - cacheContent.endRead(cacheContentInputStream); - if (reset) - { - cacheManager.reset(request); - } - } + return; } this.startProcessing(); @@ -246,6 +217,69 @@ } /** + * @param request + * @param response + * @param acceptGzip + * @param cacheContent + * @throws IOException + * @throws ServletException + */ + private boolean returnCachedContent(final HttpServletRequest request, final HttpServletResponse response, + final boolean acceptGzip, CachedItem cacheContent) throws IOException, ServletException + { + InputStream cacheContentInputStream = cacheContent.beginRead(acceptGzip); + + boolean reset = true; + try + { + if (cacheContentInputStream != null) + { + // user requires cache refresh + // don't confuse client cache with server cache, user requested a refresh of the browser cache, + // this doesn't mean the server can't send the cached page back! + if (!"no-cache".equals(request.getHeader("Cache-Control"))) + { + if (!this.ifModifiedSince(request, cacheContent.getCreationTime())) + { + reset = false; + response.setStatus(HttpServletResponse.SC_NOT_MODIFIED); + return true; + } + } + + CacheHeaders cacheHeaders = cacheContent.getCacheHeaders(); + cacheHeaders.apply(response); + + // stream from cache + response.setDateHeader("Last-Modified", cacheContent.getCreationTime()); + response.setContentLength((int) cacheContent.getBodyLength(acceptGzip)); + if (acceptGzip && cacheContent.hasGzip()) + { + response.setHeader("Content-Encoding", "gzip"); + response.setHeader("Vary", "Accept-Encoding"); + } + IOUtils.copy(cacheContentInputStream, response.getOutputStream()); + response.setStatus(HttpServletResponse.SC_OK); + reset = false; + return true; + } + } + catch (Throwable e) + { + throw new ServletException(e); + } + finally + { + cacheContent.endRead(cacheContentInputStream); + if (reset) + { + cacheManager.reset(request); + } + } + return false; + } + + /** * Check if server cache is newer then the client cache * @param request The servlet request we are processing * @return boolean true if the server resource is newer Modified: trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/lock/LockableCacheContent.java =================================================================== --- trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/lock/LockableCacheContent.java 2011-06-11 07:57:38 UTC (rev 3519) +++ trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/lock/LockableCacheContent.java 2011-06-11 08:21:43 UTC (rev 3520) @@ -50,7 +50,7 @@ private WriteLock writeLock; /** - * + * */ public LockableCacheContent() { @@ -100,7 +100,10 @@ public void releaseLockToWrite() { - writeLock.unlock(); + if (lock.isWriteLockedByCurrentThread()) + { + writeLock.unlock(); + } } public void releaseLockToRead() Modified: trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/managers/CacheManager.java =================================================================== --- trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/managers/CacheManager.java 2011-06-11 07:57:38 UTC (rev 3519) +++ trunk/openutils-mgnlcache/src/main/java/net/sourceforge/openutils/mgnlsimplecache/managers/CacheManager.java 2011-06-11 08:21:43 UTC (rev 3520) @@ -34,6 +34,8 @@ CachedItem get(HttpServletRequest request); + String getKey(HttpServletRequest request); + void reset(HttpServletRequest request) throws IOException; void flush(); @@ -41,6 +43,6 @@ void start(); void stop(); - + boolean isActive(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |