2011/7/6 Héctor Izquierdo Seliva <izquie...@strands.com>:
> Hi, i've been struggling to repair my failed node for the past few days,
> and I've seen this erros a few times.
>
> java.lang.RuntimeException: Cannot recover SSTable with version f
> (current version g).
>
> If it can read the sstables, why can't they be used to repair?

After a sstable is streamed (by repair in particular), we first have to recreate
a number of data structures. To do that, a specific part of the code is used
that do not know how to cope with older sstable version (hence the message).
This does not mean that this won't even get fixed, it will, but it is a current
limitation.

> Is there anything I can do besides running scrub or compact on all the 
> cluster?

Not really no. You can wait enough time so that all old sstables have been
compacted to newer version before running a repair, but since that could take
a long time if you have lots of data, that may not always be an option.
Now probably the most "efficient" way (the quote are because it's not the most
efficient in time and investment it will require from you) is probably something
like that: For each of the nodes of the cluster:
  1) look the sstables on the node (do a 'ls' on the data repository).
The sstable
will look something like Standard1-g-105-Data.db where the 'g' may be a 'f' for
some (all?) of the sstable. The 'f' means old sstable, the 'g' means new ones.
  2) if all or almost all the big sstables are 'f', then run scrub on
that node, that'll
be simpler.
  3) if only a handfull of sstable are on 'f' (typically, if the node
has not just been updated),
then what you can do is to force a compaction on those only by using
JMX->CompactionManager->forceUserDefinedCompaction,
giving it the keyspace name as first argument and the full path to the
sstable as second
argument.



>
> Regards
>
> Hector Izquierdo
>
>
>
>

Reply via email to