From 7283752c177a5d38776905f0fa115c2405ae2175 Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Thu, 26 Aug 2010 00:31:18 +0000 Subject: More robust corruption repairs. --- .../repo/replicated/ReplicationTrigger.java | 25 +++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/main/java/com/amazon/carbonado/repo/replicated') diff --git a/src/main/java/com/amazon/carbonado/repo/replicated/ReplicationTrigger.java b/src/main/java/com/amazon/carbonado/repo/replicated/ReplicationTrigger.java index 0e9281e..d29d568 100644 --- a/src/main/java/com/amazon/carbonado/repo/replicated/ReplicationTrigger.java +++ b/src/main/java/com/amazon/carbonado/repo/replicated/ReplicationTrigger.java @@ -18,6 +18,8 @@ package com.amazon.carbonado.repo.replicated; +import java.util.Map; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -343,7 +345,28 @@ class ReplicationTrigger extends Trigger { // properties. Be sure not to copy nulls from old replica to new // replica, in case new non-nullable properties have been added. This // is why copyUnequalProperties is called instead of copyAllProperties. - replicaEntry.copyUnequalProperties(newReplicaEntry); + try { + replicaEntry.copyUnequalProperties(newReplicaEntry); + } catch (IllegalArgumentException e) { + // Some property cannot be copied, so copy one at a time and skip + // the broken one. + Map propertyMap = replicaEntry.propertyMap(); + for (Map.Entry entry : propertyMap.entrySet()) { + String name = entry.getKey(); + Object oldValue = entry.getValue(); + try { + Object newValue = newReplicaEntry.getPropertyValue(name); + if (oldValue == null ? newValue != null : !oldValue.equals(newValue)) { + newReplicaEntry.setPropertyValue(name, oldValue); + } + } catch (IllegalArgumentException e2) { + // Skip it. + } catch (UnsupportedOperationException e2) { + // Skip it. + } + } + } + // Calling copyAllProperties will skip unsupported independent // properties in master, thus preserving old independent property values. masterEntry.copyAllProperties(newReplicaEntry); -- cgit v1.2.3