Hey, we thought a bit about it and came up with another solution:

We shut down Cassandra on one of the windows servers, copy over the data directory to one of the Linux servers, delete the LocationInfo files from the system keyspace, and start it up.

It should read the saved token from the datafiles, it should have all the data associated with that token, and on joining the cluster it should just pop in at the right place, but with a new ip address. And then we repeat that for each server.

Will this work? Or is there a better way?


On Thu, May 24, 2012 at 7:41 PM, Henrik Schröder <skrolle@gmail.com> wrote:
Hey everyone,

We're trying to migrate a cassandra cluster from a bunch of Windows machines to a bunch of (newer and more powerful) Linux machines.

Our initial plan was to simply bootstrap the Linux servers into the cluster one by one, and then decommission the old servers one by one. However, when we try to join a Linux server to the cluster, we get the following error:

ERROR 11:52:22,959 Fatal exception in thread Thread[Thread-21,5,main]
java.lang.AssertionError: Filename must include parent directory.
        at org.apache.cassandra.io.sstable.Descriptor.fromFilename(Descriptor.java:148)
        at org.apache.cassandra.streaming.PendingFile$PendingFileSerializer.deserialize(PendingFile.java:138)
        at org.apache.cassandra.streaming.StreamHeader$StreamHeaderSerializer.deserialize(StreamHeader.java:88)
        at org.apache.cassandra.streaming.StreamHeader$StreamHeaderSerializer.deserialize(StreamHeader.java:70)
        at org.apache.cassandra.net.IncomingTcpConnection.run(IncomingTcpConnection.java:80)

A quick googling reveals that the cause is the simple fact that Cassandra is transmitting the full path of the datafiles with the native directory separator, "\", and the Linux servers expect it to be "/", and get confused as a result.

We're running version 1.0.8. Is this fixed in a later release? Will this be fixed in a later release?

Are there any other ways of doing the migration? What happens if we join the new servers without bootstrapping and run repair? Are there any other ugly hacks or workaround we can do? We're not looking to run a mixed cluster, we just want to migrate all the data as painlessly as possible.