diff options
| author | Andrew Branson <andrew.branson@cern.ch> | 2014-04-04 13:34:58 +0200 |
|---|---|---|
| committer | Andrew Branson <andrew.branson@cern.ch> | 2014-04-04 13:36:58 +0200 |
| commit | c672fa9d426beb92d9149ebc32c9cdf9bece7845 (patch) | |
| tree | decedf2a1f5b729c130022ffab92d16861cfb9fa | |
| parent | 4466bfb51367afefec57bae9ca8f571eef17cfd9 (diff) | |
When generating the next SystemKey in NextKeyManager, make sure that
there is nothing already in the storage for that key. This prevents data
loss when the LDAP is out-of-sync with the storages. Fixes #179
| -rw-r--r-- | src/main/java/com/c2kernel/lookup/NextKeyManager.java | 13 | ||||
| -rw-r--r-- | src/main/java/com/c2kernel/persistency/ClusterStorageManager.java | 2 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/main/java/com/c2kernel/lookup/NextKeyManager.java b/src/main/java/com/c2kernel/lookup/NextKeyManager.java index fd873fd..a4ead4b 100644 --- a/src/main/java/com/c2kernel/lookup/NextKeyManager.java +++ b/src/main/java/com/c2kernel/lookup/NextKeyManager.java @@ -2,6 +2,9 @@ package com.c2kernel.lookup; import com.c2kernel.common.ObjectCannotBeUpdated;
import com.c2kernel.common.ObjectNotFoundException;
+import com.c2kernel.persistency.ClusterStorageException;
+import com.c2kernel.process.Gateway;
+import com.c2kernel.utils.Logger;
import com.novell.ldap.LDAPEntry;
/**************************************************************************
@@ -35,6 +38,16 @@ public class NextKeyManager { } catch (InvalidEntityPathException ex) {
throw new ObjectCannotBeUpdated("Invalid syskey "+(lastKey.getSysKey()+1)+". Maybe centre is full.");
}
+ //test that storage is empty for that key
+ try {
+ if (Gateway.getStorage().getClusterContents(lastKey.getSysKey(), "").length > 0)
+ throw new ObjectCannotBeUpdated("NextKeyManager: Storage already contains data for syskey "+lastKey.getSysKey()+
+ ". Storage is out of sync with nextkey. Please contact an administrator", "");
+ } catch (ClusterStorageException e) {
+ Logger.error(e);
+ throw new ObjectCannotBeUpdated("Could not check storage for prior data for the next generated systemKey: "+e.getMessage());
+ }
+
//set the last key
writeLastEntityKey(lastKey.getSysKey());
diff --git a/src/main/java/com/c2kernel/persistency/ClusterStorageManager.java b/src/main/java/com/c2kernel/persistency/ClusterStorageManager.java index 402c466..0546bab 100644 --- a/src/main/java/com/c2kernel/persistency/ClusterStorageManager.java +++ b/src/main/java/com/c2kernel/persistency/ClusterStorageManager.java @@ -173,7 +173,7 @@ public class ClusterStorageManager { }
}
} catch (ClusterStorageException e) {
- Logger.error("ClusterStorageManager.getClusterContents() - reader " + thisReader.getName() +
+ Logger.msg(5, "ClusterStorageManager.getClusterContents() - reader " + thisReader.getName() +
" could not retrieve contents of " + sysKey + "/" + path + ": " + e.getMessage());
}
}
|
