You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2009/11/16 15:31:47 UTC
svn commit: r880772 - in
/incubator/cassandra/trunk/src/java/org/apache/cassandra:
gms/ApplicationState.java gms/EndPointState.java gms/Gossiper.java
service/StorageService.java
Author: jbellis
Date: Mon Nov 16 14:31:47 2009
New Revision: 880772
URL: http://svn.apache.org/viewvc?rev=880772&view=rev
Log:
add getSortedApplicationStates to preserve state ordering when re-gossiping to other nodes. patch by Jaakko Laine; reviewed by jbellis for CASSANDRA-548
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/EndPointState.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java?rev=880772&r1=880771&r2=880772&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/ApplicationState.java Mon Nov 16 14:31:47 2009
@@ -37,7 +37,7 @@
* Gossiper.instance().addApplicationState("LOAD STATE", loadState);
*/
-public class ApplicationState
+public class ApplicationState implements Comparable<ApplicationState>
{
private static ICompactSerializer<ApplicationState> serializer_;
static
@@ -79,6 +79,11 @@
{
return version_;
}
+
+ public int compareTo(ApplicationState apState)
+ {
+ return this.version_ - apState.getStateVersion();
+ }
}
class ApplicationStateSerializer implements ICompactSerializer<ApplicationState>
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/EndPointState.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/EndPointState.java?rev=880772&r1=880771&r2=880772&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/EndPointState.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/EndPointState.java Mon Nov 16 14:31:47 2009
@@ -76,7 +76,7 @@
return applicationState_.get(key);
}
- public Map<String, ApplicationState> getApplicationState()
+ public Map<String, ApplicationState> getApplicationStateMap()
{
return applicationState_;
}
@@ -118,6 +118,22 @@
//isAlive_ = false;
isAGossiper_ = value;
}
+
+ public List<Map.Entry<String,ApplicationState>> getSortedApplicationStates()
+ {
+ ArrayList<Map.Entry<String, ApplicationState>> entries = new ArrayList<Map.Entry<String, ApplicationState>>();
+ entries.addAll(applicationState_.entrySet());
+ Collections.sort(entries, new Comparator<Map.Entry<String, ApplicationState>>()
+ {
+ public int compare(Map.Entry<String, ApplicationState> lhs, Map.Entry<String, ApplicationState> rhs)
+ {
+ return lhs.getValue().compareTo(rhs.getValue());
+ }
+ });
+
+ return entries;
+ }
+
}
class EndPointStateSerializer implements ICompactSerializer<EndPointState>
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java?rev=880772&r1=880771&r2=880772&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java Mon Nov 16 14:31:47 2009
@@ -28,7 +28,7 @@
import org.apache.cassandra.net.IVerbHandler;
import org.apache.cassandra.net.Message;
import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.utils.LogUtil;
+
import org.apache.log4j.Logger;
/**
@@ -209,7 +209,7 @@
{
List<Integer> versions = new ArrayList<Integer>();
versions.add( epState.getHeartBeatState().getHeartBeatVersion() );
- Map<String, ApplicationState> appStateMap = epState.getApplicationState();
+ Map<String, ApplicationState> appStateMap = epState.getApplicationStateMap();
Set<String> keys = appStateMap.keySet();
for ( String key : keys )
@@ -431,7 +431,7 @@
{
reqdEndPointState = new EndPointState(epState.getHeartBeatState());
}
- Map<String, ApplicationState> appStateMap = epState.getApplicationState();
+ Map<String, ApplicationState> appStateMap = epState.getApplicationStateMap();
/* Accumulate all application states whose versions are greater than "version" variable */
Set<String> keys = appStateMap.keySet();
for ( String key : keys )
@@ -627,13 +627,12 @@
void applyApplicationStateLocally(InetAddress addr, EndPointState localStatePtr, EndPointState remoteStatePtr)
{
- Map<String, ApplicationState> localAppStateMap = localStatePtr.getApplicationState();
- Map<String, ApplicationState> remoteAppStateMap = remoteStatePtr.getApplicationState();
+ Map<String, ApplicationState> localAppStateMap = localStatePtr.getApplicationStateMap();
- Set<String> remoteKeys = remoteAppStateMap.keySet();
- for ( String remoteKey : remoteKeys )
+ for (Map.Entry<String,ApplicationState> remoteEntry : remoteStatePtr.getSortedApplicationStates())
{
- ApplicationState remoteAppState = remoteAppStateMap.get(remoteKey);
+ String remoteKey = remoteEntry.getKey();
+ ApplicationState remoteAppState = remoteEntry.getValue();
ApplicationState localAppState = localAppStateMap.get(remoteKey);
/* If state doesn't exist locally for this key then just apply it */
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=880772&r1=880771&r2=880772&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java Mon Nov 16 14:31:47 2009
@@ -485,14 +485,10 @@
public void onJoin(InetAddress endpoint, EndPointState epState)
{
- ApplicationState stateNormal = epState.getApplicationState(StorageService.STATE_NORMAL);
- ApplicationState stateBootstrapping = epState.getApplicationState(StorageService.STATE_BOOTSTRAPPING);
-
- if (stateNormal != null)
- onChange(endpoint, StorageService.STATE_NORMAL, stateNormal);
-
- if (stateBootstrapping != null)
- onChange(endpoint, StorageService.STATE_BOOTSTRAPPING, stateBootstrapping);
+ for (Map.Entry<String,ApplicationState> entry : epState.getSortedApplicationStates())
+ {
+ onChange(endpoint, entry.getKey(), entry.getValue());
+ }
}
public void onAlive(InetAddress endpoint, EndPointState state)