[
https://issues.apache.org/jira/browse/CASSANDRA-3118?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13096995#comment-13096995
]
deng commented on CASSANDRA-3118:
---------------------------------
I changed the code and added some debugg infomation,the code is:
public static void calculatePendingRanges(
AbstractReplicationStrategy strategy, String table) {
logger_.debug("Calculating pending ranges for {} with {}",
table, strategy);
TokenMetadata tm = StorageService.instance.getTokenMetadata();
Multimap<Range, InetAddress> pendingRanges =
HashMultimap.create();
Map<Token, InetAddress> bootstrapTokens =
tm.getBootstrapTokens();
Set<InetAddress> leavingEndpoints = tm.getLeavingEndpoints();
for(InetAddress leave:leavingEndpoints){
System.out.println("leavingEndpoints===="+leave.getHostAddress());
}
if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty()
&& tm.getMovingEndpoints().isEmpty()) {
if (logger_.isDebugEnabled())
logger_.debug(
"No bootstrapping, leaving or
moving nodes -> empty pending ranges for {}",
table);
tm.setPendingRanges(table, pendingRanges);
return;
}
Multimap<InetAddress, Range> addressRanges = strategy
.getAddressRanges();
// Copy of metadata reflecting the situation after all leave
operations
// are finished.
TokenMetadata allLeftMetadata = tm.cloneAfterAllLeft();
// get all ranges that will be affected by leaving nodes
Set<Range> affectedRanges = new HashSet<Range>();
for (InetAddress endpoint : leavingEndpoints)
affectedRanges.addAll(addressRanges.get(endpoint));
// for each of those ranges, find what new nodes will be
responsible for
// the range when
// all leaving nodes are gone.
for (Range range : affectedRanges) {
Collection<InetAddress> currentEndpoints = strategy
.calculateNaturalEndpoints(range.right,
tm);
Collection<InetAddress> newEndpoints = strategy
.calculateNaturalEndpoints(range.right,
allLeftMetadata);
System.out.println("olddAddressSize===="+currentEndpoints.size());
for (InetAddress olddAddress : currentEndpoints) {
System.out.println("OLDAddress+++++"
+ olddAddress.getHostAddress()
+ olddAddress.getHostName());
}
System.out.println("newEndpointsSize===="+newEndpoints.size());
for (InetAddress newAddress : newEndpoints) {
System.out.println("NEWAddress+++++"
+ newAddress.getHostAddress()
+ newAddress.getHostName());
}
newEndpoints.removeAll(currentEndpoints);
pendingRanges.putAll(range, newEndpoints);
}
// At this stage pendingRanges has been updated according to
leave
// operations. We can
// now continue the calculation by checking bootstrapping nodes.
// For each of the bootstrapping nodes, simply add and remove
them one
// by one to
// allLeftMetadata and check in between what their ranges would
be.
for (Map.Entry<Token, InetAddress> entry :
bootstrapTokens.entrySet()) {
InetAddress endpoint = entry.getValue();
allLeftMetadata.updateNormalToken(entry.getKey(),
endpoint);
for (Range range :
strategy.getAddressRanges(allLeftMetadata).get(
endpoint))
pendingRanges.put(range, endpoint);
allLeftMetadata.removeEndpoint(endpoint);
}
// At this stage pendingRanges has been updated according to
leaving and
// bootstrapping nodes.
// We can now finish the calculation by checking moving nodes.
// For each of the moving nodes, we do the same thing we did for
// bootstrapping:
// simply add and remove them one by one to allLeftMetadata and
check in
// between what their ranges would be.
for (Pair<Token, InetAddress> moving : tm.getMovingEndpoints())
{
InetAddress endpoint = moving.right; // address of the
moving node
// moving.left is a new token of the endpoint
allLeftMetadata.updateNormalToken(moving.left,
endpoint);
for (Range range :
strategy.getAddressRanges(allLeftMetadata).get(
endpoint)) {
pendingRanges.put(range, endpoint);
}
allLeftMetadata.removeEndpoint(endpoint);
}
tm.setPendingRanges(table, pendingRanges);
if (logger_.isDebugEnabled())
logger_.debug("Pending ranges:\n"
+ (pendingRanges.isEmpty() ? "<empty>"
: tm
.printPendingRanges()));
}
I run the commad decommission and the error is:
[root@devapp3 bin]# ./nodetool -h10.86.17.9 decommission
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at java.util.AbstractList$Itr.remove(AbstractList.java:360)
at java.util.AbstractCollection.removeAll(AbstractCollection.java:337)
at
org.apache.cassandra.service.StorageService.calculatePendingRanges(StorageService.java:1065)
at
org.apache.cassandra.service.StorageService.calculatePendingRanges(StorageService.java:1006)
at
org.apache.cassandra.service.StorageService.handleStateLeaving(StorageService.java:877)
at
org.apache.cassandra.service.StorageService.onChange(StorageService.java:732)
at org.apache.cassandra.gms.Gossiper.doNotifications(Gossiper.java:839)
at
org.apache.cassandra.gms.Gossiper.addLocalApplicationState(Gossiper.java:986)
at
org.apache.cassandra.service.StorageService.startLeaving(StorageService.java:1866)
at
org.apache.cassandra.service.StorageService.decommission(StorageService.java:1885)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at
com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:93)
at
com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:27)
at
com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:208)
at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:120)
at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:262)
at
com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
at
com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
at
javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1426)
at
javax.management.remote.rmi.RMIConnectionImpl.access$200(RMIConnectionImpl.java:72)
at
javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1264)
at
javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1359)
at
javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:788)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at
sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at
sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
I saw the log:
DEBUG 11:38:37,513 DECOMMISSIONING
DEBUG 11:38:37,528 Node /10.86.17.9 state leaving, token 14668421489936677549167
5769537457222604
DEBUG 11:38:37,528 Calculating pending ranges for edl with org.apache.cassandra.
locator.SimpleStrategy@7f8062
leavingEndpoints====10.86.17.9
olddAddressSize====1
OLDAddress+++++10.86.17.9szpc662G
newEndpointsSize====1
INFO 11:38:38,872 Started hinted handoff for endpoint /10.86.12.224
INFO 11:38:38,872 Finished hinted handoff of 0 rows to endpoint /10.86.12.224
DEBUG 11:38:38,872 Checking remote schema before delivering hints
DEBUG 11:38:38,872 schema for /172.28.16.127 matches local schema
DEBUG 11:38:38,872 Sleeping 8676ms to stagger hint delivery
NEWAddress+++++172.28.16.126172.28.16.126
DEBUG 11:38:42,044 Pending ranges:
172.28.16.126/172.28.16.126:(138871267011481555303305975400762244971,14668421489
9366775491675769537457222604]
DEBUG 11:38:42,044 Calculating pending ranges for Staging with org.apache.cassan
dra.locator.SimpleStrategy@181b3d4
leavingEndpoints====10.86.17.9
olddAddressSize====1
OLDAddress+++++10.86.17.9szpc662G
newEndpointsSize====1
NEWAddress+++++172.28.16.126172.28.16.126
DEBUG 11:38:42,060 Pending ranges:
172.28.16.126/172.28.16.126:(138871267011481555303305975400762244971,14668421489
9366775491675769537457222604]
172.28.16.126/172.28.16.126:(138871267011481555303305975400762244971,14668421489
9366775491675769537457222604]
DEBUG 11:38:42,075 Calculating pending ranges for test1 with org.apache.cassandr
a.locator.LocalStrategy@45378f
leavingEndpoints====10.86.17.9
olddAddressSize====1
OLDAddress+++++10.86.17.9szpc662G
newEndpointsSize====1
NEWAddress+++++10.86.17.9szpc662G
please check!!!!
> nodetool can not decommission a node
> --------------------------------------
>
> Key: CASSANDRA-3118
> URL: https://issues.apache.org/jira/browse/CASSANDRA-3118
> Project: Cassandra
> Issue Type: Bug
> Components: Tools
> Affects Versions: 0.8.4
> Environment: Cassandra0.84
> Reporter: deng
> Fix For: 0.8.5
>
> Attachments: 3118-debug.txt
>
>
> when i use nodetool ring and get the result ,and than i want to decommission
> 100.86.17.90 node ,but i get the error:
> [root@ip bin]# ./nodetool -h10.86.12.225 ring
> Address DC Rack Status State Load Owns
> Token
>
> 154562542458917734942660802527609328132
> 100.86.17.90 datacenter1 rack1 Up Leaving 1.08 MB
> 11.21% 3493450320433654773610109291263389161
> 100.86.12.225 datacenter1 rack1 Up Normal 558.25 MB
> 14.25% 27742979166206700793970535921354744095
> 100.86.12.224 datacenter1 rack1 Up Normal 5.01 GB 6.58%
> 38945137636148605752956920077679425910
> ERROR:
> root@ip bin]# ./nodetool -h100.86.17.90 decommission
> Exception in thread "main" java.lang.UnsupportedOperationException
> at java.util.AbstractList.remove(AbstractList.java:144)
> at java.util.AbstractList$Itr.remove(AbstractList.java:360)
> at java.util.AbstractCollection.removeAll(AbstractCollection.java:337)
> at
> org.apache.cassandra.service.StorageService.calculatePendingRanges(StorageService.java:1041)
> at
> org.apache.cassandra.service.StorageService.calculatePendingRanges(StorageService.java:1006)
> at
> org.apache.cassandra.service.StorageService.handleStateLeaving(StorageService.java:877)
> at
> org.apache.cassandra.service.StorageService.onChange(StorageService.java:732)
> at
> org.apache.cassandra.gms.Gossiper.doNotifications(Gossiper.java:839)
> at
> org.apache.cassandra.gms.Gossiper.addLocalApplicationState(Gossiper.java:986)
> at
> org.apache.cassandra.service.StorageService.startLeaving(StorageService.java:1836)
> at
> org.apache.cassandra.service.StorageService.decommission(StorageService.java:1855)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:93)
> at
> com.sun.jmx.mbeanserver.StandardMBeanIntrospector.invokeM2(StandardMBeanIntrospector.java:27)
> at
> com.sun.jmx.mbeanserver.MBeanIntrospector.invokeM(MBeanIntrospector.java:208)
> at com.sun.jmx.mbeanserver.PerInterface.invoke(PerInterface.java:120)
> at com.sun.jmx.mbeanserver.MBeanSupport.invoke(MBeanSupport.java:262)
> at
> com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:836)
> at
> com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:761)
> at
> javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1426)
> at
> javax.management.remote.rmi.RMIConnectionImpl.access$200(RMIConnectionImpl.java:72)
> at
> javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1264)
> at
> javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1359)
> at
> javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:788)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> at java.lang.reflect.Method.invoke(Method.java:597)
> at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
> at sun.rmi.transport.Transport$1.run(Transport.java:159)
> at java.security.AccessController.doPrivileged(Native Method)
> at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
> at
> sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
> at
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
> at
> sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> at java.lang.Thread.run(Thread.java:619)
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira