Hi,

while curious on the new incremental repairs I updated our cluster to C* version 2.1.2 via the Debian apt-repository. Everything went quite well, but trying to start the tools sstablemetadata and sstablerepairedset lead to the following error:

    root@a01:/home/ifjke# sstablerepairedset
Error: Could not find or load main class org.apache.cassandra.tools.SSTableRepairedAtSetter
    root@a01:/home/ifjke#

Looking at the scripts starting these tools I found that the java classpath is build via

    for jar in `dirname $0`/../../lib/*.jar; do
        CLASSPATH=$CLASSPATH:$jar
    done

Because of the scripts beeing located in /usr/bin/ this leads to search for libs in /lib. Obviously there are no java or cassandra libraries there - nodetool instead uses a different way:

    if [ "x$CASSANDRA_INCLUDE" = "x" ]; then
        for include in "`dirname "$0"`/cassandra.in.sh" \
                       "$HOME/.cassandra.in.sh" \
                       /usr/share/cassandra/cassandra.in.sh \
/usr/local/share/cassandra/cassandra.in.sh \
                       /opt/cassandra/cassandra.in.sh; do
            if [ -r "$include" ]; then
                . "$include"
                break
            fi
        done
    elif [ -r "$CASSANDRA_INCLUDE" ]; then
        . "$CASSANDRA_INCLUDE"
    fi

I created a simple patch which works for both sstablemetadata and sstablerepairedset for me, but maybe that's worth sharing it:

---SNIP---

--- sstablerepairedset    2014-11-11 15:50:02.000000000 +0000
+++ sstablerepairedset_new    2014-12-18 07:52:26.967368891 +0000
@@ -16,22 +16,19 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.

-if [ "x$CLASSPATH" = "x" ]; then
-
-    # execute from the build dir.
-    if [ -d `dirname $0`/../../build/classes ]; then
-        for directory in `dirname $0`/../../build/classes/*; do
-            CLASSPATH=$CLASSPATH:$directory
-        done
-    else
-        if [ -f `dirname $0`/../lib/stress.jar ]; then
-            CLASSPATH=`dirname $0`/../lib/stress.jar
+if [ "x$CASSANDRA_INCLUDE" = "x" ]; then
+    for include in "`dirname "$0"`/cassandra.in.sh" \
+                   "$HOME/.cassandra.in.sh" \
+                   /usr/share/cassandra/cassandra.in.sh \
+ /usr/local/share/cassandra/cassandra.in.sh \
+                   /opt/cassandra/cassandra.in.sh; do
+        if [ -r "$include" ]; then
+            . "$include"
+            break
         fi
-    fi
-
-    for jar in `dirname $0`/../../lib/*.jar; do
-        CLASSPATH=$CLASSPATH:$jar
     done
+elif [ -r "$CASSANDRA_INCLUDE" ]; then
+    . "$CASSANDRA_INCLUDE"
 fi

 # Use JAVA_HOME if set, otherwise look for java in PATH


---SNIP---

Worked for me on both tools.

Jan

Reply via email to