ankitsinghal commented on a change in pull request #18: HBASE-22567 - HBCK2 
addMissingRegionsToMeta
URL: 
https://github.com/apache/hbase-operator-tools/pull/18#discussion_r320041123
 
 

 ##########
 File path: hbase-hbck2/src/main/java/org/apache/hbase/HBCK2.java
 ##########
 @@ -161,6 +177,130 @@ int setRegionState(ClusterConnection connection, String 
region,
     return EXIT_FAILURE;
   }
 
+  Map<TableName,List<Path>> reportTablesWithMissingRegionsInMeta(String... 
nameSpaceOrTable)
+      throws IOException {
+    Map<TableName,List<Path>> report;
+    try(final MetaFixer metaFixer = new MetaFixer(this.conf)){
+      List<String> names = nameSpaceOrTable != null ? 
Arrays.asList(nameSpaceOrTable) : null;
+      report = metaFixer.reportTablesMissingRegions(names);
+    } catch (IOException e) {
+      LOG.error("Error reporting missing regions: ", e);
+      throw e;
+    }
+    if(LOG.isDebugEnabled()) {
+      LOG.debug(formatMissingRegionsInMetaReport(report));
+    }
+    return report;
+  }
+
+  List<String> addMissingRegionsInMeta(List<Path> regionsPath) throws 
IOException {
+    List<String> reAddedRegionsEncodedNames = new ArrayList<>();
+    try(final MetaFixer metaFixer = new MetaFixer(this.conf)){
+      for(Path regionPath : regionsPath){
+        metaFixer.putRegionInfoFromHdfsInMeta(regionPath);
+        reAddedRegionsEncodedNames.add(regionPath.getName());
+      }
+    }
+    return reAddedRegionsEncodedNames;
+  }
+
+  Pair<List<String>, List<ExecutionException>> 
addMissingRegionsInMetaForTables(String...
+      nameSpaceOrTable) throws IOException {
+    //TODO next block logic for parsing optional parameters can be moved to 
util method for reuse
+    Options options = new Options();
+    Option disable = Option.builder("d").longOpt("force_disable").build();
+    options.addOption(disable);
+    // Parse command-line.
+    CommandLineParser parser = new DefaultParser();
+    CommandLine commandLine;
+    try {
+      commandLine = parser.parse(options, nameSpaceOrTable, false);
+    } catch (ParseException e) {
+      showErrorMessage(e.getMessage());
+      return null;
+    }
+    boolean enforceDisable = commandLine.hasOption(disable.getOpt());
+    ExecutorService executorService = Executors.newFixedThreadPool(
+      (nameSpaceOrTable == null ||
+        nameSpaceOrTable.length > Runtime.getRuntime().availableProcessors()) ?
+          Runtime.getRuntime().availableProcessors() :
+          nameSpaceOrTable.length);
+    List<Future<List<String>>> futures = new ArrayList<>( nameSpaceOrTable == 
null ? 1 :
+      nameSpaceOrTable.length);
+    final List<String> readdedRegionNames = new ArrayList<>();
+    List<ExecutionException> executionErrors = new ArrayList<>();
+    try {
+      //reducing number of retries in case disable fails due to namespace 
table region also missing
+      this.conf.setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);
+      try(ClusterConnection conn = connect();
+        final Admin admin = conn.getAdmin()) {
+        Map<TableName,List<Path>> report = 
reportTablesWithMissingRegionsInMeta(nameSpaceOrTable);
+        for (TableName tableName : report.keySet()) {
+          if(admin.tableExists(tableName)) {
+            futures.add(executorService.submit(new Callable<List<String>>() {
+              @Override
+              public List<String> call() throws Exception {
+                LOG.debug("running thread for {}", 
tableName.getNameWithNamespaceInclAsString());
+                boolean didDisable = false;
+                try {
+                  admin.disableTable(tableName);
+                  didDisable = true;
+                } catch (IOException e) {
+                  LOG.debug("Failed to disable table {}, "
+                      + "is namespace table also missing regions?",
+                    tableName.getNameWithNamespaceInclAsString(), e);
+                  if (enforceDisable) {
+                    final StringBuilder errorMsgBuilder =
+                        new StringBuilder("Failed re-adding following regions: 
\n\t");
+                    report.get(tableName).forEach( r ->
+                      errorMsgBuilder.append(r.getName()).append("\t"));
+                    throw new IOException(errorMsgBuilder.toString());
+                  } else {
+                    LOG.debug("Continuing anyway, as no force_disable.");
+                  }
+                }
+                List<String> reAddedRegions = 
addMissingRegionsInMeta(report.get(tableName));
+                if(didDisable) {
+                  try {
+                    admin.enableTable(tableName);
 
 Review comment:
   addMissingRegionsInMeta throws IOException, if we fail to write into Meta 
then the table will not be enabled, so can we add "try" to 
addMissingRegionsInMeta and move enableTable step in "finally"? 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to