Re: ACIDity of Prevayler 2.6
Arnaud Masson <[email protected]> Fri, 23 Nov 2012 10:46:38 +0100
| Newsgroups | gmane.comp.java.prevayler |
|---|---|
| Message-ID | <[email protected]> |
Hi
I am currently using this alternate pattern for a system that has many
reads and few writes, with strong consistency requirements.
Any single-point-in-time snapshot of the journal (at disk level) is correct.
prepareCommandOnJournal(command); // minimize IO during lock scope
writeLock.lock();
try {
try {
if (command.prepareExecution()) {
oldHash = model.hashCode();
command.execute();
commitCommandToJournal(command); // might cause some latency
// in concurrent queries
}
} catch (Exception re) { // execution or journal IO problem
try {
command.rollback(); //Maybe it would be easier to just reload
//whole system, throw some Exception
// optional: check that rollback has really restored the old state
int newHash = model.hashCode();
if (newHash != oldHash)
throw RuntimeException("Rollback was not correct", re);
// no need to fix the journal
} catch (Exception fatalEx) {
System.exit(-1); //Or another way to reload the whole system
}
}
}
finaly {
writeLock.unlock();
}
On 23/11/2012 03:42, Alexandre Nodari wrote:
> Uau!
>
> Considering from past e-mails:
>
> - Atomicity and Consistency have some overlap
> - When we say Exceptions, we are usually talking about unexpected
> events. Normally either the Commands were written without throwing
> Exceptions or there are expected Exceptions that are catched and dealt
> within the Command.
> - The Royal Food Taster provides Rollback with 2 steps:
> - Avoiding a Command that threw an Exception (unexpected event) to
> be written to the journal
> - Avoiding partial changes by discarding temporary data used to
> check the Commands
>
> We have then two grades (or levels) of Atomicity+Consistency:
>
> A) Without Royal Food Taster: Exceptions (expected and unexpected)
> happen and we let the business code deal with them. Advantages: simple
> and fast. Disadvantage: being some Exceptions unexpected events, maybe
> it is not possible to guarantee that they are deterministic, and not
> being deterministic they can really cause trouble in the system based on
> Prevaylers definition.
>
> B) With Royal Food Taster: Exceptions (unexpected) cause Rollback.
> Advantage: "better" Atomicity+Consistency. Disadvantages: less
> performance and more memory needed.
>
> My opinion:
>
> I think the choice should be given to the developers, offering both options.
>
> And I like the idea of trying to do better than Royal Food Taster. I
> will give a draft of another idea of Rollback to help with the
> discussion, trying to address the 2 steps described above:
>
> Another type of Command called RollbackableCommand with 3 methods:
>
> boolean prepareExecution(); // Prepare to execute, validate
> pre-conditions, save data for rollback
> void execute(); //Execute the changes, catch and deal with all expected
> Exceptions
> void rollback(); //Rollback possible changes
>
> And Prevayler would do something like this:
>
> try {
> if (command.prepareExection()) {
> writeCommandToJournal();
> command.execute();
> }
> } catch (RuntimeException re) {
> try {
> removeCommandFromJournal();
> command.rollback(); //Maybe it would be easier to just reload
> whole system, throw some Exception
> } catch (Exception e) {
> System.exit(-1); //Or another way to reload the whole system
> }
> }
>
> Did not think about all the caveats possible. Just beginning a new idea.
> Probably for Prevayler 3 :-)
>
> See you,
>
>
> 2012/11/17 Paul Bennett <[email protected] <mailto:[email protected]>>
>
> Justin, thanks very much for such clear explanation. Some comments
> below.
>
> On Nov 16, 2012, at 2:55 AM, Justin T. Sampson wrote:
>
>> It's exciting to see such a passionate discussion. :) And also
>> good that it's coming around to some more practical questions.
>>
>> First of all, the ACID properties are ill-defined, incomplete, and
>> redundant, so ultimately we shouldn't take them too seriously.
>> Yes, A and C have some overlap, as do A and I, C and D, etc. They
>> are a nice set of reminders of things to talk about regarding
>> transactions in a persistence layer, though. And I still maintain
>> that rollback is just one potential mechanism to partially address
>> some of these properties, not a fundamental requirement for any of
>> them.
>
> Ah, OK - then we are in violent agreement :-). I misunderstood your
> (and Klaus's) previous statements to mean that rollback was always
> irrelevant, and never ever useful. That was what I was arguing against.
>
>>
>> As for journaling transactions after executing them, that would
>> cause queries to have the same latency as transactions, which is a
>> pretty big departure from Prevayler's normal performance profile.
>> It would hardly even be Prevayler anymore. ;)
>>
>> Paul wrote:
>>
>> > Klaus, you haven't answered my question. As far as I can see,
>> > without something to maintain consistency in the face of an
>> > unexpected exceptions, once that happens, the system is
>> > inconsistent and cannot proceed *for all users*. You must
>> > either a) shut down and fix the bug or b) remove the txn from
>> > the journal.
>> >
>> > So unlike an ordinary db, which would isolate the exception
>> > to a single user, and let others continue to use the
>> > non-problemmatic parts of the system, an exception kills the
>> > whole thing. That's unacceptable to me.
>>
>> Why does it kill the whole thing?
>
> Yes, OK, that was a little extreme :-) What I was really trying to
> say was the above - that rollback can be useful in dealing with
> certain cases (unpredictable but repeatable exceptions thrown
> because of coding errors), in a certain context. In our system,
> (which is different from a (normal, conventional ?) prevalent system
> where transactions and queries are written as specific classes), it
> is pretty easy to generically generate the inverse of each
> transaction, which makes implementing rollback on exceptions very
> do-able. The user has the same experience as a 'regular' database
> system. But - as you say above - it is not a complete solution for
> handling inconsistency due to any and all errors. It just reduces
> the number of situations where some kind of outside intervention is
> needed.
>
>>
>> The point that Klaus and I are making is really that you have to
>> worry about the kind of situation you're describing even if you do
>> have a rollback mechanism. I've seen plenty of bugs in relational
>> database applications that caused inconsistent data without
>> throwing exceptions. At some point a user notices something wonky,
>> or some feature starts breaking or throwing exceptions later due
>> to the bad data.
>
> Agreed. I was not arguing against that - apologies if I was not clear
>
>>
>> When such inconsistencies happen, it doesn't typically mean that
>> the system is suddenly unusable for everyone. Maybe one entity is
>> inaccessible, or some calculations display incorrectly, or one
>> user can't log in. Bugs that take down an entire application are
>> pretty rare, in my experience, but of course they do occasionally
>> happen -- again, even in systems with rollbacks.
>>
>> I haven't so far addressed the question of what to do in a
>> Prevayler-based application when bad data creeps in; I've just
>> clarified that you need to be prepared for bad data regardless of
>> rollbacks. In the worst case, whatever your persistence layer,
>> there's always the option to restart the system from a nightly
>> backup. For smaller fixes, a relational database does provide the
>> convenience of a built-in scripting language (some variant of SQL)
>> with an interactive interpreter; in a similar vein, some Prevayler
>> users have talked about using something like BeanShell or some
>> other JVM-based scripting language as a superuser feature in an
>> application, allowing an arbitrary script to be submitted as a
>> transaction in a running system. The purer approach would be to
>> write a new fix-up transaction in Java (possibly even with unit
>> tests!) and either redeploy or hotswap the app in order to execute
>> it on the running system.
>
> That's very useful, and a few things I hadn't thought of. Thanks!
>
>>
>> As for the history of dropping the food taster, it happened in
>> this thread last November, with not nearly as much excitement as
>> in our present thread:
>>
>> http://sourceforge.net/mailarchive/forum.php?thread_name=CAGs7EcU_X1%2BTE3O-CjCje2gsSoxxjnGTm8UZWb6ZkORE7%3Do77A%40mail.gmail.com&forum_name=prevayler-discussion
>>
>> ------------------------------------------------------------------------------
>> Monitor your physical, virtual and cloud infrastructure from a single
>> web console. Get in-depth insight into apps, servers, databases,
>> vmware,
>> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
>> Pricing starts from $795 for 25 servers or applications!
>> http://p.sf.net/sfu/zoho_dev2dev_nov_______________________________________________
>> To unsubscribe go to the end of this page:
>> http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
>> _______________________________________________
>> "Databases in Memoriam" -- http://www.prevayler.org
>
> -pb
>
>
>
> ------------------------------------------------------------------------------
> Monitor your physical, virtual and cloud infrastructure from a single
> web console. Get in-depth insight into apps, servers, databases, vmware,
> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
> Pricing starts from $795 for 25 servers or applications!
> http://p.sf.net/sfu/zoho_dev2dev_nov
> _______________________________________________
> To unsubscribe go to the end of this page:
> http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
> _______________________________________________
> "Databases in Memoriam" -- http://www.prevayler.org
>
>
>
>
> ------------------------------------------------------------------------------
> Monitor your physical, virtual and cloud infrastructure from a single
> web console. Get in-depth insight into apps, servers, databases, vmware,
> SAP, cloud infrastructure, etc. Download 30-day Free Trial.
> Pricing starts from $795 for 25 servers or applications!
> http://p.sf.net/sfu/zoho_dev2dev_nov
>
>
>
> _______________________________________________
> To unsubscribe go to the end of this page: http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
> _______________________________________________
> "Databases in Memoriam" -- http://www.prevayler.org
>
------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
_______________________________________________
To unsubscribe go to the end of this page: http://lists.sourceforge.net/lists/listinfo/prevayler-discussion
_______________________________________________
"Databases in Memoriam" -- http://www.prevayler.org