Hm, can you try to write a test that reproduce this?

On Mon, Jun 1, 2009 at 6:55 PM, Mike Nichols <[email protected]>wrote:

>
> Yes I see all those passing. Here's what's happening:
> 1. Send good message and all works
> 2. Send message that causes transaction exception (as before) :: App
> doesn't crash now (yeaay!)
> 3. Send good message : Message is received (therefore the transport is
> still alive even after previous exception) but before it is processed
> the previous bad transaction is attempted ONCE and so the whole
> processing fails...almost like the transaction wasn't disposed after
> the error queue handling was done. Interestingly, NHProf isn't showing
> all this in a new session either, but not sure that is truthful or
> not. The 'Error DTC Transaction prepre  (sic) phase failed' error pops
> up BEFORE the other message has a chance to fully process.
> Oi-vey
>
>
> On Jun 1, 2:57 pm, Ayende Rahien <[email protected]> wrote:
> > Hm, can you look at the tests that I committed, they are testing that the
> > message arrive in the error queue.
> >
> > On Mon, Jun 1, 2009 at 4:05 PM, Mike Nichols <[email protected]
> >wrote:
> >
> >
> >
> >
> >
> > > Hm...the host isn't crashing now but the message that causes the error
> > > seems not to be moving to the errors queues, or, the transport is
> > > shutting down. i can't tell yet.
> >
> > > On Jun 1, 11:01 am, Ayende Rahien <[email protected]> wrote:
> > > > Okay, this is now fixed, have fun :-)
> >
> > > > On Mon, Jun 1, 2009 at 1:40 PM, Mike Nichols <
> [email protected]
> > > >wrote:
> >
> > > > > Man thanks Ayende
> >
> > > > > On Mon, Jun 1, 2009 at 10:13 AM, Ayende Rahien <[email protected]>
> > > wrote:
> >
> > > > >> Yes, I can.You need to use IEnlistmentNotification impl and
> register
> > > that
> > > > >> on the TX.
> > > > >> I'll have a fix shortly
> >
> > > > >> On Mon, Jun 1, 2009 at 1:01 PM, Mike Nichols <
> > > [email protected]>wrote:
> >
> > > > >>> Are you able to test this without all the NH dependency cruft? I
> want
> > > to
> > > > >>> keep hacking on this but can't figure out how to write a lighter
> test
> > > for it
> > > > >>> to stick in RSB code base. Just throwing TransactionExceptions
> > > doesn't work
> >
> > > > >>> On Mon, Jun 1, 2009 at 8:12 AM, Ayende Rahien <[email protected]
> >
> > > wrote:
> >
> > > > >>>> Sigh,
> > > > >>>> I reproduced the issue, not fun.
> >
> > > > >>>> On Mon, Jun 1, 2009 at 1:29 PM, Mike Nichols <
> > > [email protected]>wrote:
> >
> > > > >>>>> I think I have narrowed the problem to transaction commit
> failures
> > > > >>>>> that take place AFTER the 'Consume' invocation is made (ie in
> > > > >>>>> MessageCompleted). These exceptions are outside the scope of
> the
> > > > >>>>> try...catch wrapping the ProcessMessage call.
> > > > >>>>> In the code I have above the transaction tries to commit (in
> ATM)
> > > and
> > > > >>>>> then rolls back since SQL Server throws, aborting the
> transaction.
> > > > >>>>> When the TransactionScope attempts to Dispose in RQTransport
> > > > >>>>> ReceiveMessage method, the InternalTransaction throws since it
> was
> > > > >>>>> aborted, making the whole app crash since it is unhandled.
> >
> > > > >>>>> Any ideas on this? My attempts to handle TransactionException
> have
> > > so
> > > > >>>>> far just thrown RSB into a loop.
> >
> > > > >>>>> On May 30, 11:41 pm, Mike Nichols <[email protected]>
> > > wrote:
> > > > >>>>> > I have a test case here that demonstrates the problem. I
> changed
> > > > >>>>> > RQTransport on ReceiveMessage to catch
> > > TransactionAbortedException
> > > > >>>>> and
> > > > >>>>> > Debugger.Launch inside the catch statement.
> > > > >>>>> > Note this test is 'heavy' intentionally . RSB tries 5 times
> to
> > > handle
> > > > >>>>> > the message but when the Session flushes the transaction
> aborts
> > > and
> > > > >>>>> > since the transaction reference is outside the try...catch in
> > > > >>>>> > ReceiveMessage it goes unhandled.
> >
> > > > >>>>> > First here is output from NHProf Error logging:
> > > > >>>>> > It seems like since the exception is thrown inside the
> > > > >>>>> > TransactionScope (tx) instead the inner try..catch is ignored
> and
> > > > >>>>> > hence the TransactionAbortedException goes unhandled in the
> app,
> > > > >>>>> > stopping it altogether.
> >
> > > > >>>>> > ERROR:
> > > > >>>>> > DTC transaction prepre phase failed
> > > > >>>>> > System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow.
> Must
> > > be
> > > > >>>>> > between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
> > > > >>>>> >    at System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan
> > > value)
> > > > >>>>> >    at System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime
> > > value)
> > > > >>>>> >    at System.Data.SqlClient.MetaType.FromDateTime(DateTime
> > > dateTime,
> > > > >>>>> > Byte cb)
> > > > >>>>> >    at System.Data.SqlClient.TdsParser.WriteValue(Object
> value,
> > > > >>>>> > MetaType type, Byte scale, Int32 actualLength, Int32
> > > > >>>>> encodingByteSize,
> > > > >>>>> > Int32 offset, TdsParserStateObject stateObj)
> > > > >>>>> >    at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[]
> > > > >>>>> > rpcArray, Int32 timeout, Boolean inSchema,
> SqlNotificationRequest
> > > > >>>>> > notificationRequest, TdsParserStateObject stateObj, Boolean
> > > > >>>>> > isCommandProc)
> > > > >>>>> >    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds
> > > > >>>>> > (CommandBehavior cmdBehavior, RunBehavior runBehavior,
> Boolean
> > > > >>>>> > returnStream, Boolean async)
> > > > >>>>> >    at System.Data.SqlClient.SqlCommand.RunExecuteReader
> > > > >>>>> > (CommandBehavior cmdBehavior, RunBehavior runBehavior,
> Boolean
> > > > >>>>> > returnStream, String method, DbAsyncResult result)
> > > > >>>>> >    at
> System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery
> > > > >>>>> > (DbAsyncResult result, String methodName, Boolean sendToPipe)
> > > > >>>>> >    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery()
> > > > >>>>> >    at
> > > NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand
> > > > >>>>> > cmd)
> > > > >>>>> >    at
> > > NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation
> > > > >>>>> > expectation)
> > > > >>>>> >    at
> NHibernate.Persister.Entity.AbstractEntityPersister.Insert
> > > > >>>>> > (Object id, Object[] fields, Boolean[] notNull, Int32 j,
> > > > >>>>> > SqlCommandInfo sql, Object obj, ISessionImplementor session)
> > > > >>>>> >    at
> NHibernate.Persister.Entity.AbstractEntityPersister.Insert
> > > > >>>>> > (Object id, Object[] fields, Object obj, ISessionImplementor
> > > session)
> > > > >>>>> >    at NHibernate.Action.EntityInsertAction.Execute()
> > > > >>>>> >    at NHibernate.Engine.ActionQueue.Execute(IExecutable
> > > executable)
> > > > >>>>> >    at NHibernate.Engine.ActionQueue.ExecuteActions(IList
> list)
> > > > >>>>> >    at NHibernate.Engine.ActionQueue.ExecuteActions()
> > > > >>>>> >    at
> >
> > >
> NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions
> > > > >>>>> > (IEventSource session)
> > > > >>>>> >    at
> NHibernate.Event.Default.DefaultFlushEventListener.OnFlush
> > > > >>>>> > (FlushEvent event)
> > > > >>>>> >    at NHibernate.Impl.SessionImpl.Flush()
> > > > >>>>> >    at
> >
> > >
> NHibernate.Impl.AbstractSessionImpl.System.Transactions.IEnlistmentNotifica­tion.Prepare
> > > > >>>>> > (PreparingEnlistment preparingEnlistment)
> >
> > > > >>>>> > TEST
> >
> > >
> ===========================================================================­===
> > > > >>>>> > I am attaching it here in the Files section to make it easier
> to
> > > > >>>>> read,
> > > > >>>>> > too:
> >
> > > > >>>>> > namespace Cei.MaterialsTesting.Bugs
> > > > >>>>> > {
> > > > >>>>> >         public class RSBBugs :
> > > > >>>>> > OccasionalConsumerOf<RSBBugs.ConsumerCompleteMessage>
> > > > >>>>> >         {
> > > > >>>>> >                 private WindsorContainer container;
> > > > >>>>> >                 private ManualResetEvent wait;
> >
> > > > >>>>> >                 public RSBBugs()
> > > > >>>>> >                 {
> > > > >>>>> >                         container = new WindsorContainer(new
> > > > >>>>> XmlInterpreter("Bugs/
> > > > >>>>> > RSBBugs.config"));
> > > > >>>>> >                         container.AddFacility("rhino.esb",
> new
> > > > >>>>> RhinoServiceBusFacility
> > > > >>>>> > ().AddMessageModule<UnitOfWorkMessageModule>());
> > > > >>>>> >                         container.AddFacility("trx", new
> > > > >>>>> RhinoTransactionFacility());
> > > > >>>>> >                         container.AddFacility("nh_uow", new
> > > > >>>>> NHibernateUnitOfWorkFacility(
> >
> > > new
> > > > >>>>> > NHibernateUnitOfWorkFacilityConfig(
> >
> > > > >>>>>   Assembly.GetAssembly(typeof
> > > > >>>>> > (BadDateEntity)))));
> >
> > > container.AddComponent<SQLMessageConsumer>();
> >
> > > > >>>>> >                         var cfg = new Configuration()
> >
> > > > >>>>> .SetProperty(Environment.ReleaseConnections, "on_close")
> > > > >>>>> >
> .SetProperty(Environment.Dialect,
> > > > >>>>> > "NHibernate.Dialect.MsSql2005Dialect")
> >
> > > > >>>>> .SetProperty(Environment.ConnectionDriver,
> > > > >>>>> > "NHibernate.Driver.SqlClientDriver")
> >
> > > > >>>>> .SetProperty(Environment.ConnectionString,
>  string.Format("Server=
> > > > >>>>> > (local);initial catalog={0};Integrated Security=SSPI",
> > > > >>>>> > "MaterialsTesting_Test"))
> >
> > > > >>>>> .SetProperty(Environment.ProxyFactoryFactoryClass, typeof
> > > > >>>>> > (ProxyFactoryFactory).AssemblyQualifiedName)
> > > > >>>>> >
> .SetProperty(Environment.ShowSql,
> > > > >>>>> "true")
> >
> > > .SetProperty(Environment.BatchSize,
> > > > >>>>> "10")
> >
> > > > >>>>> .SetProperty(Environment.GenerateStatistics, "true");
> >
> > > cfg.AddXmlFile("Bugs/BadDateEntity.hbm.xml");
> >
> > > > >>>>> >                         SessionFactory =
> > > cfg.BuildSessionFactory();
> > > > >>>>> >                         using (var session =
> > > > >>>>> SessionFactory.OpenSession())
> > > > >>>>> >                         {
> > > > >>>>> >                                 new
> > > SchemaExport(cfg).Execute(false,
> > > > >>>>> true, false,
> > > > >>>>> > session.Connection, null);
> > > > >>>>> >                         }
> > > > >>>>> >                         IoC.Initialize(container);
> > > > >>>>> >                 }
> >
> > > > >>>>> >                 protected ISessionFactory SessionFactory {
> get;
> > > set;
> > > > >>>>> }
> >
> > > > >>>>> >                 [Observation]
> > > > >>>>> >                 public void should_throw()
> > > > >>>>> >                 {
> > > > >>>>> >                         using(var bus =
> > > > >>>>> container.Resolve<IStartableServiceBus>())
> > > > >>>>> >                         {
> > > > >>>>> >                                 bus.Start();
> >
> > > > >>>>> using(bus.AddInstanceSubscription(this))
> > > > >>>>> >                                 {
> > > > >>>>> >                                         wait = new
> > > > >>>>> ManualResetEvent(false);
> > > > >>>>> >                                         bus.Send(new
> > > SQLMessage());
> >
> > > > >>>>> Assert.True(wait.WaitOne(TimeSpan.FromSeconds(60),false));
> > > > >>>>> >                                 }
> > > > >>>>> >                         }
> >
> > ...
> >
> > read more »- Hide quoted text -
> >
> > - Show quoted text -
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to