summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Branson <andrew.branson@cern.ch>2014-04-04 13:34:58 +0200
committerAndrew Branson <andrew.branson@cern.ch>2014-04-04 13:36:58 +0200
commitc672fa9d426beb92d9149ebc32c9cdf9bece7845 (patch)
treedecedf2a1f5b729c130022ffab92d16861cfb9fa
parent4466bfb51367afefec57bae9ca8f571eef17cfd9 (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.java13
-rw-r--r--src/main/java/com/c2kernel/persistency/ClusterStorageManager.java2
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());
}
}