Merge branch 'cassandra-2.2' into cassandra-3.0

This commit is contained in:
Jay Zhuang 2018-12-30 21:41:28 -08:00
commit e2ee204580
6 changed files with 126 additions and 13 deletions

View File

@ -66,6 +66,7 @@
* 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)

View File

@ -472,6 +472,30 @@ public class CassandraDaemon
*/
public void start()
{
// 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())
{
logger.info("Not starting client transports in write_survey mode as it's bootstrapping or " +
"auth is enabled");
return;
}
}
else
{
if (!SystemKeyspace.bootstrapComplete())
{
logger.info("Not starting client transports as bootstrap has not completed");
return;
}
}
}
String nativeFlag = System.getProperty("cassandra.start_native_transport");
if ((nativeFlag != null && Boolean.parseBoolean(nativeFlag)) || (nativeFlag == null && DatabaseDescriptor.startNativeTransport()))
{
@ -611,6 +635,29 @@ public class CassandraDaemon
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

View File

@ -175,7 +175,9 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
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 +213,16 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
private final StreamStateStore streamStateStore = new StreamStateStore();
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 +364,29 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
{
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");
}
}
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`");
}
}
}
daemon.thriftServer.start();
}
@ -946,7 +981,10 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
}
else
{
logger.info("Startup complete, but write survey mode is active, not becoming an active ring member. Use JMX (StorageService->joinRing()) to finalize ring joining.");
if (dataAvailable)
logger.info("Startup complete, but write survey mode is active, not becoming an active ring member. Use JMX (StorageService->joinRing()) to finalize ring joining.");
else
logger.warn("Some data streaming failed. Use nodetool to check bootstrap state and resume. For more, see `nodetool help bootstrap`. {}", SystemKeyspace.getBootstrapState());
}
}
@ -980,9 +1018,24 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
}
else if (isSurveyMode)
{
isSurveyMode = false;
logger.info("Leaving write survey mode and joining ring at operator request");
finishJoiningRing(SystemKeyspace.getSavedTokens());
// if isSurveyMode is on then verify isBootstrapMode
// node can join the ring even if isBootstrapMode is true which should not happen
if (!isBootstrapMode())
{
isSurveyMode = false;
logger.info("Leaving write survey mode and joining ring at operator request");
finishJoiningRing(SystemKeyspace.getSavedTokens());
daemon.start();
}
else
{
logger.warn("Can't join the ring because in write_survey mode and bootstrap hasn't completed");
}
}
else if (isBootstrapMode())
{
// bootstrap is not complete hence node cannot join the ring
logger.warn("Can't join the ring because bootstrap hasn't completed.");
}
}
@ -1285,19 +1338,18 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
public void onSuccess(StreamState streamState)
{
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");
}

View File

@ -495,6 +495,13 @@ public interface StorageServiceMBean extends NotificationEmitter
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();

View File

@ -623,6 +623,11 @@ public class NodeProbe implements AutoCloseable
return ssProxy.isDraining();
}
public boolean isBootstrapMode()
{
return ssProxy.isBootstrapMode();
}
public void joinRing() throws IOException
{
ssProxy.joinRing();

View File

@ -32,6 +32,7 @@ public class Join extends NodeToolCmd
public void execute(NodeProbe probe)
{
checkState(!probe.isJoined(), "This node has already joined the ring.");
checkState(!probe.isBootstrapMode(), "Cannot join the ring until bootstrap completes");
try
{