HBASE-20467 Precommit personality should only run checkstyle once if we're going...
[hbase.git] / bin / draining_servers.rb
blob0d29c19e49e24ab9fde53c35871a8618d54113f5
2 # Licensed to the Apache Software Foundation (ASF) under one
3 # or more contributor license agreements.  See the NOTICE file
4 # distributed with this work for additional information
5 # regarding copyright ownership.  The ASF licenses this file
6 # to you under the Apache License, Version 2.0 (the
7 # "License"); you may not use this file except in compliance
8 # with the License.  You may obtain a copy of the License at
10 #     http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
19 # Add or remove servers from draining mode via zookeeper
20 # Deprecated in 2.0, and will be removed in 3.0. Use Admin decommission
21 # API instead.
23 require 'optparse'
24 include Java
26 java_import org.apache.hadoop.hbase.HBaseConfiguration
27 java_import org.apache.hadoop.hbase.client.ConnectionFactory
28 java_import org.apache.hadoop.hbase.client.HBaseAdmin
29 java_import org.apache.hadoop.hbase.zookeeper.ZKUtil
30 java_import org.slf4j.LoggerFactory
32 # Name of this script
33 NAME = 'draining_servers'.freeze
35 # Do command-line parsing
36 options = {}
37 optparse = OptionParser.new do |opts|
38   opts.banner = "Usage: ./hbase org.jruby.Main #{NAME}.rb [options] add|remove|list <hostname>|<host:port>|<servername> ..."
39   opts.separator 'Add remove or list servers in draining mode. Can accept either hostname to drain all region servers' \
40                  'in that host, a host:port pair or a host,port,startCode triplet. More than one server can be given separated by space'
41   opts.on('-h', '--help', 'Display usage information') do
42     puts opts
43     exit
44   end
45 end
46 optparse.parse!
48 # Return array of servernames where servername is hostname+port+startcode
49 # comma-delimited
50 def getServers(admin)
51   serverInfos = admin.getClusterStatus.getServers
52   servers = []
53   for server in serverInfos
54     servers << server.getServerName
55   end
56   servers
57 end
59 def getServerNames(hostOrServers, config)
60   ret = []
61   connection = ConnectionFactory.createConnection(config)
63   for hostOrServer in hostOrServers
64     # check whether it is already serverName. No need to connect to cluster
65     parts = hostOrServer.split(',')
66     if parts.size == 3
67       ret << hostOrServer
68     else
69       admin = connection.getAdmin unless admin
70       servers = getServers(admin)
72       hostOrServer = hostOrServer.tr(':', ',')
73       for server in servers
74         ret << server if server.start_with?(hostOrServer)
75       end
76     end
77   end
79   admin.close if admin
80   connection.close
81   ret
82 end
84 def addServers(_options, hostOrServers)
85   config = HBaseConfiguration.create
86   servers = getServerNames(hostOrServers, config)
88   zkw = org.apache.hadoop.hbase.zookeeper.ZKWatcher.new(config, 'draining_servers', nil)
89   parentZnode = zkw.znodePaths.drainingZNode
91   begin
92     for server in servers
93       node = ZKUtil.joinZNode(parentZnode, server)
94       ZKUtil.createAndFailSilent(zkw, node)
95     end
96   ensure
97     zkw.close
98   end
99 end
101 def removeServers(_options, hostOrServers)
102   config = HBaseConfiguration.create
103   servers = getServerNames(hostOrServers, config)
105   zkw = org.apache.hadoop.hbase.zookeeper.ZKWatcher.new(config, 'draining_servers', nil)
106   parentZnode = zkw.znodePaths.drainingZNode
108   begin
109     for server in servers
110       node = ZKUtil.joinZNode(parentZnode, server)
111       ZKUtil.deleteNodeFailSilent(zkw, node)
112     end
113   ensure
114     zkw.close
115   end
118 # list servers in draining mode
119 def listServers(_options)
120   config = HBaseConfiguration.create
122   zkw = org.apache.hadoop.hbase.zookeeper.ZKWatcher.new(config, 'draining_servers', nil)
123   parentZnode = zkw.znodePaths.drainingZNode
125   servers = ZKUtil.listChildrenNoWatch(zkw, parentZnode)
126   servers.each { |server| puts server }
129 hostOrServers = ARGV[1..ARGV.size]
131 # Create a logger and save it to ruby global
132 $LOG = LoggerFactory.getLogger(NAME)
133 case ARGV[0]
134 when 'add'
135   if ARGV.length < 2
136     puts optparse
137     exit 1
138   end
139   addServers(options, hostOrServers)
140 when 'remove'
141   if ARGV.length < 2
142     puts optparse
143     exit 1
144   end
145   removeServers(options, hostOrServers)
146 when 'list'
147   listServers(options)
148 else
149   puts optparse
150   exit 3