diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java index 4f89467..0971f21 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Admin.java @@ -702,6 +702,16 @@ public interface Admin extends Abortable, Closeable { boolean balancer() throws IOException; /** + * Invoke the balancer. Will run the balancer and if regions to move, it will + * go ahead and do the reassignments. If there is region in transition, force parameter of true + * would still run balancer. Can *not* run for other reasons. Check + * logs. + * @param force whether we should force balance even if there is region in transition + * @return True if balancer ran, false otherwise. + */ + boolean balancer(boolean force) throws IOException; + + /** * Query the current state of the balancer * * @return true if the balancer is enabled, false otherwise. diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index 5a0def3..3670415 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -2199,7 +2199,17 @@ public class HBaseAdmin implements Admin { return executeCallable(new MasterCallable(getConnection()) { @Override public Boolean call(int callTimeout) throws ServiceException { - return master.balance(null, RequestConverter.buildBalanceRequest()).getBalancerRan(); + return master.balance(null, RequestConverter.buildBalanceRequest(false)).getBalancerRan(); + } + }); + } + + @Override + public boolean balancer(final boolean force) throws IOException { + return executeCallable(new MasterCallable(getConnection()) { + @Override + public Boolean call(int callTimeout) throws ServiceException { + return master.balance(null, RequestConverter.buildBalanceRequest(force)).getBalancerRan(); } }); } diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java index 6f726fe..c1eb691 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/RequestConverter.java @@ -1341,8 +1341,8 @@ public final class RequestConverter { * * @return a BalanceRequest */ - public static BalanceRequest buildBalanceRequest() { - return BalanceRequest.newBuilder().build(); + public static BalanceRequest buildBalanceRequest(boolean force) { + return BalanceRequest.newBuilder().setForce(force).build(); } /** diff --git a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java index efa6a18..9e670fa 100644 --- a/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java +++ b/hbase-protocol/src/main/java/org/apache/hadoop/hbase/protobuf/generated/MasterProtos.java @@ -23216,6 +23216,16 @@ public final class MasterProtos { public interface BalanceRequestOrBuilder extends com.google.protobuf.MessageOrBuilder { + + // optional bool force = 1; + /** + * optional bool force = 1; + */ + boolean hasForce(); + /** + * optional bool force = 1; + */ + boolean getForce(); } /** * Protobuf type {@code BalanceRequest} @@ -23250,6 +23260,7 @@ public final class MasterProtos { com.google.protobuf.ExtensionRegistryLite extensionRegistry) throws com.google.protobuf.InvalidProtocolBufferException { initFields(); + int mutable_bitField0_ = 0; com.google.protobuf.UnknownFieldSet.Builder unknownFields = com.google.protobuf.UnknownFieldSet.newBuilder(); try { @@ -23267,6 +23278,11 @@ public final class MasterProtos { } break; } + case 8: { + bitField0_ |= 0x00000001; + force_ = input.readBool(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -23306,7 +23322,25 @@ public final class MasterProtos { return PARSER; } + private int bitField0_; + // optional bool force = 1; + public static final int FORCE_FIELD_NUMBER = 1; + private boolean force_; + /** + * optional bool force = 1; + */ + public boolean hasForce() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bool force = 1; + */ + public boolean getForce() { + return force_; + } + private void initFields() { + force_ = false; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -23320,6 +23354,9 @@ public final class MasterProtos { public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { getSerializedSize(); + if (((bitField0_ & 0x00000001) == 0x00000001)) { + output.writeBool(1, force_); + } getUnknownFields().writeTo(output); } @@ -23329,6 +23366,10 @@ public final class MasterProtos { if (size != -1) return size; size = 0; + if (((bitField0_ & 0x00000001) == 0x00000001)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(1, force_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -23352,6 +23393,11 @@ public final class MasterProtos { org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest other = (org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest) obj; boolean result = true; + result = result && (hasForce() == other.hasForce()); + if (hasForce()) { + result = result && (getForce() + == other.getForce()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -23365,6 +23411,10 @@ public final class MasterProtos { } int hash = 41; hash = (19 * hash) + getDescriptorForType().hashCode(); + if (hasForce()) { + hash = (37 * hash) + FORCE_FIELD_NUMBER; + hash = (53 * hash) + hashBoolean(getForce()); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -23474,6 +23524,8 @@ public final class MasterProtos { public Builder clear() { super.clear(); + force_ = false; + bitField0_ = (bitField0_ & ~0x00000001); return this; } @@ -23500,6 +23552,13 @@ public final class MasterProtos { public org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest buildPartial() { org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest result = new org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest(this); + int from_bitField0_ = bitField0_; + int to_bitField0_ = 0; + if (((from_bitField0_ & 0x00000001) == 0x00000001)) { + to_bitField0_ |= 0x00000001; + } + result.force_ = force_; + result.bitField0_ = to_bitField0_; onBuilt(); return result; } @@ -23515,6 +23574,9 @@ public final class MasterProtos { public Builder mergeFrom(org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest other) { if (other == org.apache.hadoop.hbase.protobuf.generated.MasterProtos.BalanceRequest.getDefaultInstance()) return this; + if (other.hasForce()) { + setForce(other.getForce()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -23540,6 +23602,40 @@ public final class MasterProtos { } return this; } + private int bitField0_; + + // optional bool force = 1; + private boolean force_ ; + /** + * optional bool force = 1; + */ + public boolean hasForce() { + return ((bitField0_ & 0x00000001) == 0x00000001); + } + /** + * optional bool force = 1; + */ + public boolean getForce() { + return force_; + } + /** + * optional bool force = 1; + */ + public Builder setForce(boolean value) { + bitField0_ |= 0x00000001; + force_ = value; + onChanged(); + return this; + } + /** + * optional bool force = 1; + */ + public Builder clearForce() { + bitField0_ = (bitField0_ & ~0x00000001); + force_ = false; + onChanged(); + return this; + } // @@protoc_insertion_point(builder_scope:BalanceRequest) } @@ -51969,168 +52065,168 @@ public final class MasterProtos { "e\030\001 \002(\t\"B\n!ListTableNamesByNamespaceResp", "onse\022\035\n\ttableName\030\001 \003(\0132\n.TableName\"\021\n\017S" + "hutdownRequest\"\022\n\020ShutdownResponse\"\023\n\021St" + - "opMasterRequest\"\024\n\022StopMasterResponse\"\020\n" + - "\016BalanceRequest\"\'\n\017BalanceResponse\022\024\n\014ba" + - "lancer_ran\030\001 \002(\010\"<\n\031SetBalancerRunningRe" + - "quest\022\n\n\002on\030\001 \002(\010\022\023\n\013synchronous\030\002 \001(\010\"8" + - "\n\032SetBalancerRunningResponse\022\032\n\022prev_bal" + - "ance_value\030\001 \001(\010\"\032\n\030IsBalancerEnabledReq" + - "uest\",\n\031IsBalancerEnabledResponse\022\017\n\007ena" + - "bled\030\001 \002(\010\"\027\n\025RunCatalogScanRequest\"-\n\026R", - "unCatalogScanResponse\022\023\n\013scan_result\030\001 \001" + - "(\005\"-\n\033EnableCatalogJanitorRequest\022\016\n\006ena" + - "ble\030\001 \002(\010\"2\n\034EnableCatalogJanitorRespons" + - "e\022\022\n\nprev_value\030\001 \001(\010\" \n\036IsCatalogJanito" + - "rEnabledRequest\"0\n\037IsCatalogJanitorEnabl" + - "edResponse\022\r\n\005value\030\001 \002(\010\"9\n\017SnapshotReq" + - "uest\022&\n\010snapshot\030\001 \002(\0132\024.SnapshotDescrip" + - "tion\",\n\020SnapshotResponse\022\030\n\020expected_tim" + - "eout\030\001 \002(\003\"\036\n\034GetCompletedSnapshotsReque" + - "st\"H\n\035GetCompletedSnapshotsResponse\022\'\n\ts", - "napshots\030\001 \003(\0132\024.SnapshotDescription\"?\n\025" + - "DeleteSnapshotRequest\022&\n\010snapshot\030\001 \002(\0132" + - "\024.SnapshotDescription\"\030\n\026DeleteSnapshotR" + - "esponse\"@\n\026RestoreSnapshotRequest\022&\n\010sna" + - "pshot\030\001 \002(\0132\024.SnapshotDescription\"\031\n\027Res" + - "toreSnapshotResponse\"?\n\025IsSnapshotDoneRe" + - "quest\022&\n\010snapshot\030\001 \001(\0132\024.SnapshotDescri" + - "ption\"U\n\026IsSnapshotDoneResponse\022\023\n\004done\030" + - "\001 \001(\010:\005false\022&\n\010snapshot\030\002 \001(\0132\024.Snapsho" + - "tDescription\"F\n\034IsRestoreSnapshotDoneReq", - "uest\022&\n\010snapshot\030\001 \001(\0132\024.SnapshotDescrip" + - "tion\"4\n\035IsRestoreSnapshotDoneResponse\022\023\n" + - "\004done\030\001 \001(\010:\005false\"=\n\033GetSchemaAlterStat" + - "usRequest\022\036\n\ntable_name\030\001 \002(\0132\n.TableNam" + - "e\"T\n\034GetSchemaAlterStatusResponse\022\035\n\025yet" + - "_to_update_regions\030\001 \001(\r\022\025\n\rtotal_region" + - "s\030\002 \001(\r\"\202\001\n\032GetTableDescriptorsRequest\022\037" + - "\n\013table_names\030\001 \003(\0132\n.TableName\022\r\n\005regex" + - "\030\002 \001(\t\022!\n\022include_sys_tables\030\003 \001(\010:\005fals" + - "e\022\021\n\tnamespace\030\004 \001(\t\"A\n\033GetTableDescript", - "orsResponse\022\"\n\014table_schema\030\001 \003(\0132\014.Tabl" + - "eSchema\"[\n\024GetTableNamesRequest\022\r\n\005regex" + - "\030\001 \001(\t\022!\n\022include_sys_tables\030\002 \001(\010:\005fals" + - "e\022\021\n\tnamespace\030\003 \001(\t\"8\n\025GetTableNamesRes" + - "ponse\022\037\n\013table_names\030\001 \003(\0132\n.TableName\"\031" + - "\n\027GetClusterStatusRequest\"B\n\030GetClusterS" + - "tatusResponse\022&\n\016cluster_status\030\001 \002(\0132\016." + - "ClusterStatus\"\030\n\026IsMasterRunningRequest\"" + - "4\n\027IsMasterRunningResponse\022\031\n\021is_master_" + - "running\030\001 \002(\010\"@\n\024ExecProcedureRequest\022(\n", - "\tprocedure\030\001 \002(\0132\025.ProcedureDescription\"" + - "F\n\025ExecProcedureResponse\022\030\n\020expected_tim" + - "eout\030\001 \001(\003\022\023\n\013return_data\030\002 \001(\014\"B\n\026IsPro" + - "cedureDoneRequest\022(\n\tprocedure\030\001 \001(\0132\025.P" + - "rocedureDescription\"W\n\027IsProcedureDoneRe" + - "sponse\022\023\n\004done\030\001 \001(\010:\005false\022\'\n\010snapshot\030" + - "\002 \001(\0132\025.ProcedureDescription\",\n\031GetProce" + - "dureResultRequest\022\017\n\007proc_id\030\001 \002(\004\"\347\001\n\032G" + - "etProcedureResultResponse\0220\n\005state\030\001 \002(\016" + - "2!.GetProcedureResultResponse.State\022\022\n\ns", - "tart_time\030\002 \001(\004\022\023\n\013last_update\030\003 \001(\004\022\016\n\006" + - "result\030\004 \001(\014\022+\n\texception\030\005 \001(\0132\030.Foreig" + - "nExceptionMessage\"1\n\005State\022\r\n\tNOT_FOUND\020" + - "\000\022\013\n\007RUNNING\020\001\022\014\n\010FINISHED\020\002\"\273\001\n\017SetQuot" + - "aRequest\022\021\n\tuser_name\030\001 \001(\t\022\022\n\nuser_grou" + - "p\030\002 \001(\t\022\021\n\tnamespace\030\003 \001(\t\022\036\n\ntable_name" + - "\030\004 \001(\0132\n.TableName\022\022\n\nremove_all\030\005 \001(\010\022\026" + - "\n\016bypass_globals\030\006 \001(\010\022\"\n\010throttle\030\007 \001(\013" + - "2\020.ThrottleRequest\"\022\n\020SetQuotaResponse\"A" + - "\n\037MajorCompactionTimestampRequest\022\036\n\ntab", - "le_name\030\001 \002(\0132\n.TableName\"L\n(MajorCompac" + - "tionTimestampForRegionRequest\022 \n\006region\030" + - "\001 \002(\0132\020.RegionSpecifier\"@\n MajorCompacti" + - "onTimestampResponse\022\034\n\024compaction_timest" + - "amp\030\001 \002(\0032\243\033\n\rMasterService\022S\n\024GetSchema" + - "AlterStatus\022\034.GetSchemaAlterStatusReques" + - "t\032\035.GetSchemaAlterStatusResponse\022P\n\023GetT" + - "ableDescriptors\022\033.GetTableDescriptorsReq" + - "uest\032\034.GetTableDescriptorsResponse\022>\n\rGe" + - "tTableNames\022\025.GetTableNamesRequest\032\026.Get", - "TableNamesResponse\022G\n\020GetClusterStatus\022\030" + - ".GetClusterStatusRequest\032\031.GetClusterSta" + - "tusResponse\022D\n\017IsMasterRunning\022\027.IsMaste" + - "rRunningRequest\032\030.IsMasterRunningRespons" + - "e\0222\n\tAddColumn\022\021.AddColumnRequest\032\022.AddC" + - "olumnResponse\022;\n\014DeleteColumn\022\024.DeleteCo" + - "lumnRequest\032\025.DeleteColumnResponse\022;\n\014Mo" + - "difyColumn\022\024.ModifyColumnRequest\032\025.Modif" + - "yColumnResponse\0225\n\nMoveRegion\022\022.MoveRegi" + - "onRequest\032\023.MoveRegionResponse\022Y\n\026Dispat", - "chMergingRegions\022\036.DispatchMergingRegion" + - "sRequest\032\037.DispatchMergingRegionsRespons" + - "e\022;\n\014AssignRegion\022\024.AssignRegionRequest\032" + - "\025.AssignRegionResponse\022A\n\016UnassignRegion" + - "\022\026.UnassignRegionRequest\032\027.UnassignRegio" + - "nResponse\022>\n\rOfflineRegion\022\025.OfflineRegi" + - "onRequest\032\026.OfflineRegionResponse\0228\n\013Del" + - "eteTable\022\023.DeleteTableRequest\032\024.DeleteTa" + - "bleResponse\022>\n\rtruncateTable\022\025.TruncateT" + - "ableRequest\032\026.TruncateTableResponse\0228\n\013E", - "nableTable\022\023.EnableTableRequest\032\024.Enable" + - "TableResponse\022;\n\014DisableTable\022\024.DisableT" + - "ableRequest\032\025.DisableTableResponse\0228\n\013Mo" + - "difyTable\022\023.ModifyTableRequest\032\024.ModifyT" + - "ableResponse\0228\n\013CreateTable\022\023.CreateTabl" + - "eRequest\032\024.CreateTableResponse\022/\n\010Shutdo" + - "wn\022\020.ShutdownRequest\032\021.ShutdownResponse\022" + - "5\n\nStopMaster\022\022.StopMasterRequest\032\023.Stop" + - "MasterResponse\022,\n\007Balance\022\017.BalanceReque" + - "st\032\020.BalanceResponse\022M\n\022SetBalancerRunni", - "ng\022\032.SetBalancerRunningRequest\032\033.SetBala" + - "ncerRunningResponse\022J\n\021IsBalancerEnabled" + - "\022\031.IsBalancerEnabledRequest\032\032.IsBalancer" + - "EnabledResponse\022A\n\016RunCatalogScan\022\026.RunC" + - "atalogScanRequest\032\027.RunCatalogScanRespon" + - "se\022S\n\024EnableCatalogJanitor\022\034.EnableCatal" + - "ogJanitorRequest\032\035.EnableCatalogJanitorR" + - "esponse\022\\\n\027IsCatalogJanitorEnabled\022\037.IsC" + - "atalogJanitorEnabledRequest\032 .IsCatalogJ" + - "anitorEnabledResponse\022L\n\021ExecMasterServi", - "ce\022\032.CoprocessorServiceRequest\032\033.Coproce" + - "ssorServiceResponse\022/\n\010Snapshot\022\020.Snapsh" + - "otRequest\032\021.SnapshotResponse\022V\n\025GetCompl" + - "etedSnapshots\022\035.GetCompletedSnapshotsReq" + - "uest\032\036.GetCompletedSnapshotsResponse\022A\n\016" + - "DeleteSnapshot\022\026.DeleteSnapshotRequest\032\027" + - ".DeleteSnapshotResponse\022A\n\016IsSnapshotDon" + - "e\022\026.IsSnapshotDoneRequest\032\027.IsSnapshotDo" + - "neResponse\022D\n\017RestoreSnapshot\022\027.RestoreS" + - "napshotRequest\032\030.RestoreSnapshotResponse", - "\022V\n\025IsRestoreSnapshotDone\022\035.IsRestoreSna" + - "pshotDoneRequest\032\036.IsRestoreSnapshotDone" + - "Response\022>\n\rExecProcedure\022\025.ExecProcedur" + - "eRequest\032\026.ExecProcedureResponse\022E\n\024Exec" + - "ProcedureWithRet\022\025.ExecProcedureRequest\032" + - "\026.ExecProcedureResponse\022D\n\017IsProcedureDo" + - "ne\022\027.IsProcedureDoneRequest\032\030.IsProcedur" + - "eDoneResponse\022D\n\017ModifyNamespace\022\027.Modif" + - "yNamespaceRequest\032\030.ModifyNamespaceRespo" + - "nse\022D\n\017CreateNamespace\022\027.CreateNamespace", - "Request\032\030.CreateNamespaceResponse\022D\n\017Del" + - "eteNamespace\022\027.DeleteNamespaceRequest\032\030." + - "DeleteNamespaceResponse\022Y\n\026GetNamespaceD" + - "escriptor\022\036.GetNamespaceDescriptorReques" + - "t\032\037.GetNamespaceDescriptorResponse\022_\n\030Li" + - "stNamespaceDescriptors\022 .ListNamespaceDe" + - "scriptorsRequest\032!.ListNamespaceDescript" + - "orsResponse\022t\n\037ListTableDescriptorsByNam" + - "espace\022\'.ListTableDescriptorsByNamespace" + - "Request\032(.ListTableDescriptorsByNamespac", - "eResponse\022b\n\031ListTableNamesByNamespace\022!" + - ".ListTableNamesByNamespaceRequest\032\".List" + - "TableNamesByNamespaceResponse\022/\n\010SetQuot" + - "a\022\020.SetQuotaRequest\032\021.SetQuotaResponse\022f" + - "\n\037getLastMajorCompactionTimestamp\022 .Majo" + - "rCompactionTimestampRequest\032!.MajorCompa" + - "ctionTimestampResponse\022x\n(getLastMajorCo" + - "mpactionTimestampForRegion\022).MajorCompac" + - "tionTimestampForRegionRequest\032!.MajorCom" + - "pactionTimestampResponse\022M\n\022getProcedure", - "Result\022\032.GetProcedureResultRequest\032\033.Get" + - "ProcedureResultResponseBB\n*org.apache.ha" + - "doop.hbase.protobuf.generatedB\014MasterPro" + - "tosH\001\210\001\001\240\001\001" + "opMasterRequest\"\024\n\022StopMasterResponse\"\037\n" + + "\016BalanceRequest\022\r\n\005force\030\001 \001(\010\"\'\n\017Balanc" + + "eResponse\022\024\n\014balancer_ran\030\001 \002(\010\"<\n\031SetBa" + + "lancerRunningRequest\022\n\n\002on\030\001 \002(\010\022\023\n\013sync" + + "hronous\030\002 \001(\010\"8\n\032SetBalancerRunningRespo" + + "nse\022\032\n\022prev_balance_value\030\001 \001(\010\"\032\n\030IsBal" + + "ancerEnabledRequest\",\n\031IsBalancerEnabled" + + "Response\022\017\n\007enabled\030\001 \002(\010\"\027\n\025RunCatalogS", + "canRequest\"-\n\026RunCatalogScanResponse\022\023\n\013" + + "scan_result\030\001 \001(\005\"-\n\033EnableCatalogJanito" + + "rRequest\022\016\n\006enable\030\001 \002(\010\"2\n\034EnableCatalo" + + "gJanitorResponse\022\022\n\nprev_value\030\001 \001(\010\" \n\036" + + "IsCatalogJanitorEnabledRequest\"0\n\037IsCata" + + "logJanitorEnabledResponse\022\r\n\005value\030\001 \002(\010" + + "\"9\n\017SnapshotRequest\022&\n\010snapshot\030\001 \002(\0132\024." + + "SnapshotDescription\",\n\020SnapshotResponse\022" + + "\030\n\020expected_timeout\030\001 \002(\003\"\036\n\034GetComplete" + + "dSnapshotsRequest\"H\n\035GetCompletedSnapsho", + "tsResponse\022\'\n\tsnapshots\030\001 \003(\0132\024.Snapshot" + + "Description\"?\n\025DeleteSnapshotRequest\022&\n\010" + + "snapshot\030\001 \002(\0132\024.SnapshotDescription\"\030\n\026" + + "DeleteSnapshotResponse\"@\n\026RestoreSnapsho" + + "tRequest\022&\n\010snapshot\030\001 \002(\0132\024.SnapshotDes" + + "cription\"\031\n\027RestoreSnapshotResponse\"?\n\025I" + + "sSnapshotDoneRequest\022&\n\010snapshot\030\001 \001(\0132\024" + + ".SnapshotDescription\"U\n\026IsSnapshotDoneRe" + + "sponse\022\023\n\004done\030\001 \001(\010:\005false\022&\n\010snapshot\030" + + "\002 \001(\0132\024.SnapshotDescription\"F\n\034IsRestore", + "SnapshotDoneRequest\022&\n\010snapshot\030\001 \001(\0132\024." + + "SnapshotDescription\"4\n\035IsRestoreSnapshot" + + "DoneResponse\022\023\n\004done\030\001 \001(\010:\005false\"=\n\033Get" + + "SchemaAlterStatusRequest\022\036\n\ntable_name\030\001" + + " \002(\0132\n.TableName\"T\n\034GetSchemaAlterStatus" + + "Response\022\035\n\025yet_to_update_regions\030\001 \001(\r\022" + + "\025\n\rtotal_regions\030\002 \001(\r\"\202\001\n\032GetTableDescr" + + "iptorsRequest\022\037\n\013table_names\030\001 \003(\0132\n.Tab" + + "leName\022\r\n\005regex\030\002 \001(\t\022!\n\022include_sys_tab" + + "les\030\003 \001(\010:\005false\022\021\n\tnamespace\030\004 \001(\t\"A\n\033G", + "etTableDescriptorsResponse\022\"\n\014table_sche" + + "ma\030\001 \003(\0132\014.TableSchema\"[\n\024GetTableNamesR" + + "equest\022\r\n\005regex\030\001 \001(\t\022!\n\022include_sys_tab" + + "les\030\002 \001(\010:\005false\022\021\n\tnamespace\030\003 \001(\t\"8\n\025G" + + "etTableNamesResponse\022\037\n\013table_names\030\001 \003(" + + "\0132\n.TableName\"\031\n\027GetClusterStatusRequest" + + "\"B\n\030GetClusterStatusResponse\022&\n\016cluster_" + + "status\030\001 \002(\0132\016.ClusterStatus\"\030\n\026IsMaster" + + "RunningRequest\"4\n\027IsMasterRunningRespons" + + "e\022\031\n\021is_master_running\030\001 \002(\010\"@\n\024ExecProc", + "edureRequest\022(\n\tprocedure\030\001 \002(\0132\025.Proced" + + "ureDescription\"F\n\025ExecProcedureResponse\022" + + "\030\n\020expected_timeout\030\001 \001(\003\022\023\n\013return_data" + + "\030\002 \001(\014\"B\n\026IsProcedureDoneRequest\022(\n\tproc" + + "edure\030\001 \001(\0132\025.ProcedureDescription\"W\n\027Is" + + "ProcedureDoneResponse\022\023\n\004done\030\001 \001(\010:\005fal" + + "se\022\'\n\010snapshot\030\002 \001(\0132\025.ProcedureDescript" + + "ion\",\n\031GetProcedureResultRequest\022\017\n\007proc" + + "_id\030\001 \002(\004\"\347\001\n\032GetProcedureResultResponse" + + "\0220\n\005state\030\001 \002(\0162!.GetProcedureResultResp", + "onse.State\022\022\n\nstart_time\030\002 \001(\004\022\023\n\013last_u" + + "pdate\030\003 \001(\004\022\016\n\006result\030\004 \001(\014\022+\n\texception" + + "\030\005 \001(\0132\030.ForeignExceptionMessage\"1\n\005Stat" + + "e\022\r\n\tNOT_FOUND\020\000\022\013\n\007RUNNING\020\001\022\014\n\010FINISHE" + + "D\020\002\"\273\001\n\017SetQuotaRequest\022\021\n\tuser_name\030\001 \001" + + "(\t\022\022\n\nuser_group\030\002 \001(\t\022\021\n\tnamespace\030\003 \001(" + + "\t\022\036\n\ntable_name\030\004 \001(\0132\n.TableName\022\022\n\nrem" + + "ove_all\030\005 \001(\010\022\026\n\016bypass_globals\030\006 \001(\010\022\"\n" + + "\010throttle\030\007 \001(\0132\020.ThrottleRequest\"\022\n\020Set" + + "QuotaResponse\"A\n\037MajorCompactionTimestam", + "pRequest\022\036\n\ntable_name\030\001 \002(\0132\n.TableName" + + "\"L\n(MajorCompactionTimestampForRegionReq" + + "uest\022 \n\006region\030\001 \002(\0132\020.RegionSpecifier\"@" + + "\n MajorCompactionTimestampResponse\022\034\n\024co" + + "mpaction_timestamp\030\001 \002(\0032\243\033\n\rMasterServi" + + "ce\022S\n\024GetSchemaAlterStatus\022\034.GetSchemaAl" + + "terStatusRequest\032\035.GetSchemaAlterStatusR" + + "esponse\022P\n\023GetTableDescriptors\022\033.GetTabl" + + "eDescriptorsRequest\032\034.GetTableDescriptor" + + "sResponse\022>\n\rGetTableNames\022\025.GetTableNam", + "esRequest\032\026.GetTableNamesResponse\022G\n\020Get" + + "ClusterStatus\022\030.GetClusterStatusRequest\032" + + "\031.GetClusterStatusResponse\022D\n\017IsMasterRu" + + "nning\022\027.IsMasterRunningRequest\032\030.IsMaste" + + "rRunningResponse\0222\n\tAddColumn\022\021.AddColum" + + "nRequest\032\022.AddColumnResponse\022;\n\014DeleteCo" + + "lumn\022\024.DeleteColumnRequest\032\025.DeleteColum" + + "nResponse\022;\n\014ModifyColumn\022\024.ModifyColumn" + + "Request\032\025.ModifyColumnResponse\0225\n\nMoveRe" + + "gion\022\022.MoveRegionRequest\032\023.MoveRegionRes", + "ponse\022Y\n\026DispatchMergingRegions\022\036.Dispat" + + "chMergingRegionsRequest\032\037.DispatchMergin" + + "gRegionsResponse\022;\n\014AssignRegion\022\024.Assig" + + "nRegionRequest\032\025.AssignRegionResponse\022A\n" + + "\016UnassignRegion\022\026.UnassignRegionRequest\032" + + "\027.UnassignRegionResponse\022>\n\rOfflineRegio" + + "n\022\025.OfflineRegionRequest\032\026.OfflineRegion" + + "Response\0228\n\013DeleteTable\022\023.DeleteTableReq" + + "uest\032\024.DeleteTableResponse\022>\n\rtruncateTa" + + "ble\022\025.TruncateTableRequest\032\026.TruncateTab", + "leResponse\0228\n\013EnableTable\022\023.EnableTableR" + + "equest\032\024.EnableTableResponse\022;\n\014DisableT" + + "able\022\024.DisableTableRequest\032\025.DisableTabl" + + "eResponse\0228\n\013ModifyTable\022\023.ModifyTableRe" + + "quest\032\024.ModifyTableResponse\0228\n\013CreateTab" + + "le\022\023.CreateTableRequest\032\024.CreateTableRes" + + "ponse\022/\n\010Shutdown\022\020.ShutdownRequest\032\021.Sh" + + "utdownResponse\0225\n\nStopMaster\022\022.StopMaste" + + "rRequest\032\023.StopMasterResponse\022,\n\007Balance" + + "\022\017.BalanceRequest\032\020.BalanceResponse\022M\n\022S", + "etBalancerRunning\022\032.SetBalancerRunningRe" + + "quest\032\033.SetBalancerRunningResponse\022J\n\021Is" + + "BalancerEnabled\022\031.IsBalancerEnabledReque" + + "st\032\032.IsBalancerEnabledResponse\022A\n\016RunCat" + + "alogScan\022\026.RunCatalogScanRequest\032\027.RunCa" + + "talogScanResponse\022S\n\024EnableCatalogJanito" + + "r\022\034.EnableCatalogJanitorRequest\032\035.Enable" + + "CatalogJanitorResponse\022\\\n\027IsCatalogJanit" + + "orEnabled\022\037.IsCatalogJanitorEnabledReque" + + "st\032 .IsCatalogJanitorEnabledResponse\022L\n\021", + "ExecMasterService\022\032.CoprocessorServiceRe" + + "quest\032\033.CoprocessorServiceResponse\022/\n\010Sn" + + "apshot\022\020.SnapshotRequest\032\021.SnapshotRespo" + + "nse\022V\n\025GetCompletedSnapshots\022\035.GetComple" + + "tedSnapshotsRequest\032\036.GetCompletedSnapsh" + + "otsResponse\022A\n\016DeleteSnapshot\022\026.DeleteSn" + + "apshotRequest\032\027.DeleteSnapshotResponse\022A" + + "\n\016IsSnapshotDone\022\026.IsSnapshotDoneRequest" + + "\032\027.IsSnapshotDoneResponse\022D\n\017RestoreSnap" + + "shot\022\027.RestoreSnapshotRequest\032\030.RestoreS", + "napshotResponse\022V\n\025IsRestoreSnapshotDone" + + "\022\035.IsRestoreSnapshotDoneRequest\032\036.IsRest" + + "oreSnapshotDoneResponse\022>\n\rExecProcedure" + + "\022\025.ExecProcedureRequest\032\026.ExecProcedureR" + + "esponse\022E\n\024ExecProcedureWithRet\022\025.ExecPr" + + "ocedureRequest\032\026.ExecProcedureResponse\022D" + + "\n\017IsProcedureDone\022\027.IsProcedureDoneReque" + + "st\032\030.IsProcedureDoneResponse\022D\n\017ModifyNa" + + "mespace\022\027.ModifyNamespaceRequest\032\030.Modif" + + "yNamespaceResponse\022D\n\017CreateNamespace\022\027.", + "CreateNamespaceRequest\032\030.CreateNamespace" + + "Response\022D\n\017DeleteNamespace\022\027.DeleteName" + + "spaceRequest\032\030.DeleteNamespaceResponse\022Y" + + "\n\026GetNamespaceDescriptor\022\036.GetNamespaceD" + + "escriptorRequest\032\037.GetNamespaceDescripto" + + "rResponse\022_\n\030ListNamespaceDescriptors\022 ." + + "ListNamespaceDescriptorsRequest\032!.ListNa" + + "mespaceDescriptorsResponse\022t\n\037ListTableD" + + "escriptorsByNamespace\022\'.ListTableDescrip" + + "torsByNamespaceRequest\032(.ListTableDescri", + "ptorsByNamespaceResponse\022b\n\031ListTableNam" + + "esByNamespace\022!.ListTableNamesByNamespac" + + "eRequest\032\".ListTableNamesByNamespaceResp" + + "onse\022/\n\010SetQuota\022\020.SetQuotaRequest\032\021.Set" + + "QuotaResponse\022f\n\037getLastMajorCompactionT" + + "imestamp\022 .MajorCompactionTimestampReque" + + "st\032!.MajorCompactionTimestampResponse\022x\n" + + "(getLastMajorCompactionTimestampForRegio" + + "n\022).MajorCompactionTimestampForRegionReq" + + "uest\032!.MajorCompactionTimestampResponse\022", + "M\n\022getProcedureResult\022\032.GetProcedureResu" + + "ltRequest\032\033.GetProcedureResultResponseBB" + + "\n*org.apache.hadoop.hbase.protobuf.gener" + + "atedB\014MasterProtosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -52418,7 +52514,7 @@ public final class MasterProtos { internal_static_BalanceRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_BalanceRequest_descriptor, - new java.lang.String[] { }); + new java.lang.String[] { "Force", }); internal_static_BalanceResponse_descriptor = getDescriptor().getMessageTypes().get(47); internal_static_BalanceResponse_fieldAccessorTable = new diff --git a/hbase-protocol/src/main/protobuf/Master.proto b/hbase-protocol/src/main/protobuf/Master.proto index 0b2e875..5f2d0c6 100644 --- a/hbase-protocol/src/main/protobuf/Master.proto +++ b/hbase-protocol/src/main/protobuf/Master.proto @@ -222,6 +222,7 @@ message StopMasterResponse { } message BalanceRequest { + optional bool force = 1; } message BalanceResponse { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java index ae9a96c..56504e2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java @@ -1257,6 +1257,10 @@ public class HMaster extends HRegionServer implements MasterServices, Server { } public boolean balance() throws IOException { + return balance(false); + } + + public boolean balance(boolean force) throws IOException { // if master not initialized, don't run balancer. if (!this.initialized) { LOG.debug("Master has not been initialized, don't run balancer."); @@ -1271,10 +1275,11 @@ public class HMaster extends HRegionServer implements MasterServices, Server { if (this.assignmentManager.getRegionStates().isRegionsInTransition()) { Map regionsInTransition = this.assignmentManager.getRegionStates().getRegionsInTransition(); - LOG.debug("Not running balancer because " + regionsInTransition.size() + + String prefix = force ? "R" : "Not r"; + LOG.debug(prefix + "unning balancer because " + regionsInTransition.size() + " region(s) in transition: " + org.apache.commons.lang.StringUtils. abbreviate(regionsInTransition.toString(), 256)); - return false; + if (!force) return false; } if (this.serverManager.areDeadServersInProgress()) { LOG.debug("Not running balancer because processing dead regionserver(s): " + diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java index 968c97e..1abc780 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java @@ -392,7 +392,8 @@ public class MasterRpcServices extends RSRpcServices public BalanceResponse balance(RpcController controller, BalanceRequest request) throws ServiceException { try { - return BalanceResponse.newBuilder().setBalancerRan(master.balance()).build(); + return BalanceResponse.newBuilder().setBalancerRan(master.balance( + request.hasForce() ? request.getForce() : false)).build(); } catch (IOException ex) { throw new ServiceException(ex); } diff --git a/hbase-shell/src/main/ruby/hbase/admin.rb b/hbase-shell/src/main/ruby/hbase/admin.rb index bf564d4..a35bb64 100644 --- a/hbase-shell/src/main/ruby/hbase/admin.rb +++ b/hbase-shell/src/main/ruby/hbase/admin.rb @@ -102,8 +102,8 @@ module Hbase #---------------------------------------------------------------------------------------------- # Requests a cluster balance # Returns true if balancer ran - def balancer() - @admin.balancer() + def balancer(force) + @admin.balancer(java.lang.Boolean::valueOf(force)) end #---------------------------------------------------------------------------------------------- diff --git a/hbase-shell/src/main/ruby/shell/commands/balancer.rb b/hbase-shell/src/main/ruby/shell/commands/balancer.rb index c329ece..793cfc0 100644 --- a/hbase-shell/src/main/ruby/shell/commands/balancer.rb +++ b/hbase-shell/src/main/ruby/shell/commands/balancer.rb @@ -25,13 +25,22 @@ module Shell Trigger the cluster balancer. Returns true if balancer ran and was able to tell the region servers to unassign all the regions to balance (the re-assignment itself is async). Otherwise false (Will not run if regions in transition). +Parameter tells master whether we should force balance even if there is region in transition. +Examples: + + hbase> balance + hbase> balance "force" EOF end - def command() + def command(force) format_simple_command do formatter.row([ - admin.balancer()? "true": "false" + if force.nil? + admin.balancer()? "true": "false" + elsif force == "force" + admin.balancer("true")? "true": "false" + end ]) end end