[ 
https://issues.apache.org/jira/browse/HBASE-16415?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16053870#comment-16053870
 ] 

Jan Kunigk commented on HBASE-16415:
------------------------------------

Thanks Ted.

I am in the process of implementing the logic of entry redirection in 
RedirectingInterClusterReplicationEndpoint, but wonder how I should combine 
that class' replicate implementation with redirection.
I would very much appreciate the community once more, while I see several 
options:

1. Embed, the logic of redirections into the replicate() method, which would 
mean
a) Overriding replicate of HBaseInterClusterReplicationEndpoint, but also
b) duplicating the actual code in 
HBaseInterClusterReplicationEndpoint.replicate(), which I don't think is a good 
implementation

2. Implement the logic of redirections in a completely new method redirect(), 
which needs to be called from within instances of 
HBaseInterClusterReplicationEndpoint or 
RedirectingInterClusterReplicationEndpoint
We could wrap the content of replicate() into a doReplicate() method in 
HBaseInterClusterReplicationEndpoint.
HBaseInterClusterReplicationEndpoint would then only call doReplicate() in 
replicate()
RedirectingInterClusterReplicationEndpoint would call redirect(); doReplicate() 
as part of replicate()
However, this solution puts the functionality of redirection way down into 
HBaseInterClusterReplicationEndpoint, which may not be a good idea.

3. Implement redirect() as an abstract method in HBaseReplicationEndpoint 
(which is the abstract base class for HBaseInterClusterReplicationEndpoint and 
RegionReplicaReplicationEndpoint.
The redirect() implementation of both HBaseInterClusterReplicationEndpoint and 
RegionReplicaReplicationEndpoint would not do anything (optionally logs this). 
RedirectingInterClusterReplicationEndpoint.replicate() overrides the empty 
implementation with actually redirecting entries.
While this would lead to "empty" abstract method implementations, it appears to 
me as the cleanest and most straightforward way to achieve the redirection 
logic to occur in the ReplicationEndpoint.

4. Copy the behaviour of getWALEntryfilter() in BaseReplicationEndpoint (This 
is more involved, but avoids empty abstract method implementations):
return filters.isEmpty() ? null : new ChainWALEntryFilter(filters);
    1. Implement a getRedirector() function in BaseReplicationEnpoint, which 
returns an instance of a novel Redirector class, implementing the redirections 
logic.
    2. If no explicit Redirectors are set in the endpoint, return an empty 
redirector (NullRedirector, etc.)
    3. Provide a redirectEntries() function in BaseReplicationEndpoint which 
will invoke getRedirector() and Redirector.redirect() _if_ getRedirector() != 
null
    4. The version in BaseReplicationEnpoint will return an empty redirector 
(or null) for getRedirector(), which means that direct subclasses 
(HBaseInterClusterReplicationEndpoint or RegionReplicaReplicationEndpoint) will 
also return null and not redirect anything
    5. The version in RedirectingInterClusterReplicationEndpoint will overwrite 
getRedirector() and return a Redirector, which implements 
    6. Embed redirectEntries() into the replicate() method of 
HBaseInterClusterReplicationEndpoint (or all other classes who want to reserve 
the option option of redirection) 


Again, appreciate your feedback, J

> Replication in different namespace
> ----------------------------------
>
>                 Key: HBASE-16415
>                 URL: https://issues.apache.org/jira/browse/HBASE-16415
>             Project: HBase
>          Issue Type: New Feature
>          Components: Replication
>            Reporter: Christian Guegi
>            Assignee: Jan Kunigk
>
> It would be nice to replicate tables from one namespace to another namespace.
> Example:
> Master cluster, namespace=default, table=bar
> Slave cluster, namespace=dr, table=bar
> Replication happens in class ReplicationSink:
>   public void replicateEntries(List<WALEntry> entries, final CellScanner 
> cells, ...){
>     ...
>     TableName table = 
> TableName.valueOf(entry.getKey().getTableName().toByteArray());
>     ...
>     addToHashMultiMap(rowMap, table, clusterIds, m);
>     ...
>     for (Entry<TableName, Map<List<UUID>, List<Row>>> entry : 
> rowMap.entrySet()) {
>       batch(entry.getKey(), entry.getValue().values());
>     }
>    }



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to