Make UUID LSB unique per-process patch by slebresne; reviewed by benedict for CASSANDRA-7925
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/47e8ef9e Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/47e8ef9e Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/47e8ef9e Branch: refs/heads/cassandra-3.0 Commit: 47e8ef9e9ce70c54115681f854f483a53992c988 Parents: 79b9492 Author: Sylvain Lebresne <sylv...@datastax.com> Authored: Fri Jan 15 15:25:03 2016 +0100 Committer: Sylvain Lebresne <sylv...@datastax.com> Committed: Mon Jan 18 15:24:50 2016 +0100 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../org/apache/cassandra/service/StartupChecks.java | 2 +- src/java/org/apache/cassandra/utils/SigarLibrary.java | 9 ++++++++- src/java/org/apache/cassandra/utils/UUIDGen.java | 12 ++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/47e8ef9e/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 2bfba80..f571c29 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 2.2.5 + * Make UUID LSB unique per process (CASSANDRA-7925) * Avoid NPE when performing sstable tasks (scrub etc.) (CASSANDRA-10980) * Make sure client gets tombstone overwhelmed warning (CASSANDRA-9465) * Fix error streaming section more than 2GB (CASSANDRA-10961) http://git-wip-us.apache.org/repos/asf/cassandra/blob/47e8ef9e/src/java/org/apache/cassandra/service/StartupChecks.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/service/StartupChecks.java b/src/java/org/apache/cassandra/service/StartupChecks.java index 19f32b6..34bc824 100644 --- a/src/java/org/apache/cassandra/service/StartupChecks.java +++ b/src/java/org/apache/cassandra/service/StartupChecks.java @@ -195,7 +195,7 @@ public class StartupChecks { public void execute() { - new SigarLibrary().warnIfRunningInDegradedMode(); + SigarLibrary.instance.warnIfRunningInDegradedMode(); } }; http://git-wip-us.apache.org/repos/asf/cassandra/blob/47e8ef9e/src/java/org/apache/cassandra/utils/SigarLibrary.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/SigarLibrary.java b/src/java/org/apache/cassandra/utils/SigarLibrary.java index 7cf4d71..0312204 100644 --- a/src/java/org/apache/cassandra/utils/SigarLibrary.java +++ b/src/java/org/apache/cassandra/utils/SigarLibrary.java @@ -25,6 +25,8 @@ public class SigarLibrary { private Logger logger = LoggerFactory.getLogger(SigarLibrary.class); + public static final SigarLibrary instance = new SigarLibrary(); + private Sigar sigar; private FileSystemMap mounts = null; private boolean initialized = false; @@ -37,7 +39,7 @@ public class SigarLibrary // TODO: Determine if file system is remote or local // TODO: Determine if disk latency is within acceptable limits - public SigarLibrary() + private SigarLibrary() { logger.info("Initializing SIGAR library"); try @@ -154,6 +156,11 @@ public class SigarLibrary } } + public long getPid() + { + return initialized ? sigar.getPid() : -1; + } + public void warnIfRunningInDegradedMode() { if (initialized) http://git-wip-us.apache.org/repos/asf/cassandra/blob/47e8ef9e/src/java/org/apache/cassandra/utils/UUIDGen.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/utils/UUIDGen.java b/src/java/org/apache/cassandra/utils/UUIDGen.java index a777a50..df07e1f 100644 --- a/src/java/org/apache/cassandra/utils/UUIDGen.java +++ b/src/java/org/apache/cassandra/utils/UUIDGen.java @@ -26,6 +26,7 @@ import java.util.Random; import java.util.UUID; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Charsets; /** @@ -309,10 +310,21 @@ public class UUIDGen { try { + // Identify the host. MessageDigest messageDigest = MessageDigest.getInstance("MD5"); for(InetAddress addr : data) messageDigest.update(addr.getAddress()); + // Identify the process on the load: we use both the PID and class loader hash. + long pid = SigarLibrary.instance.getPid(); + if (pid < 0) + pid = new Random(System.currentTimeMillis()).nextLong(); + FBUtilities.updateWithLong(messageDigest, pid); + + ClassLoader loader = UUIDGen.class.getClassLoader(); + int loaderId = loader != null ? System.identityHashCode(loader) : 0; + FBUtilities.updateWithInt(messageDigest, loaderId); + return messageDigest.digest(); } catch (NoSuchAlgorithmException nsae)