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:34:58 +0200
commit58136e4e306af8fde3639d0779d11d5e1711295b (patch)
tree9fe7e358680cb032c79078da9dd7cef680a1808d
parent32cdc72a71ad56477754e14239ede337ac3d960c (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.
-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 16e942d..77bc546 100644
--- a/src/main/java/com/c2kernel/persistency/ClusterStorageManager.java
+++ b/src/main/java/com/c2kernel/persistency/ClusterStorageManager.java
@@ -146,7 +146,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());
}
}