You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2013/10/22 22:31:49 UTC
[5/9] git commit: Fix harmless NPE in MM/HHOM Patch by
brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-5185
Fix harmless NPE in MM/HHOM
Patch by brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-5185
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/59bf44dd
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/59bf44dd
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/59bf44dd
Branch: refs/heads/trunk
Commit: 59bf44dd94939cea513a74250f6002357d1f9f2c
Parents: 12413ad
Author: Brandon Williams <br...@apache.org>
Authored: Tue Oct 22 15:28:47 2013 -0500
Committer: Brandon Williams <br...@apache.org>
Committed: Tue Oct 22 15:28:47 2013 -0500
----------------------------------------------------------------------
src/java/org/apache/cassandra/db/HintedHandOffManager.java | 8 ++++++--
src/java/org/apache/cassandra/service/MigrationManager.java | 5 ++++-
2 files changed, 10 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59bf44dd/src/java/org/apache/cassandra/db/HintedHandOffManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java b/src/java/org/apache/cassandra/db/HintedHandOffManager.java
index c333359..ede49e4 100644
--- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java
+++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java
@@ -209,7 +209,7 @@ public class HintedHandOffManager implements HintedHandOffManagerMBean
Gossiper gossiper = Gossiper.instance;
int waited = 0;
// first, wait for schema to be gossiped.
- while (gossiper.getEndpointStateForEndpoint(endpoint).getApplicationState(ApplicationState.SCHEMA) == null)
+ while (gossiper.getEndpointStateForEndpoint(endpoint) != null && gossiper.getEndpointStateForEndpoint(endpoint).getApplicationState(ApplicationState.SCHEMA) == null)
{
try
{
@@ -223,12 +223,14 @@ public class HintedHandOffManager implements HintedHandOffManagerMBean
if (waited > 2 * StorageService.RING_DELAY)
throw new TimeoutException("Didin't receive gossiped schema from " + endpoint + " in " + 2 * StorageService.RING_DELAY + "ms");
}
+ if (gossiper.getEndpointStateForEndpoint(endpoint) == null)
+ throw new TimeoutException("Node " + endpoint + " vanished while waiting for agreement");
waited = 0;
// then wait for the correct schema version.
// usually we use DD.getDefsVersion, which checks the local schema uuid as stored in the system table.
// here we check the one in gossip instead; this serves as a canary to warn us if we introduce a bug that
// causes the two to diverge (see CASSANDRA-2946)
- while (!gossiper.getEndpointStateForEndpoint(endpoint).getApplicationState(ApplicationState.SCHEMA).value.equals(
+ while (gossiper.getEndpointStateForEndpoint(endpoint) != null && !gossiper.getEndpointStateForEndpoint(endpoint).getApplicationState(ApplicationState.SCHEMA).value.equals(
gossiper.getEndpointStateForEndpoint(FBUtilities.getBroadcastAddress()).getApplicationState(ApplicationState.SCHEMA).value))
{
try
@@ -243,6 +245,8 @@ public class HintedHandOffManager implements HintedHandOffManagerMBean
if (waited > 2 * StorageService.RING_DELAY)
throw new TimeoutException("Could not reach schema agreement with " + endpoint + " in " + 2 * StorageService.RING_DELAY + "ms");
}
+ if (gossiper.getEndpointStateForEndpoint(endpoint) == null)
+ throw new TimeoutException("Node " + endpoint + " vanished while waiting for agreement");
logger.debug("schema for {} matches local schema", endpoint);
return waited;
}
http://git-wip-us.apache.org/repos/asf/cassandra/blob/59bf44dd/src/java/org/apache/cassandra/service/MigrationManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/MigrationManager.java b/src/java/org/apache/cassandra/service/MigrationManager.java
index e901b61..3ede35e 100644
--- a/src/java/org/apache/cassandra/service/MigrationManager.java
+++ b/src/java/org/apache/cassandra/service/MigrationManager.java
@@ -127,7 +127,10 @@ public class MigrationManager implements IEndpointStateChangeSubscriber
public void run()
{
// grab the latest version of the schema since it may have changed again since the initial scheduling
- VersionedValue value = Gossiper.instance.getEndpointStateForEndpoint(endpoint).getApplicationState(ApplicationState.SCHEMA);
+ EndpointState epState = Gossiper.instance.getEndpointStateForEndpoint(endpoint);
+ if (epState == null)
+ return;
+ VersionedValue value = epState.getApplicationState(ApplicationState.SCHEMA);
UUID currentVersion = UUID.fromString(value.value);
if (Schema.instance.getVersion().equals(currentVersion))
return;