# Set in_memory=true and blockcache=true on catalog tables.
# The .META. and -ROOT- tables can be created with caching and
# in_memory set to false.  You want them set to true so that
# these hot tables make it into cache.  To see if the
# .META. table has BLOCKCACHE set, in the shell do the following:
#
#   hbase> scan '-ROOT-'
#
# Look for the 'info' column family.  See if BLOCKCACHE => 'true'? 
# If not, run this script and it will set the value to true.
# Setting cache to 'true' will only take effect on region restart
# of if you close the .META. region -- *disruptive* -- and have
# it deploy elsewhere.  This script runs against an up and running
# hbase instance.
# 
# To see usage for this script, run: 
#
#  ${HBASE_HOME}/bin/hbase org.jruby.Main set_meta_block_caching.rb
#
include Java
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.hbase.HConstants
import org.apache.hadoop.hbase.HRegionInfo
import org.apache.hadoop.hbase.client.HTable
import org.apache.hadoop.hbase.client.Delete
import org.apache.hadoop.hbase.client.Put
import org.apache.hadoop.hbase.client.Scan
import org.apache.hadoop.hbase.HTableDescriptor
import org.apache.hadoop.hbase.HBaseConfiguration
import org.apache.hadoop.hbase.util.FSUtils
import org.apache.hadoop.hbase.util.Writables
import org.apache.hadoop.fs.Path
import org.apache.hadoop.fs.FileSystem
import org.apache.commons.logging.LogFactory

# Name of this script
NAME = "set_meta_block_caching.rb"


# Print usage for this script
def usage
  puts 'Usage: %s.rb]' % NAME
  exit!
end

# Get configuration to use.
c = HBaseConfiguration.new()

# Set hadoop filesystem configuration using the hbase.rootdir.
# Otherwise, we'll always use localhost though the hbase.rootdir
# might be pointing at hdfs location.
c.set("fs.default.name", c.get(HConstants::HBASE_DIR))
fs = FileSystem.get(c)

# Get a logger and a metautils instance.
LOG = LogFactory.getLog(NAME)

# Check arguments
if ARGV.size > 0
  usage
end

# Clean mentions of table from .META.
# Scan the .META. and remove all lines that begin with tablename
metaTable = HTable.new(c, HConstants::ROOT_TABLE_NAME)
scan = Scan.new()
scan.addColumn(HConstants::CATALOG_FAMILY, HConstants::REGIONINFO_QUALIFIER);
scanner = metaTable.getScanner(scan)
while (result = scanner.next())
  rowid = Bytes.toString(result.getRow())
  LOG.info("Setting BLOCKCACHE and IN_MEMORY on: " + rowid);
  hriValue = result.getValue(HConstants::CATALOG_FAMILY, HConstants::REGIONINFO_QUALIFIER)
  hri = Writables.getHRegionInfo(hriValue)
  family = hri.getTableDesc().getFamily(HConstants::CATALOG_FAMILY)
  family.setBlockCacheEnabled(true)
  family.setInMemory(true)
  p = Put.new(result.getRow())
  p.add(HConstants::CATALOG_FAMILY, HConstants::REGIONINFO_QUALIFIER, Writables.getBytes(hri));
  metaTable.put(p)
end
scanner.close()
