Description
Anton created an issue — 1st June 2011, 0:34:54:
When using LockMode over remoting between PCs with x86 and 64bit operating systems there is different result in GetHashCode.
It leads to error "LockMode Upgrade not supported by NHibernate.Persister.Entity.SingleTableEntityPersister " when I pass LockMode.Upgrade from x86 to 64bit to dosession.Lock(this, lockMode)
It is caused by generating and storing hash code upon creating instance of LockMode.
LockMode constructor uses a XOR (^) operand to generate and store hash code, and it has different behavior depends on OS type (x84, 64bit)
Anton added a comment — 1st June 2011, 0:39:02:
Here is callstack:
Server stack trace:
в NHibernate.Persister.Entity.AbstractEntityPersister.GetLocker(LockMode lockMode) в D:\Projects\NHibernate.trunk\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:строка 1730
в NHibernate.Persister.Entity.AbstractEntityPersister.Lock(Object id, Object version, Object obj, LockMode lockMode, ISessionImplementor session) в D:\Projects\NHibernate.trunk\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:строка 1734
в NHibernate.Event.Default.AbstractLockUpgradeEventListener.UpgradeLock(Object entity, EntityEntry entry, LockMode requestedLockMode, ISessionImplementor source) в D:\Projects\NHibernate.trunk\src\NHibernate\Event\Default\AbstractLockUpgradeEventListener.cs:строка 71
в NHibernate.Event.Default.DefaultLockEventListener.OnLock(LockEvent event) в D:\Projects\NHibernate.trunk\src\NHibernate\Event\Default\DefaultLockEventListener.cs:строка 55
в NHibernate.Impl.SessionImpl.FireLock(LockEvent lockEvent) в D:\Projects\NHibernate.trunk\src\NHibernate\Impl\SessionImpl.cs:строка 2520
в NHibernate.Impl.SessionImpl.Lock(Object obj, LockMode lockMode) в D:\Projects\NHibernate.trunk\src\NHibernate\Impl\SessionImpl.cs:строка 767
Fabio Maulo added a comment — 1st June 2011, 4:46:26:
and the exception message ?
Anton added a comment — 1st June 2011, 5:05:22:
It is in issue description :)
"LockMode Upgrade not supported by NHibernate.Persister.Entity.SingleTableEntityPersister"
Fabio Maulo added a comment — 1st June 2011, 6:03:22:
What you are doing is pass the NH's LockMode serializaed instance between 2 different machines, right ?
Anton added a comment — 1st June 2011, 6:44:51:
Yes, LockMode just passes from client to server PC, client is x86, server is 64bit.
When using client 64bit and server 64bit - everything ok.Stored hashcode in instance of LockMode differs at 86/64
Fabio Maulo added a comment — 1st June 2011, 7:57:23:
Well... that is not the only one place where NH store the hash code at ctor.