Relevant: https://issues.apache.org/jira/browse/CASSANDRA-6881


On Tue, Jun 3, 2014 at 12:59 PM, Gary Dusbabek <gdusba...@gmail.com> wrote:

> On Tue, Jun 3, 2014 at 3:52 AM, Simon Chemouil <schemo...@gmail.com>
> wrote:
>
> > Hi,
> >
> > I'm new to Cassandra and felt like exploring and hacking on the code. I
> > was surprised to see the usage of so many mutable/global state statics
> > all over the service package (basically global variables/singletons).
> >
> > While I understand it can be practical to work with singletons, and that
> > in any case I'm not sure multi-tenant Cassandra (as in two different
> > Cassandra instances within the same process) would make sense at all (or
> > even work considering there is some native access going on with JNA), I
> > find static state can easily lead to tangled 'spaghetti' code (accessing
> > the singletons from anywhere, even where one shouldn't), and in general
> > it ties the code to the VM instance, rather than to the class.
> >
> > I tried to find if it was an actual design choice, but from my
> > understanding this is more something inherited from the early Cassandra
> > times at Facebook. I just found this thread[1] pointing to issue
> > CASSANDRA-741 (slightly more limited scope) that was marked as WONTFIX
> > because no one took it (but still marked as open for contribution). The
> > current code conventions also don't mention the usage of singletons
> > except by stating:  "Do not extract interfaces (or abstract classes)
> > unless you actually need multiple implementations of it" (switching to a
> > "service"-style design doesn't require passing interfaces but it's
> > highly encouraged to help testability).
> >
> > So, I'd like to try to make this refactoring happen and remove all (or
> > most) mutable static state. It would be an easy way in for me in
> > Cassandra's internals (maybe to contribute further). I think it would
> > help testing (ability to unit test components without going to the
> > storage for instance) and in general modernize the code. It would also
> > make hacking on Cassandra easier because people could pick different
> > pieces without pulling the whole thing.
> >
> > It would definitely break backwards compatibility with current Java code
> > that directly embeds Cassandra / uses it as a library, but I would keep
> > the same abstraction so the refactoring would be easy. In any case,
> > backwards compatibility can be broken by many more changes than just
> > refactoring, and once this is done it will be easier to deal with
> > backwards compatibility.
> >
> > Obviously all ".instance" fields would be gone, and I'd try to fix
> > potential cyclic class dependencies and generally make sure classes
> > dependencies form a direct acyclic graph with CassandraDaemon as its
> > root. The basic idea is to have each 'service' component require all its
> > service dependencies in their constructor (and keeping them as a final
> > field), rather than getting them via the global namespace (singleton
> > instances).
> >
> > If I had it my way, I'd probably use a dependency injection framework,
> > namely Dagger which is as far as I knpw the lightest Java DI framework
> > actively developed (jointly developed by Square and Google's Java team
> > responsible for Guice & Guava), which has a neat compile-time annotation
> > processor that detects missing dependencies early on. It works with both
> > Android and J2SE and is very fast, simple and light (65kB vs 710kB for
> > Guice).
> >
> > So, the question is: would you guys accept such a patch? I'd rather not
> > do the work if it has no chance of being merged upstream :).
> >
>
> This has come up before. Let's face it, removing the singletons is a
> tempting proposition.
>
> Several of us have been down the path of trying to do it.
>
> At the end of the day, here's what you'd end up with (absolutely best
> case):
>
> 1. Modifying just about every class, sometimes substantially.
> 2. A huge patch for someone else to review.
> 3. No performance gains, no bug fixes.  In fact, since so many classes have
> to be changed, I'd say that the risk of introducing a bug/regression is
> fairly likely.
> 4. Complicated merges when bugs need to be fixed in older versions.
> 5. More modular and testable code.
>
> So far, the positive aspects of 5 have not been able to trump the
> challenges presented by 1, 2, 3, and 4.
>
> Kind Regards,
>
> Gary.
>
>
> >
> > Cheers,
> >
> > --
> > Simon
> >
> >
> > [1]
> >
> >
> http://grokbase.com/t/cassandra/dev/107xr48hek/creating-two-instances-in-code
> >
>

Reply via email to