Merge branch 'cassandra-2.2' into cassandra-3.0
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/e2ee2045 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/e2ee2045 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/e2ee2045 Branch: refs/heads/cassandra-3.0 Commit: e2ee204580a0ee87b36e1df6aa2717830dfb33d0 Parents: 23d722e a6196a3 Author: Jay Zhuang <jay.zhu...@yahoo.com> Authored: Sun Dec 30 21:41:28 2018 -0800 Committer: Jay Zhuang <jay.zhu...@yahoo.com> Committed: Sun Dec 30 21:49:33 2018 -0800 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../cassandra/service/CassandraDaemon.java | 47 ++++++++++++ .../cassandra/service/StorageService.java | 78 ++++++++++++++++---- .../cassandra/service/StorageServiceMBean.java | 7 ++ .../org/apache/cassandra/tools/NodeProbe.java | 5 ++ .../apache/cassandra/tools/nodetool/Join.java | 1 + 6 files changed, 126 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/e2ee2045/CHANGES.txt ---------------------------------------------------------------------- diff --cc CHANGES.txt index 8fd0200,16695c8..d29cdc1 --- a/CHANGES.txt +++ b/CHANGES.txt @@@ -33,39 -8,8 +33,40 @@@ * Returns null instead of NaN or Infinity in JSON strings (CASSANDRA-14377) -2.2.13 +3.0.17 + * Fix corrupted static collection deletions in 3.0 -> 2.{1,2} messages (CASSANDRA-14568) + * Fix potential IndexOutOfBoundsException with counters (CASSANDRA-14167) + * Restore resumable hints delivery, backport CASSANDRA-11960 (CASSANDRA-14419) + * Always close RT markers returned by ReadCommand#executeLocally() (CASSANDRA-14515) + * Reverse order queries with range tombstones can cause data loss (CASSANDRA-14513) + * Fix regression of lagging commitlog flush log message (CASSANDRA-14451) + * Add Missing dependencies in pom-all (CASSANDRA-14422) + * Cleanup StartupClusterConnectivityChecker and PING Verb (CASSANDRA-14447) + * Fix deprecated repair error notifications from 3.x clusters to legacy JMX clients (CASSANDRA-13121) + * Cassandra not starting when using enhanced startup scripts in windows (CASSANDRA-14418) + * Fix progress stats and units in compactionstats (CASSANDRA-12244) + * Better handle missing partition columns in system_schema.columns (CASSANDRA-14379) + * Delay hints store excise by write timeout to avoid race with decommission (CASSANDRA-13740) + * Deprecate background repair and probablistic read_repair_chance table options + (CASSANDRA-13910) + * Add missed CQL keywords to documentation (CASSANDRA-14359) + * Fix unbounded validation compactions on repair / revert CASSANDRA-13797 (CASSANDRA-14332) + * Avoid deadlock when running nodetool refresh before node is fully up (CASSANDRA-14310) + * Handle all exceptions when opening sstables (CASSANDRA-14202) + * Handle incompletely written hint descriptors during startup (CASSANDRA-14080) + * Handle repeat open bound from SRP in read repair (CASSANDRA-14330) + * Respect max hint window when hinting for LWT (CASSANDRA-14215) + * Adding missing WriteType enum values to v3, v4, and v5 spec (CASSANDRA-13697) + * Don't regenerate bloomfilter and summaries on startup (CASSANDRA-11163) + * Fix NPE when performing comparison against a null frozen in LWT (CASSANDRA-14087) + * Log when SSTables are deleted (CASSANDRA-14302) + * Fix batch commitlog sync regression (CASSANDRA-14292) + * Write to pending endpoint when view replica is also base replica (CASSANDRA-14251) + * Chain commit log marker potential performance regression in batch commit mode (CASSANDRA-14194) + * Fully utilise specified compaction threads (CASSANDRA-14210) + * Pre-create deletion log records to finish compactions quicker (CASSANDRA-12763) +Merged from 2.2: + * Don't enable client transports when bootstrap is pending (CASSANDRA-14525) * Fix bug that prevented compaction of SSTables after full repairs (CASSANDRA-14423) * Incorrect counting of pending messages in OutboundTcpConnection (CASSANDRA-11551) * Fix compaction failure caused by reading un-flushed data (CASSANDRA-12743) http://git-wip-us.apache.org/repos/asf/cassandra/blob/e2ee2045/src/java/org/apache/cassandra/service/CassandraDaemon.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/service/CassandraDaemon.java index 177f8e3,e250050..6869d2c --- a/src/java/org/apache/cassandra/service/CassandraDaemon.java +++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java @@@ -609,26 -597,6 +633,49 @@@ public class CassandraDaemo } } + public void startNativeTransport() + { ++ // We only start transports if bootstrap has completed and we're not in survey mode, OR if we are in ++ // survey mode and streaming has completed but we're not using auth. ++ // OR if we have not joined the ring yet. ++ if (StorageService.instance.hasJoined()) ++ { ++ if (StorageService.instance.isSurveyMode()) ++ { ++ if (StorageService.instance.isBootstrapMode() || DatabaseDescriptor.getAuthenticator().requireAuthentication()) ++ { ++ throw new IllegalStateException("Not starting client transports in write_survey mode as it's bootstrapping or " + ++ "auth is enabled"); ++ } ++ } ++ else ++ { ++ if (!SystemKeyspace.bootstrapComplete()) ++ { ++ throw new IllegalStateException("Node is not yet bootstrapped completely. Use nodetool to check bootstrap" + ++ " state and resume. For more, see `nodetool help bootstrap`"); ++ } ++ } ++ } ++ + if (nativeTransportService == null) + throw new IllegalStateException("setup() must be called first for CassandraDaemon"); + else + nativeTransportService.start(); + } + + public void stopNativeTransport() + { + if (nativeTransportService != null) + nativeTransportService.stop(); + } + + public boolean isNativeTransportRunning() + { + return nativeTransportService != null ? nativeTransportService.isRunning() : false; + } + + /** * A convenience method to stop and destroy the daemon in one shot. */ http://git-wip-us.apache.org/repos/asf/cassandra/blob/e2ee2045/src/java/org/apache/cassandra/service/StorageService.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/service/StorageService.java index 5f76f7d,03470b6..55bc9ae --- a/src/java/org/apache/cassandra/service/StorageService.java +++ b/src/java/org/apache/cassandra/service/StorageService.java @@@ -175,7 -156,8 +175,9 @@@ public class StorageService extends Not private volatile boolean isBootstrapMode; /* we bootstrap but do NOT join the ring unless told to do so */ - private boolean isSurveyMode = Boolean.parseBoolean(System.getProperty("cassandra.write_survey", "false")); + private boolean isSurveyMode = Boolean.parseBoolean(System.getProperty + ("cassandra.write_survey", "false")); ++ /* true if node is rebuilding and receiving data */ private final AtomicBoolean isRebuilding = new AtomicBoolean(); @@@ -211,6 -192,18 +213,16 @@@ private final StreamStateStore streamStateStore = new StreamStateStore(); - private final AtomicBoolean doneAuthSetup = new AtomicBoolean(false); - + public boolean isSurveyMode() + { + return isSurveyMode; + } + + public boolean hasJoined() + { + return joined; + } + /** This method updates the local token on disk */ public void setTokens(Collection<Token> tokens) { @@@ -352,6 -337,30 +364,29 @@@ { throw new IllegalStateException("No configured daemon"); } + + // We only start transports if bootstrap has completed and we're not in survey mode, OR if we are in + // survey mode and streaming has completed but we're not using auth. + // OR if we have not joined the ring yet. + if (StorageService.instance.hasJoined()) + { + if (StorageService.instance.isSurveyMode()) + { + if (StorageService.instance.isBootstrapMode() || DatabaseDescriptor.getAuthenticator().requireAuthentication()) + { - throw new IllegalStateException("Not starting RPC server in write_survey mode as " + - "it's bootstrapping or auth is enabled"); ++ throw new IllegalStateException("Not starting RPC server in write_survey mode as it's bootstrapping or " + ++ "auth is enabled"); + } + } + else + { + if (!SystemKeyspace.bootstrapComplete()) + { - throw new IllegalStateException("Node is not yet bootstrapped completely. Use nodetool to check bootstrap" + - " state and resume. For more, see `nodetool help bootstrap`"); ++ throw new IllegalStateException("Node is not yet bootstrapped completely. Use nodetool to check bootstrap state and resume. For more, see `nodetool help bootstrap`"); + } + } + } - ++ daemon.thriftServer.start(); } @@@ -1284,20 -1303,19 +1337,19 @@@ @Override public void onSuccess(StreamState streamState) { - isBootstrapMode = false; + bootstrapFinished(); - // start participating in the ring. - // pretend we are in survey mode so we can use joinRing() here - isSurveyMode = true; - try + if (isSurveyMode) { - progressSupport.progress("bootstrap", ProgressEvent.createNotification("Joining ring...")); - joinRing(); + logger.info("Startup complete, but write survey mode is active, not becoming an active ring member. Use JMX (StorageService->joinRing()) to finalize ring joining."); } - catch (IOException ignore) + else { - // joinRing with survey mode does not throw IOException + isSurveyMode = false; + progressSupport.progress("bootstrap", ProgressEvent.createNotification("Joining ring...")); + finishJoiningRing(bootstrapTokens); } progressSupport.progress("bootstrap", new ProgressEvent(ProgressEventType.COMPLETE, 1, 1, "Resume bootstrap complete")); + daemon.start(); logger.info("Resume complete"); } http://git-wip-us.apache.org/repos/asf/cassandra/blob/e2ee2045/src/java/org/apache/cassandra/service/StorageServiceMBean.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/service/StorageServiceMBean.java index 10d47f7,43d26c6..835da17 --- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java +++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java @@@ -492,9 -490,14 +492,16 @@@ public interface StorageServiceMBean ex // allows a node that have been started without joining the ring to join it public void joinRing() throws IOException; public boolean isJoined(); + public boolean isDrained(); + public boolean isDraining(); + /** Check if currently bootstrapping. + * Note this becomes false before {@link org.apache.cassandra.db.SystemKeyspace#bootstrapComplete()} is called, + * as setting bootstrap to complete is called only when the node joins the ring. + * @return True prior to bootstrap streaming completing. False prior to start of bootstrap and post streaming. + */ + public boolean isBootstrapMode(); + public void setStreamThroughputMbPerSec(int value); public int getStreamThroughputMbPerSec(); http://git-wip-us.apache.org/repos/asf/cassandra/blob/e2ee2045/src/java/org/apache/cassandra/tools/NodeProbe.java ---------------------------------------------------------------------- diff --cc src/java/org/apache/cassandra/tools/NodeProbe.java index 0d3c078,a022595..7ed40bb --- a/src/java/org/apache/cassandra/tools/NodeProbe.java +++ b/src/java/org/apache/cassandra/tools/NodeProbe.java @@@ -613,16 -574,11 +613,21 @@@ public class NodeProbe implements AutoC return ssProxy.isJoined(); } + public boolean isDrained() + { + return ssProxy.isDrained(); + } + + public boolean isDraining() + { + return ssProxy.isDraining(); + } + + public boolean isBootstrapMode() + { + return ssProxy.isBootstrapMode(); + } + public void joinRing() throws IOException { ssProxy.joinRing(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org