|
From: <ha...@us...> - 2007-01-28 17:31:59
|
Revision: 1551
http://svn.sourceforge.net/cogkit/?rev=1551&view=rev
Author: hategan
Date: 2007-01-28 09:31:47 -0800 (Sun, 28 Jan 2007)
Log Message:
-----------
deal better with irrecoverable errors
Modified Paths:
--------------
trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/CachingDelegatedFileOperationHandler.java
trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/FileResourceCache.java
Modified: trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/CachingDelegatedFileOperationHandler.java
===================================================================
--- trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/CachingDelegatedFileOperationHandler.java 2007-01-28 17:26:42 UTC (rev 1550)
+++ trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/CachingDelegatedFileOperationHandler.java 2007-01-28 17:31:47 UTC (rev 1551)
@@ -35,8 +35,10 @@
setTaskStatus(task, Status.FAILED, null, "Service is not set");
throw new IllegalSpecException("Service is not set");
}
+ FileResource fr = null;
try {
- super.submit(task, getResource(service));
+ fr = getResource(service);
+ super.submit(task, fr);
setTaskStatus(task, Status.COMPLETED, null, null);
}
catch (TaskSubmissionException e) {
@@ -47,6 +49,10 @@
setTaskStatus(task, Status.FAILED, e, e.getMessage());
throw e;
}
+ catch (IrrecoverableResourceException e) {
+ FileResourceCache.getDefault().invalidateResource(resource);
+ setTaskStatus(task, Status.FAILED, e, e.getMessage());
+ }
catch (Exception e) {
setTaskStatus(task, Status.FAILED, e, e.getMessage());
throw new TaskSubmissionException(e.getMessage(), e);
@@ -65,7 +71,7 @@
task.setStatus(status);
}
- protected FileResource getResource(Service service)
+ protected synchronized FileResource getResource(Service service)
throws InvalidProviderException, ProviderMethodException,
IllegalHostException, InvalidSecurityContextException,
FileResourceException, IOException {
@@ -73,7 +79,7 @@
return resource;
}
- public void stopResources() {
+ public synchronized void stopResources() {
if (resource == null) {
return;
}
Modified: trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/FileResourceCache.java
===================================================================
--- trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/FileResourceCache.java 2007-01-28 17:26:42 UTC (rev 1550)
+++ trunk/current/src/cog/modules/abstraction-common/src/org/globus/cog/abstraction/impl/file/FileResourceCache.java 2007-01-28 17:31:47 UTC (rev 1551)
@@ -48,6 +48,7 @@
private LinkedList order;
private Map releaseTimes;
private Map fileResources;
+ private Set invalid;
private Set inUse;
private Timer timer;
private int maxIdleResources = DEFAULT_MAX_IDLE_RESOURCES;
@@ -57,6 +58,7 @@
public FileResourceCache() {
fileResources = new Hashtable();
inUse = new HashSet();
+ invalid = new HashSet();
order = new LinkedList();
releaseTimes = new Hashtable();
stopper = new ResourceStopper();
@@ -83,7 +85,8 @@
order.remove(fileResource);
releaseTimes.remove(fileResource);
if (logger.isDebugEnabled()) {
- logger.debug("Found cached resource");
+ logger.debug("Found cached resource ("
+ + fileResource + ")");
}
return fileResource;
}
@@ -142,7 +145,7 @@
synchronized (this) {
if (logger.isDebugEnabled()) {
logger.debug("Releasing resource for "
- + resource.getServiceContact());
+ + resource.getServiceContact() + " (" + resource + ")");
}
/*
* if (!inUse.contains(resource)) { throw new
@@ -150,13 +153,19 @@
* use"); }
*/
if (inUse.remove(resource)) {
- order.addLast(resource);
- releaseTimes
- .put(resource, new Long(System.currentTimeMillis()));
- if (logger.isDebugEnabled()) {
- logger.debug("Resource successfully released");
- lastRelease = new Throwable();
+ if (invalid.remove(resource)) {
+ removeResource(resource);
}
+ else {
+ order.addLast(resource);
+ releaseTimes.put(resource, new Long(System
+ .currentTimeMillis()));
+ if (logger.isDebugEnabled()) {
+ logger.debug("Resource (" + resource
+ + ") successfully released");
+ lastRelease = new Throwable();
+ }
+ }
}
else {
if (logger.isDebugEnabled()) {
@@ -169,6 +178,10 @@
}
}
+ public synchronized void invalidateResource(FileResource resource) {
+ invalid.add(resource);
+ }
+
private void removeResource(FileResource resource) {
synchronized (this) {
if (fileResources.containsKey(resource.getServiceContact())) {
@@ -214,7 +227,7 @@
this.maxIdleTime = maxIdleTime;
}
- private void checkTimer() {
+ private synchronized void checkTimer() {
if (timer == null) {
timer = new Timer(true);
timer.schedule(new ResourceSwipe(this), 60000, 60000);
@@ -284,7 +297,7 @@
fr.stop();
}
catch (Exception e) {
- logger.warn("Failed to stop resource", e);
+ logger.info("Failed to stop resource", e);
}
fr = nextResource();
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|