From 4c9ec9167aaf9c3856cae939321b1749b1995948 Mon Sep 17 00:00:00 2001 From: Andor Molnar Date: Wed, 18 Apr 2018 13:52:46 +0200 Subject: [PATCH] ZOOKEEPER-2994. Added documentation and startup scripts --- bin/zkTxnLogToolkit.cmd | 24 ++++++ bin/zkTxnLogToolkit.sh | 38 ++++++++++ docs/zookeeperAdmin.html | 62 ++++++++++++++++ docs/zookeeperAdmin.pdf | Bin 98317 -> 101979 bytes .../content/xdocs/zookeeperAdmin.xml | 70 ++++++++++++++++++ 5 files changed, 194 insertions(+) create mode 100755 bin/zkTxnLogToolkit.cmd create mode 100755 bin/zkTxnLogToolkit.sh diff --git a/bin/zkTxnLogToolkit.cmd b/bin/zkTxnLogToolkit.cmd new file mode 100755 index 00000000000..362dc44b027 --- /dev/null +++ b/bin/zkTxnLogToolkit.cmd @@ -0,0 +1,24 @@ +@echo off +REM Licensed to the Apache Software Foundation (ASF) under one or more +REM contributor license agreements. See the NOTICE file distributed with +REM this work for additional information regarding copyright ownership. +REM The ASF licenses this file to You under the Apache License, Version 2.0 +REM (the "License"); you may not use this file except in compliance with +REM the License. You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +setlocal +call "%~dp0zkEnv.cmd" + +set ZOOMAIN=org.apache.zookeeper.server.persistence.TxnLogToolkit +call %JAVA% -cp "%CLASSPATH%" %ZOOMAIN% %* + +endlocal + diff --git a/bin/zkTxnLogToolkit.sh b/bin/zkTxnLogToolkit.sh new file mode 100755 index 00000000000..8beed20ddd7 --- /dev/null +++ b/bin/zkTxnLogToolkit.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# +# If this scripted is run out of /usr/bin or some other system bin directory +# it should be linked to and not copied. Things like java jar files are found +# relative to the canonical path of this script. +# + +# use POSIX interface, symlink is followed automatically +ZOOBIN="${BASH_SOURCE-$0}" +ZOOBIN="$(dirname "${ZOOBIN}")" +ZOOBINDIR="$(cd "${ZOOBIN}"; pwd)" + +if [ -e "$ZOOBIN/../libexec/zkEnv.sh" ]; then + . "$ZOOBINDIR"/../libexec/zkEnv.sh +else + . "$ZOOBINDIR"/zkEnv.sh +fi + +"$JAVA" -cp "$CLASSPATH" $JVMFLAGS \ + org.apache.zookeeper.server.persistence.TxnLogToolkit "$@" + + diff --git a/docs/zookeeperAdmin.html b/docs/zookeeperAdmin.html index 790ea10943e..9b2de9d4827 100644 --- a/docs/zookeeperAdmin.html +++ b/docs/zookeeperAdmin.html @@ -324,6 +324,9 @@

