From 58136e4e306af8fde3639d0779d11d5e1711295b Mon Sep 17 00:00:00 2001 From: Andrew Branson Date: Fri, 4 Apr 2014 13:34:58 +0200 Subject: 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. --- src/main/java/com/c2kernel/lookup/NextKeyManager.java | 13 +++++++++++++ .../com/c2kernel/persistency/ClusterStorageManager.java | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) (limited to 'src') 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()); } } -- cgit v1.2.3