Revert "HBASE-25368 Filter out more invalid encoded name in isEncodedRegionName(byte...
[hbase.git] / bin / draining_servers.rb
blob99d957e1251a463f486ad537075a2df712f6aee3
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.apache.hadoop.hbase.zookeeper.ZNodePaths
31 java_import org.slf4j.LoggerFactory
33 # Name of this script
34 NAME = 'draining_servers'.freeze
36 # Do command-line parsing
37 options = {}
38 optparse = OptionParser.new do |opts|
39   opts.banner = "Usage: ./hbase org.jruby.Main #{NAME}.rb [options] add|remove|list <hostname>|<host:port>|<servername> ..."
40   opts.separator 'Add remove or list servers in draining mode. Can accept either hostname to drain all region servers' \
41                  'in that host, a host:port pair or a host,port,startCode triplet. More than one server can be given separated by space'
42   opts.on('-h', '--help', 'Display usage information') do
43     puts opts
44     exit
45   end
46 end
47 optparse.parse!
49 # Return array of servernames where servername is hostname+port+startcode
50 # comma-delimited
51 def getServers(admin)
52   serverInfos = admin.getClusterMetrics.getLiveServerMetrics.keySet
53   servers = []
54   serverInfos.each do |server|
55     servers << server.getServerName
56   end
57   servers
58 end
60 # rubocop:disable Metrics/AbcSize
61 def getServerNames(hostOrServers, config)
62   ret = []
63   connection = ConnectionFactory.createConnection(config)
65   hostOrServers.each do |host_or_server|
66     # check whether it is already serverName. No need to connect to cluster
67     parts = host_or_server.split(',')
68     if parts.size == 3
69       ret << host_or_server
70     else
71       admin ||= connection.getAdmin
72       servers = getServers(admin)
74       host_or_server = host_or_server.tr(':', ',')
75       servers.each do |server|
76         ret << server if server.start_with?(host_or_server)
77       end
78     end
79   end
81   admin.close if admin
82   connection.close
83   ret
84 end
86 def addServers(_options, hostOrServers)
87   config = HBaseConfiguration.create
88   servers = getServerNames(hostOrServers, config)
90   zkw = org.apache.hadoop.hbase.zookeeper.ZKWatcher.new(config, 'draining_servers', nil)
92   begin
93     parentZnode = zkw.getZNodePaths.drainingZNode
94     servers.each do |server|
95       node = ZNodePaths.joinZNode(parentZnode, server)
96       ZKUtil.createAndFailSilent(zkw, node)
97     end
98   ensure
99     zkw.close
100   end
103 def removeServers(_options, hostOrServers)
104   config = HBaseConfiguration.create
105   servers = getServerNames(hostOrServers, config)
107   zkw = org.apache.hadoop.hbase.zookeeper.ZKWatcher.new(config, 'draining_servers', nil)
109   begin
110     parentZnode = zkw.getZNodePaths.drainingZNode
111     servers.each do |server|
112       node = ZNodePaths.joinZNode(parentZnode, server)
113       ZKUtil.deleteNodeFailSilent(zkw, node)
114     end
115   ensure
116     zkw.close
117   end
119 # rubocop:enable Metrics/AbcSize
121 # list servers in draining mode
122 def listServers(_options)
123   config = HBaseConfiguration.create
125   zkw = org.apache.hadoop.hbase.zookeeper.ZKWatcher.new(config, 'draining_servers', nil)
127   begin
128     parentZnode = zkw.getZNodePaths.drainingZNode
129     servers = ZKUtil.listChildrenNoWatch(zkw, parentZnode)
130     servers.each { |server| puts server }
131   ensure
132     zkw.close
133   end
136 hostOrServers = ARGV[1..ARGV.size]
138 # Create a logger and save it to ruby global
139 $LOG = LoggerFactory.getLogger(NAME)
140 case ARGV[0]
141 when 'add'
142   if ARGV.length < 2
143     puts optparse
144     exit 1
145   end
146   addServers(options, hostOrServers)
147 when 'remove'
148   if ARGV.length < 2
149     puts optparse
150     exit 1
151   end
152   removeServers(options, hostOrServers)
153 when 'list'
154   listServers(options)
155 else
156   puts optparse
157   exit 3