You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by kt...@apache.org on 2012/01/18 20:54:20 UTC
svn commit: r1233019 - in
/incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/fate:
Admin.java Print.java
Author: kturner
Date: Wed Jan 18 19:54:20 2012
New Revision: 1233019
URL: http://svn.apache.org/viewvc?rev=1233019&view=rev
Log:
ACCUMULO-317 Added utility to administer fate operations
Added:
incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/fate/Admin.java
Removed:
incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/fate/Print.java
Added: incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/fate/Admin.java
URL: http://svn.apache.org/viewvc/incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/fate/Admin.java?rev=1233019&view=auto
==============================================================================
--- incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/fate/Admin.java (added)
+++ incubator/accumulo/branches/1.4/src/server/src/main/java/org/apache/accumulo/server/fate/Admin.java Wed Jan 18 19:54:20 2012
@@ -0,0 +1,193 @@
+/**
+ * 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.
+ */
+package org.apache.accumulo.server.fate;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.client.Instance;
+import org.apache.accumulo.core.zookeeper.ZooUtil;
+import org.apache.accumulo.core.zookeeper.ZooUtil.NodeMissingPolicy;
+import org.apache.accumulo.server.client.HdfsZooInstance;
+import org.apache.accumulo.server.fate.TStore.TStatus;
+import org.apache.accumulo.server.master.Master;
+import org.apache.accumulo.server.zookeeper.IZooReaderWriter;
+import org.apache.accumulo.server.zookeeper.ZooLock;
+import org.apache.accumulo.server.zookeeper.ZooReaderWriter;
+import org.apache.zookeeper.KeeperException;
+
+/**
+ * A utility to administer FATE operations
+ */
+public class Admin {
+ private static void print(Instance instance, IZooReaderWriter zk, ZooStore<Master> zs) throws KeeperException, InterruptedException {
+ Map<Long,List<String>> heldLocks = new HashMap<Long,List<String>>();
+ Map<Long,List<String>> waitingLocks = new HashMap<Long,List<String>>();
+
+ List<String> lockedTables = zk.getChildren(ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS);
+
+ for (String tableId : lockedTables) {
+ try {
+ List<String> lockNodes = zk.getChildren(ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS + "/" + tableId);
+ lockNodes = new ArrayList<String>(lockNodes);
+ Collections.sort(lockNodes);
+
+ int pos = 0;
+ boolean sawWriteLock = false;
+
+ for (String node : lockNodes) {
+ try {
+ byte[] data = zk.getData(ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS + "/" + tableId + "/" + node, null);
+ String lda[] = new String(data).split(":");
+
+ if (lda[0].charAt(0) == 'W')
+ sawWriteLock = true;
+
+ Map<Long,List<String>> locks;
+
+ if (pos == 0) {
+ locks = heldLocks;
+ } else {
+ if (lda[0].charAt(0) == 'R' && !sawWriteLock) {
+ locks = heldLocks;
+ } else {
+ locks = waitingLocks;
+ }
+ }
+
+ List<String> tables = locks.get(Long.parseLong(lda[1], 16));
+ if (tables == null) {
+ tables = new ArrayList<String>();
+ locks.put(Long.parseLong(lda[1], 16), tables);
+ }
+
+ tables.add(lda[0].charAt(0) + ":" + tableId);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ pos++;
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.err.println("Failed to read locks for " + tableId + " continuing");
+ }
+ }
+
+ List<Long> transactions = zs.list();
+
+ for (Long tid : transactions) {
+
+ zs.reserve(tid);
+
+ String debug = (String) zs.getProperty(tid, "debug");
+
+ List<String> hlocks = heldLocks.remove(tid);
+ if (hlocks == null)
+ hlocks = Collections.emptyList();
+
+ List<String> wlocks = waitingLocks.remove(tid);
+ if (wlocks == null)
+ wlocks = Collections.emptyList();
+
+ String top = null;
+ Repo<Master> repo = zs.top(tid);
+ if (repo != null)
+ top = repo.getDescription();
+
+ TStatus status = null;
+ status = zs.getStatus(tid);
+
+ zs.unreserve(tid, 0);
+
+ System.out.printf("txid: %016x status: %-18s op: %-15s locked: %-15s locking: %-15s top: %s\n", tid, status, debug, hlocks, wlocks, top);
+ }
+
+ if (heldLocks.size() != 0 || waitingLocks.size() != 0) {
+ System.out.println();
+ System.out.println("The following locks did not have an associated FATE operation");
+ System.out.println();
+ for (Entry<Long,List<String>> entry : heldLocks.entrySet())
+ System.out.printf("txid: %016x locked: %s\n", entry.getKey(), entry.getValue());
+
+ for (Entry<Long,List<String>> entry : waitingLocks.entrySet())
+ System.out.printf("txid: %016x locking: %s\n", entry.getKey(), entry.getValue());
+ }
+ }
+
+ private static void checkMasterLock(Instance instance) {
+ if (ZooLock.getLockData(ZooUtil.getRoot(instance) + Constants.ZMASTER_LOCK) != null) {
+ System.err.println("ERROR: Master lock is held, not running");
+ System.exit(-1);
+ }
+ }
+
+ public static void main(String[] args) throws Exception {
+
+ boolean valid = (args.length == 2 && args[0].matches("fail|delete")) || (args.length == 1 && args[0].equals("print"));
+
+ if (!valid) {
+ System.err.println("Usage : " + Admin.class.getSimpleName() + " fail <txid> | delete <txid> | print");
+ System.exit(-1);
+ }
+
+ Instance instance = HdfsZooInstance.getInstance();
+ String path = ZooUtil.getRoot(instance) + Constants.ZFATE;
+ IZooReaderWriter zk = ZooReaderWriter.getRetryingInstance();
+ ZooStore<Master> zs = new ZooStore<Master>(path, zk);
+
+ if (args[0].equals("fail")) {
+ checkMasterLock(instance);
+
+ long txid = Long.parseLong(args[1], 16);
+ zs.reserve(txid);
+ zs.setStatus(txid, TStatus.FAILED_IN_PROGRESS);
+ zs.unreserve(txid, 0);
+ } else if (args[0].equals("delete")) {
+ checkMasterLock(instance);
+
+ long txid = Long.parseLong(args[1], 16);
+ zs.reserve(txid);
+ zs.delete(txid);
+ zs.unreserve(txid, 0);
+
+ // delete any locks assoc w/ fate operation
+ List<String> lockedTables = zk.getChildren(ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS);
+
+ for (String tableId : lockedTables) {
+ List<String> lockNodes = zk.getChildren(ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS + "/" + tableId);
+ for (String node : lockNodes) {
+ String lockPath = ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS + "/" + tableId + "/" + node;
+ byte[] data = zk.getData(ZooUtil.getRoot(instance) + Constants.ZTABLE_LOCKS + "/" + tableId + "/" + node, null);
+ String lda[] = new String(data).split(":");
+ if (lda[1].equals(args[1]))
+ zk.recursiveDelete(lockPath, NodeMissingPolicy.SKIP);
+ }
+ }
+ } else if (args[0].equals("print")) {
+ print(instance, zk, zs);
+ }
+ }
+
+
+}