A Guide to Deployment and Administration

  • File Management
  • +
  • +Recovery - TxnLogToolkit +
  • @@ -2513,6 +2516,65 @@

    File Management

    + +

    Recovery - TxnLogToolkit

    +

    TxnLogToolkit is a command line tool shipped with ZooKeeper which + is capable of recovering transaction log entries with broken CRC.

    +

    Running it without any command line parameters or with the "-h,--help" + argument, it outputs the following help page:

    +
    +          $ bin/zkTxnLogToolkit.sh
    +
    +          usage: TxnLogToolkit [-dhrv] txn_log_file_name
    +          -d,--dump      Dump mode. Dump all entries of the log file. (this is the default)
    +          -h,--help      Print help message
    +          -r,--recover   Recovery mode. Re-calculate CRC for broken entries.
    +          -v,--verbose   Be verbose in recovery mode: print all entries, not just fixed ones.
    +          -y,--yes       Non-interactive mode: repair all CRC errors without asking
    +        
    +

    The default behaviour is safe: it dumps the entries of the given + transaction log file to the screen: (same as using '-d,--dump' parameter)

    +
    +          $ bin/zkTxnLogToolkit.sh log.100000001
    +          ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
    +          4/5/18 2:15:58 PM CEST session 0x16295bafcc40000 cxid 0x0 zxid 0x100000001 createSession 30000
    +          CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
    +          4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
    +          4/5/18 2:16:12 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x100000003 createSession 30000
    +          4/5/18 2:17:34 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x200000001 closeSession null
    +          4/5/18 2:17:34 PM CEST session 0x16295bd23720000 cxid 0x0 zxid 0x200000002 createSession 30000
    +          4/5/18 2:18:02 PM CEST session 0x16295bd23720000 cxid 0x2 zxid 0x200000003 create '/andor,#626262,v{s{31,s{'world,'anyone}}},F,1
    +          EOF reached after 6 txns.
    +        
    +

    There's a CRC error in the 2nd entry of the above transaction log file. In dump + mode, the toolkit only prints this information to the screen without touching the original file. In + recovery mode (-r,--recover flag) the original file still remains + untouched and all transactions will be copied over to a new txn log file with ".fixed" suffix. It recalculates + CRC values and copies the calculated value, if it doesn't match the original txn entry. + By default, the tool works interactively: it asks for confirmation whenever CRC error encountered.

    +
    +          $ bin/zkTxnLogToolkit.sh -r log.100000001
    +          ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
    +          CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
    +          Would you like to fix it (Yes/No/Abort) ?
    +        
    +

    Answering Yes means the newly calculated CRC value will be outputted + to the new file. No means that the original CRC value will be copied over. + Abort will abort the entire operation and exits. + (In this case the ".fixed" will not be deleted and left in a half-complete state: contains only entries which + have already been processed or only the header if the operation was aborted at the first entry.)

    +
    +          $ bin/zkTxnLogToolkit.sh -r log.100000001
    +          ZooKeeper Transactional Log File with dbid 0 txnlog format version 2
    +          CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null
    +          Would you like to fix it (Yes/No/Abort) ? y
    +          EOF reached after 6 txns.
    +          Recovery file log.100000001.fixed has been written with 1 fixed CRC error(s)
    +        
    +

    The default behaviour of recovery is to be silent: only entries with CRC error get printed to the screen. + One can turn on verbose mode with the -v,--verbose parameter to see all records. + Interactive mode can be turned off with the -y,--yes parameter. In this case all CRC errors will be fixed + in the new transaction file.

    Things to Avoid

    Here are some common problems you can avoid by configuring diff --git a/docs/zookeeperAdmin.pdf b/docs/zookeeperAdmin.pdf index e2d01f49c6d555735075c18073b8fd5f1e30cf21..7c9aec4783d3081337d114a35ff9096bd0b2b637 100644 GIT binary patch delta 18502 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 WCp_}+Jtn{m{Idmlc_SNR_WuKkgu*NU delta 15749 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 diff --git a/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml b/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml index 2de25a1e0d3..47fd0f42a22 100644 --- a/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml +++ b/src/docs/src/documentation/content/xdocs/zookeeperAdmin.xml @@ -2159,6 +2159,76 @@ server.3=zoo3:2888:3888 individual settings in which it is being deployed. + +

    + Recovery - TxnLogToolkit + + TxnLogToolkit is a command line tool shipped with ZooKeeper which + is capable of recovering transaction log entries with broken CRC. + Running it without any command line parameters or with the "-h,--help" + argument, it outputs the following help page: + + + $ bin/zkTxnLogToolkit.sh + + usage: TxnLogToolkit [-dhrv] txn_log_file_name + -d,--dump Dump mode. Dump all entries of the log file. (this is the default) + -h,--help Print help message + -r,--recover Recovery mode. Re-calculate CRC for broken entries. + -v,--verbose Be verbose in recovery mode: print all entries, not just fixed ones. + -y,--yes Non-interactive mode: repair all CRC errors without asking + + + The default behaviour is safe: it dumps the entries of the given + transaction log file to the screen: (same as using '-d,--dump' parameter) + + + $ bin/zkTxnLogToolkit.sh log.100000001 + ZooKeeper Transactional Log File with dbid 0 txnlog format version 2 + 4/5/18 2:15:58 PM CEST session 0x16295bafcc40000 cxid 0x0 zxid 0x100000001 createSession 30000 + CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null + 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null + 4/5/18 2:16:12 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x100000003 createSession 30000 + 4/5/18 2:17:34 PM CEST session 0x26295bafcc90000 cxid 0x0 zxid 0x200000001 closeSession null + 4/5/18 2:17:34 PM CEST session 0x16295bd23720000 cxid 0x0 zxid 0x200000002 createSession 30000 + 4/5/18 2:18:02 PM CEST session 0x16295bd23720000 cxid 0x2 zxid 0x200000003 create '/andor,#626262,v{s{31,s{'world,'anyone}}},F,1 + EOF reached after 6 txns. + + + There's a CRC error in the 2nd entry of the above transaction log file. In dump + mode, the toolkit only prints this information to the screen without touching the original file. In + recovery mode (-r,--recover flag) the original file still remains + untouched and all transactions will be copied over to a new txn log file with ".fixed" suffix. It recalculates + CRC values and copies the calculated value, if it doesn't match the original txn entry. + By default, the tool works interactively: it asks for confirmation whenever CRC error encountered. + + + $ bin/zkTxnLogToolkit.sh -r log.100000001 + ZooKeeper Transactional Log File with dbid 0 txnlog format version 2 + CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null + Would you like to fix it (Yes/No/Abort) ? + + + Answering Yes means the newly calculated CRC value will be outputted + to the new file. No means that the original CRC value will be copied over. + Abort will abort the entire operation and exits. + (In this case the ".fixed" will not be deleted and left in a half-complete state: contains only entries which + have already been processed or only the header if the operation was aborted at the first entry.) + + + $ bin/zkTxnLogToolkit.sh -r log.100000001 + ZooKeeper Transactional Log File with dbid 0 txnlog format version 2 + CRC ERROR - 4/5/18 2:16:05 PM CEST session 0x16295bafcc40000 cxid 0x1 zxid 0x100000002 closeSession null + Would you like to fix it (Yes/No/Abort) ? y + EOF reached after 6 txns. + Recovery file log.100000001.fixed has been written with 1 fixed CRC error(s) + + + The default behaviour of recovery is to be silent: only entries with CRC error get printed to the screen. + One can turn on verbose mode with the -v,--verbose parameter to see all records. + Interactive mode can be turned off with the -y,--yes parameter. In this case all CRC errors will be fixed + in the new transaction file. +