+ 1 to all suggestions from Bjorn, but I'm sorry I can't devote time to it.
FWIW there's an old issue I once reported which tells part of the story. At
the time it was resolved as Won't Fix, but as Gary mentioned, time change
https://issues.apache.org/jira/browse/CASSANDRA-741 (Refactor for
testability: Make class DatabaseDescriptor a real class with member methods,
and non-static methods)
On Tue, Aug 17, 2010 at 4:31 PM, Bjorn Borud <bbo...@gmail.com> wrote:

> Gary Dusbabek <gdusba...@gmail.com> writes:
>
> >
> > I looked into doing this when I was first learning the code and had an
> > experience simliar to yours.  At the time there wasn't much interest
> > in seeing it through to fruition, but maybe times have changed.
>
> any lack of interest in solving these problems just means that people
> haven't stumbled on these problems yet :-)
> ...but eventually they will (and people like Ran Tavory and the Hector
> team have already stumbled across these hurdles and had to devote time
> to creating some workarounds).
>
> > If I were to attempt it again I would do it in this error:
> > 1.  Make the config customizable.
>
> Would it be good enough if you had a CassandraConfig object and some
> ways to create it?  Either directly or through:
>
>  CassandraConfig config = CassandraConfig.parseFile(...);
>
> and then some:
>
>  Cassandra cassandra = Cassandra.createInstance(config);
>
> or even
>
>  Cassandra cassandra = new Cassandra(config);
>
> > 2.  Make the services re-entrant (You should be able to start, stop,
> > then start again without problems).
>
> you mean restart an instance or be able to throw away your instance and
> create a new one?  for me, being able to restart a stopped instance
> isn't really that important because it would work fine for me to create
> a new instance (possibly with the same config, using the same files/dirs
> and ports).
>
> you may have good reasons to be able to restart a stopped Cassandra
> instance though.  (But I suspect we more or less want the same thing).
>
> > 3.  Get rid of the singletons.  This will involve coming up with a
> > smart way to couple instances of the services with each other.
>
> indeed.  but I hope nobody falls for the temptation of introducing
> Spring or something similar to do the wiring in the Cassandra
> code. (what people do in their own projects is their problem, but
> Cassandra should not require you to adopt additional mamoth frameworks).
>
> > 4.  Integrate the storage port into how we canonically identify a node
> > (its just hostname now).
>
> hmm, I see your point, but I am not sure I understand the consequences
> fully.
>
> > 5.  While you're at it, figure out how to get JMX to bind to something
> > other than 0.0.0.0.  (I hear it is possible, see
> > http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6425769)
>
> I have limited experience with JMX so I'll pass on commenting on this.
>
> >> there are other valid reasons for wanting to embed Cassandra besides
> >> unit testing.  for instance, if you are writing an application that
> >> depends on Cassandra and you want the option of packaging it as a single
> >> binary for single node experimentation, development and demo purposes.
> >
> > I'd kind of like to see this too, although I admit that from the
> > pragmatic standpoint of running a Cassandra server, it represents a
> > whole lot of change for what amounts to very little tangible benefit.
>
> while the benefit may be hard to articulate, I think it is significant.
> any time you can embed a "server" in your binary you can make life a lot
> easier for casual users and for testing.
>
> almost all server projects I have done in the past 7-8 years have been
> like this:  I make it possible to embed the server so that people can
> build and distribute prototypes or they can use the exact same binary to
> either use an external (distributed) instance or just create an internal
> instance for simpler use-cases (by config).
>
> compare to Hudson.  it is distributed as a WAR so you can load it into
> your web server.  but for most people, they just want it up and running
> with as little hassle as possible on a single node, so being able to
> fire it up from the command line, and rely on the embedded web server is
> very attractive compared to fooling around with Jetty, Tomcat or worse.
> if Hudson had required me to manage a number of services that I need to
> manually set up and manage, I would probably not have bothered using it.
>
> (not sure if that example is very clear, but hey... :-)
>
> > From a development standpoint, the biggest benefit I see it would that
> > we could write unit tests for small clusters that run on a single
> > node.
>
> yeah, it is critical for unit testing.  right now we are forced to do
> testing in a rather clumsy fashion.  it is a big step backward from, for
> instance, the way I do testing with Apache Derby (which has hairy
> lifecycle management, but it is embeddable).
>
> > One interesting thing that this would make possible is the ability to
> > have a node with >1 tokens in a single JVM.  Useful, who knows?  But
> > it is interesting because I think it would make Cassandra more elastic
> > (and could theoretically help with the hot-node problem when using
> > OPP).
>
> (there are some usage scenarios using OSGi to run multiple Cassandra
> instances in the same JVM that come to mind, but I haven't really given
> this a lot of (any) detailed thought)
>
> -Bjørn
>
>

Reply via email to