diff --git a/core/src/main/java/org/infinispan/xsite/BackupFailureException.java b/core/src/main/java/org/infinispan/xsite/BackupFailureException.java index eae85f2c38cf..cf9031427e1a 100644 --- a/core/src/main/java/org/infinispan/xsite/BackupFailureException.java +++ b/core/src/main/java/org/infinispan/xsite/BackupFailureException.java @@ -21,6 +21,9 @@ import org.infinispan.remoting.RpcException; +import java.util.HashMap; +import java.util.Map; + /** * Exception to be used to signal failures to backup to remote sites. * @@ -29,23 +32,40 @@ */ public class BackupFailureException extends RpcException { - private String remoteSiteName; - private String localCacheName; + private Map failures; + private String localCacheName; + - public BackupFailureException(Throwable cause, String remoteSiteName, String localCacheName) { - super("The local cache" + localCacheName + " failed to backup data to the remote site " + remoteSiteName, cause); - this.remoteSiteName = remoteSiteName; - this.localCacheName = localCacheName; + public BackupFailureException(String localCacheName) { + this.localCacheName = localCacheName; } public BackupFailureException() { } - public String getRemoteSiteName() { - return remoteSiteName; + public void addFailure(String site, Throwable t) { + if(site != null && t != null) { + if(failures == null) + failures = new HashMap(3); + failures.put(site, t); + } + } + + public String getRemoteSiteNames() { + return failures != null? failures.keySet().toString() : null; } public String getLocalCacheName() { return localCacheName; } + + @Override + public String toString() { + if(failures == null || failures.isEmpty()) + return super.toString(); + StringBuilder sb=new StringBuilder("The local cache " + localCacheName + " failed to backup data to the remote sites:\n"); + for(Map.Entry entry: failures.entrySet()) + sb.append(entry.getKey()).append(": ").append(entry.getValue()).append("\n"); + return sb.toString(); + } } diff --git a/core/src/main/java/org/infinispan/xsite/BackupSenderImpl.java b/core/src/main/java/org/infinispan/xsite/BackupSenderImpl.java index 7cbbdd00f369..36c6a0407d38 100644 --- a/core/src/main/java/org/infinispan/xsite/BackupSenderImpl.java +++ b/core/src/main/java/org/infinispan/xsite/BackupSenderImpl.java @@ -126,6 +126,7 @@ public void processResponses(BackupResponse backupResponse, VisitableCommand com backupResponse.waitForBackupToFinish(); SitesConfiguration sitesConfiguration = config.sites(); Map failures = backupResponse.getFailedBackups(); + BackupFailureException backupException = null; for (Map.Entry failure : failures.entrySet()) { BackupFailurePolicy policy = sitesConfiguration.getFailurePolicy(failure.getKey()); if (policy == BackupFailurePolicy.CUSTOM) { @@ -135,9 +136,13 @@ public void processResponses(BackupResponse backupResponse, VisitableCommand com if (policy == BackupFailurePolicy.WARN) { log.warnXsiteBackupFailed(cacheName, failure.getKey(), failure.getValue()); } else if (policy == BackupFailurePolicy.FAIL) { - throw new BackupFailureException(failure.getValue(),failure.getKey(), cacheName); + if(backupException == null) + backupException = new BackupFailureException(cacheName); + backupException.addFailure(failure.getKey(), failure.getValue()); } } + if(backupException != null) + throw backupException; } @Override diff --git a/core/src/main/java/org/infinispan/xsite/XSiteBackup.java b/core/src/main/java/org/infinispan/xsite/XSiteBackup.java index 650f9932ccea..9fe29e1353ff 100644 --- a/core/src/main/java/org/infinispan/xsite/XSiteBackup.java +++ b/core/src/main/java/org/infinispan/xsite/XSiteBackup.java @@ -46,4 +46,8 @@ public boolean isSync() { public long getTimeout() { return timeout; } + + public String toString() { + return siteName + " (" + (sync? "sync" : "async") + ", timeout=" + timeout + ")"; + } } diff --git a/demos/gui/src/main/java/org/infinispan/demo/InfinispanDemo.java b/demos/gui/src/main/java/org/infinispan/demo/InfinispanDemo.java index b12377188bd6..466b50bfb409 100644 --- a/demos/gui/src/main/java/org/infinispan/demo/InfinispanDemo.java +++ b/demos/gui/src/main/java/org/infinispan/demo/InfinispanDemo.java @@ -167,15 +167,22 @@ public void actionPerformed(ActionEvent e) { @Override public void run() { // based on the value of the radio button: - if (putEntryRadioButton.isSelected()) { - cache.put(keyTextField.getText(), valueTextField.getText(), lifespan(), TimeUnit.MILLISECONDS, maxIdle(), TimeUnit.MILLISECONDS); - } else if (removeEntryRadioButton.isSelected()) { - cache.remove(keyTextField.getText()); - } else if (getEntryRadioButton.isSelected()) { - cache.get(keyTextField.getText()); + try { + if (putEntryRadioButton.isSelected()) { + cache.put(keyTextField.getText(), valueTextField.getText(), lifespan(), TimeUnit.MILLISECONDS, maxIdle(), TimeUnit.MILLISECONDS); + } else if (removeEntryRadioButton.isSelected()) { + cache.remove(keyTextField.getText()); + } else if (getEntryRadioButton.isSelected()) { + cache.get(keyTextField.getText()); + } + } + catch(Throwable t) { + // log.error("failed to update cache", t); + } + finally { + dataViewTab.repaint(); + processAction(goButton, false); } - dataViewTab.repaint(); - processAction(goButton, false); // reset these values lifespanSpinner.setValue(cache.getCacheConfiguration().expiration().lifespan()); @@ -379,7 +386,7 @@ public void run() { Util.close(stream); } } - cache = cacheManager.getCache(); + cache = cacheManager.getCache(); cache.start(); // repaint the cfg file display