Github user mattf-horton commented on the issue:

    https://github.com/apache/incubator-metron/pull/395
  
    Regarding ZkConfigurationManager and the above discussion thread:
    This is a complex situation, but my best advice is as follows:
    
    1.  It is definitely worthwhile to refactor a CuratorZkConfigManager class 
out of ConfiguredBolt.  In fact, when we do, we really should propose the Storm 
team adopt it; it would be tremendously valuable for lots of Storm 
applications.  HOWEVER, this is a significant task in its own right and more 
than a couple days' work.  I believe there is a much simpler solution for the 
short term, that either avoids or mostly avoids the split implementation 
problem (depending on a Storm detail that I wasn't able to determine), so I 
don't recommend we make Nick do it as part of this task.
    
    2. I agree with @merrimanr and @cestella that we should not lose the 
established functionality of ConfiguredBolt for managing 
ProfilerConfigurations, nor create a new config management and caching 
mechanism, even with good intentions about putting it all back together in the 
future.
    
    3. After analyzing what goes into the class hierarchies, I see that:
    a) The way BaseWindowedBolt manages its windowConfiguration is 
qualitatively different from the Curated Zk based management used by 
ConfiguredBolt.  It would be hard to merge them, and that's what is causing the 
current problem.
    b) But it isn't necessary, because the config management built into 
BaseWindowedBolt is just a distraction.
    
    What's necessary to use Storm Windowing is that:
    - the Bolt implements IWindowedBolt interface, 
    - a certain set of 7 parameters (defined by example in BaseWindowedBolt) is 
presented to Storm when it queries the Bolt's getComponentConfiguration() 
method,
    - and the Storm topology correctly identifies the Bolt as being a Windowed 
Bolt.
    
    The only question in my mind is the last bullet.  Does Storm identify the 
Bolt as Windowed just because it presents the windowing parameters in 
getComponentConfiguration() ?  Or does it do class reflection on the Bolt?  If 
it uses reflection, is it looking for IWindowedBolt or for BaseWindowedBolt ?
    
    It is likely that one of the first two is sufficient to identify the Bolt 
as Windowed.  If so, there's a very easy solution to all this.  Define:
    ```
    public abstract class ConfiguredWindowedBolt<CONFIG_T extends 
Configurations> 
        extends ConfiguredBolt<CONFIG_T> implements IWindowedBolt
                {with only a few lines of content needed}
    and
    public abstract class ConfiguredProfilerBolt 
        extends ConfiguredWindowedBolt<ProfilerConfigurations> 
    ```
    This compiles on the master codeline; I can share my straw man if desired.
    Then change `getComponentConfiguration()` in ProfileBuilderBolt, to return 
the 7 windowing-related config parameters instead of 
TOPOLOGY_TICK_TUPLE_FREQ_SECS.  Other than changes to add the windowing params 
to the ProfilerConfigurations on a per-bolt basis, the current config 
management code in ConfiguredProfilerBolt and ConfiguredBolt can be used just 
as is.
    
    If Storm actually requires the Bolt to be of type BaseWindowedBolt, then it 
is a little uglier, but still doable:  Copy the methods of ConfiguredBolt into 
a new class that extends BaseWindowedBolt, simply overriding any conflicting 
methods already in BaseWindowedBolt.  We have to duplicate the code, but it can 
be copied verbatim, thereby giving much higher reliability than new code.
    Again, there's no need to try to use the configuration management code 
built into BaseWindowedBolt; only what gets returned in 
`getComponentConfiguration()` is important.
    
    I don't expect either of these solutions to give great joy, but it is 
workable and can be done reliably.  We don't need to refactor ConfiguredBolt, 
and its curated config management can be used whole.


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to