I've debugged the last part of the process  where hibernate tries to get a 
connection to the database, starting with a breakpoint 
in org.h2.engine.Engine.createSession(Engine.java:201)

    public static SessionLocal createSession(ConnectionInfo ci) {
        try {
            SessionLocal session = openSession(ci);

ci = {ConnectionInfo} 
 prop = {Properties}  size = 5 <-- The properties are parsed correctly from 
the original url.
  "LOCK_TIMEOUT" -> "60000"
  "DB_CLOSE_DELAY" -> "-1"
  "MODE" -> "Oracle"
  "DB_CLOSE_ON_EXIT" -> "FALSE"
  "TRACE_LEVEL_SYSTEM_OUT" -> "0"
 originalURL = 
"jdbc:h2:mem:SVIFT;MODE=Oracle;DB_CLOSE_DELAY=-1;TRACE_LEVEL_SYSTEM_OUT=0;LOCK_TIMEOUT=60000;DB_CLOSE_ON_EXIT=FALSE"
 url = "jdbc:h2:mem:SVIFT"
 user = "PUBLIC"
 name = "mem:SVIFT"

This runs to L222: session = openSession(ci, ifExists, forbidCreation, 
cipher);
 ifExists (slot_1) = 0
forbidCreation (slot_2) = 0
ignoreUnknownSetting (slot_3) = 0
cipher (slot_4) = null

Then to L107:
                if (!found) {
                    // users is the last thing we add, so if no user is 
around,
                    // the database is new (or not initialized correctly)
                    user = new User(database, database.allocateObjectId(), 
ci.getUserName(), false);
                    user.setAdmin(true);
                    user.setUserPasswordHash(ci.getUserPasswordHash());
                    database.setMasterUser(user); <-- Here

public synchronized void setMasterUser(User user) {
        lockMeta(systemSession);
        addDatabaseObject(systemSession, user); <-- Here

systemSession:
result = {SessionLocal} "#0 (user: DBA, INIT)"
 serialId = 0
 database = {Database} "SVIFT:org.h2.engine.Database"
 user = {User} "DBA:0:org.h2.engine.User"
 id = 1
 networkConnectionInfo = null
 locks = {ArrayList}  size = 1
 autoCommit = true
 random = null
 lockTimeout = 2000
 nextValueFor = null
 currentValueFor = null
 lastIdentity = {ValueNul} "NULL"
 savepoints = null
 localTempTables = null
 localTempTableIndexes = null
 localTempTableConstraints = null
 throttleMs = 0
 lastThrottleNs = 0
 currentCommand = null
 allowLiterals = false
 currentSchemaName = "PUBLIC"
 schemaSearchPath = null
 trace = null
 removeLobMap = null
 systemIdentifier = 0
 procedures = null
 autoCommitAtTransactionEnd = false
 currentTransactionName = null
 cancelAtNs = 0
 sessionStart = {ValueTimestampTimeZone} "TIMESTAMP WITH TIME ZONE 
'2023-10-25 12:48:23.230424874+02'"
 commandStartOrEnd = {Instant} "2023-10-25T10:48:23.230424874Z"
 currentTimestamp = null
 variables = null
 queryTimeout = 0
 commitOrRollbackDisabled = false
 waitForLock = null
 waitForLockThread = null
 modificationId = 0
 objectId = 0
 queryCacheSize = 8
 queryCache = null
 modificationMetaID = -1
 createViewLevel = 0
 viewIndexCache = null
 derivedTableIndexCache = null
 lazyQueryExecution = false
 nonKeywords = null
 timeZone = {TimeZoneProvider$WithTimeZone} "TimeZoneProvider Europe/Oslo"
 tablesToAnalyze = null
 temporaryResultLobs = null
 temporaryLobs = null
 transaction = null
 state = {AtomicReference} "INIT"
 startStatement = -1
 isolationLevel = {IsolationLevel} "READ_COMMITTED"
 snapshotDataModificationId = 0
 idsToRelease = null
 truncateLargeLength = false
 variableBinary = false
 oldInformationSchema = false
 quirksMode = false
 lock = {ReentrantLock} "java.util.concurrent.locks.ReentrantLock[Unlocked]"
 sessionState = null
 sessionStateChanged = true
 sessionStateUpdating = false
 staticSettings = null

user = {User} "PUBLIC:2:org.h2.engine.User"
 systemUser = false
 salt = {byte[8]
 passwordHash = {byte[32]}
 admin = true
 grantedRoles = null
 grantedRights = null
 database = {Database} "SVIFT:org.h2.engine.Database"
 trace = {Trace} 
 comment = null
 id = 2
 objectName = "PUBLIC"
 modificationId = 1
 temporary = false

Then to     public synchronized void addDatabaseObject(SessionLocal 
session, DbObject obj) { <-- obj is the User above
        int id = obj.getId();
        if (id > 0 && !starting) {
            checkWritingAllowed(); <-- OK
        }
        ConcurrentHashMap<String, DbObject> map = getMap(obj.getType()); 
<-- getMap(type = 2 which is USER) returns the content of 
Database.usersAndRoles
        if (obj.getType() == DbObject.USER) {
            User user = (User) obj;
            if (user.isAdmin() && 
systemUser.getName().equals(SYSTEM_USER_NAME)) {
                systemUser.rename(user.getName());
            }
        }
        String name = obj.getName(); <-- returns PUBLIC
        if (SysProperties.CHECK && map.get(name) != null) {
            throw DbException.getInternalError("object already exists"); 
<-- Enters this, both names are "PUBLIC".
        }

map (slot_4) = {ConcurrentHashMap}  size = 1
 "PUBLIC" -> {Role} "PUBLIC:0:org.h2.engine.Role"
  key = "PUBLIC"
  value = {Role} "PUBLIC:0:org.h2.engine.Role"
   system = true
   grantedRoles = null
   grantedRights = null
   database = {Database} "SVIFT:org.h2.engine.Database"
   trace = {Trace} 
   comment = null
   id = 0
   objectName = "PUBLIC"
   modificationId = 0
   temporary = false

In the getInternalError()-method of DbException, the static content of the 
class contains the OutOfMemoryError posted previously. It might not be 
related to the problem that occurs.

Does any of this indicate to you what the problem is?

On Wednesday, 25 October 2023 at 11:08:39 UTC+2 Knut Skomedal wrote:

> The same Exception occurs when I run a single test manually in
> intelliJ, so I doubt that it's a race condition between two tests.
>
> By setting a breakpoint where the previous stacktrace has the last 
> statement:
> Caused by: java.lang.RuntimeException: object already exists
> at org.h2.message.DbException.getInternalError(DbException.java:355)
> I find an OutOfMEmoryError:
>
> serialVersionUID = 1
> HIDE_SQL = "--hide--"
> MESSAGES = {Properties@5409} size = 202
> SQL_OOME = {SQLException@5410} "java.sql.SQLException: OutOfMemoryError"
> SQLState = "HY000"
> vendorCode = 90108
> next = null
> backtrace = {Object[6]@7812}
> detailMessage = "OutOfMemoryError"
> cause = {OutOfMemoryError@7813} "java.lang.OutOfMemoryError"
> stackTrace = {StackTraceElement[63]@7815}
> 0 = {StackTraceElement@7817}
> "org.h2.message.DbException.<clinit>(DbException.java:62)"
> 1 = {StackTraceElement@7818}
> "org.h2.message.TraceObject.<clinit>(TraceObject.java:108)"
> 2 = {StackTraceElement@7819}
>
> "java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native
> Method)"
> 3 = {StackTraceElement@7820}
>
> "java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)"
> 4 = {StackTraceElement@7821}
>
> "java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)"
> 5 = {StackTraceElement@7822}
>
> "java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)"
> 6 = {StackTraceElement@7823}
> "java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)"
> 7 = {StackTraceElement@7824}
> "org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:211)"
> 8 = {StackTraceElement@7825}
>
> "org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87)"
> 9 = {StackTraceElement@7826}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1326)"
> 10 = {StackTraceElement@7827}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1232)"
> 11 = {StackTraceElement@7828}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)"
> 12 = {StackTraceElement@7829}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)"
> 13 = {StackTraceElement@7830}
>
> "org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)"
> 14 = {StackTraceElement@7831}
>
> "org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)"
> 15 = {StackTraceElement@7832}
>
> "org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)"
> 16 = {StackTraceElement@7833}
>
> "org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)"
> 17 = {StackTraceElement@7834}
>
> "org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)"
> 18 = {StackTraceElement@7835}
>
> "org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113)"
> 19 = {StackTraceElement@7836}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1707)"
> 20 = {StackTraceElement@7837}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1452)"
> 21 = {StackTraceElement@7838}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619)"
> 22 = {StackTraceElement@7839}
>
> "org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)"
> 23 = {StackTraceElement@7840}
>
> "org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)"
> 24 = {StackTraceElement@7841}
>
> "org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)"
> 25 = {StackTraceElement@7842}
>
> "org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)"
> 26 = {StackTraceElement@7843}
>
> "org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)"
> 27 = {StackTraceElement@7844}
>
> "org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)"
> 28 = {StackTraceElement@7845}
>
> "org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)"
> 29 = {StackTraceElement@7846}
>
> "org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)"
> 30 = {StackTraceElement@7847}
>
> "org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:127)"
> 31 = {StackTraceElement@7848}
>
> "org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)"
> 32 = {StackTraceElement@7849}
>
> "org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:276)"
> 33 = {StackTraceElement@7850}
>
> "org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:244)"
> 34 = {StackTraceElement@7851}
>
> "org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:141)"
> 35 = {StackTraceElement@7852}
>
> "org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:90)"
> 36 = {StackTraceElement@7853}
>
> "org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:124)"
> 37 = {StackTraceElement@7854}
>
> "org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)"
> 38 = {StackTraceElement@7855}
>
> "org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)"
> 39 = {StackTraceElement@7856}
>
> "org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:248)"
> 40 = {StackTraceElement@7857}
>
> "org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)"
> 41 = {StackTraceElement@7858}
>
> "org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)"
> 42 = {StackTraceElement@7859}
>
> "org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)"
> 43 = {StackTraceElement@7860}
>
> "org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)"
> 44 = {StackTraceElement@7861}
>
> "org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)"
> 45 = {StackTraceElement@7862}
>
> "org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)"
> 46 = {StackTraceElement@7863}
> "org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)"
> 47 = {StackTraceElement@7864}
> "org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)"
> 48 = {StackTraceElement@7865}
> "org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)"
> 49 = {StackTraceElement@7866}
> "org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)"
> 50 = {StackTraceElement@7867}
> "org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)"
> 51 = {StackTraceElement@7868}
>
> "org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)"
> 52 = {StackTraceElement@7869}
>
> "org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)"
> 53 = {StackTraceElement@7870}
> "org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)"
> 54 = {StackTraceElement@7871}
> "org.junit.runners.ParentRunner.run(ParentRunner.java:413)"
> 55 = {StackTraceElement@7872}
>
> "org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)"
> 56 = {StackTraceElement@7873}
> "org.junit.runner.JUnitCore.run(JUnitCore.java:137)"
> 57 = {StackTraceElement@7874}
>
> "com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)"
> 58 = {StackTraceElement@7875}
>
> "com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)"
> 59 = {StackTraceElement@7876}
>
> "com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)"
> 60 = {StackTraceElement@7877}
>
> "com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)"
> 61 = {StackTraceElement@7878}
>
> "com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)"
> 62 = {StackTraceElement@7879}
> "com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)"
> depth = 63
> suppressedExceptions = {Collections$EmptyList@5413} size = 0
>
> On Wed, Oct 25, 2023 at 9:27 AM Noel Grandin <noelg...@gmail.com> wrote:
> >
> > My best guess right now is that you are using named in-memory databases, 
> which means that the unit tests are sharing an
> > in-memory database, and you are hitting a race condition (TOCTOU) in 
> that chunk of code.
> >
> > Short of fixing the H2 code, the only thing I can suggest is using 
> different databases for different unit tests.
>

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to h2-database+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/h2-database/c6f9b562-1b15-44de-b32b-3b832d7d9f48n%40googlegroups.com.

Reply via email to