HBASE-23710 - Priority configuration for system coprocessor
Signed-off-by: Viraj Jasani <vjasani@apache.org>
This commit is contained in:
parent
02d80b240b
commit
c080923d77
|
@ -148,8 +148,16 @@ public abstract class CoprocessorHost<E extends CoprocessorEnvironment> {
|
|||
if (defaultCPClasses == null || defaultCPClasses.length == 0)
|
||||
return;
|
||||
|
||||
int priority = Coprocessor.PRIORITY_SYSTEM;
|
||||
int currentSystemPriority = Coprocessor.PRIORITY_SYSTEM;
|
||||
for (String className : defaultCPClasses) {
|
||||
String[] classNameAndPriority = className.split("\\|");
|
||||
boolean hasPriorityOverride = false;
|
||||
className = classNameAndPriority[0];
|
||||
int overridePriority = Coprocessor.PRIORITY_SYSTEM;
|
||||
if (classNameAndPriority.length > 1){
|
||||
overridePriority = Integer.parseInt(classNameAndPriority[1]);
|
||||
hasPriorityOverride = true;
|
||||
}
|
||||
className = className.trim();
|
||||
if (findCoprocessor(className) != null) {
|
||||
// If already loaded will just continue
|
||||
|
@ -162,10 +170,13 @@ public abstract class CoprocessorHost<E extends CoprocessorEnvironment> {
|
|||
implClass = cl.loadClass(className);
|
||||
// Add coprocessors as we go to guard against case where a coprocessor is specified twice
|
||||
// in the configuration
|
||||
this.coprocessors.add(loadInstance(implClass, priority, conf));
|
||||
int coprocPriority = hasPriorityOverride ? overridePriority : currentSystemPriority;
|
||||
this.coprocessors.add(loadInstance(implClass, coprocPriority, conf));
|
||||
LOG.info("System coprocessor " + className + " was loaded " +
|
||||
"successfully with priority (" + priority + ").");
|
||||
++priority;
|
||||
"successfully with priority (" + coprocPriority + ").");
|
||||
if (!hasPriorityOverride) {
|
||||
++currentSystemPriority;
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
// We always abort if system coprocessors cannot be loaded
|
||||
abortServer(className, t);
|
||||
|
|
|
@ -107,9 +107,24 @@ Therefore, the jar file must reside on the server-side HBase classpath.
|
|||
|
||||
Coprocessors which are loaded in this way will be active on all regions of all tables.
|
||||
These are the system coprocessor introduced earlier.
|
||||
The first listed coprocessors will be assigned the priority `Coprocessor.Priority.SYSTEM`.
|
||||
Each subsequent coprocessor in the list will have its priority value incremented by one (which reduces its priority, because priorities have the natural sort order of Integers).
|
||||
|
||||
The first listed Coprocessors will be assigned the priority `Coprocessor.Priority.SYSTEM`.
|
||||
Each subsequent coprocessor in the list will have its priority value incremented by one (which
|
||||
reduces its priority, because priorities have the natural sort order of Integers).
|
||||
|
||||
+
|
||||
These priority values can be manually overriden in hbase-site.xml. This can be useful if you
|
||||
want to guarantee that a coprocessor will execute after another. For example, in the following
|
||||
configuration `SumEndPoint` would be guaranteed to go last, except in the case of a tie with
|
||||
another coprocessor:
|
||||
+
|
||||
[source,xml]
|
||||
----
|
||||
<property>
|
||||
<name>hbase.coprocessor.region.classes</name>
|
||||
<value>org.myname.hbase.coprocessor.endpoint.SumEndPoint|2147483647</value>
|
||||
</property>
|
||||
----
|
||||
When calling out to registered observers, the framework executes their callbacks methods in the sorted order of their priority.
|
||||
Ties are broken arbitrarily.
|
||||
|
||||
|
|
Loading…
Reference in New Issue