'Grails 5 upgrade using Neo4j database receives ResultConsumedException on database queries

I am working on upgrading a Grails application from v4 to v5. We use Neo4j as the backend database (currently v3.5). I can get the application to run, but queries to the database result in the following exception:

org.neo4j.driver.exceptions.ResultConsumedException: Cannot access records on this result any more as the result has already been consumed or the query runner where the result is created has already been closed.
at org.neo4j.driver.internal.util.Futures.blockingGet(Futures.java:144)
at org.neo4j.driver.internal.InternalResult.blockingGet(InternalResult.java:122)
at org.neo4j.driver.internal.InternalResult.hasNext(InternalResult.java:58)
at org.grails.datastore.gorm.query.AbstractResultList$1.hasNext(AbstractResultList.java:168)
at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:466)
at java.base/java.lang.String.valueOf(String.java:2951)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:172)
at java.base/java.util.AbstractMap.toString(AbstractMap.java:556)
at java.base/java.lang.String.valueOf(String.java:2951)
at java.base/java.lang.StringBuilder.append(StringBuilder.java:172)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:310)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1401)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1145)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1084)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:645)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:750)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:111)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:219)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:213)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:327)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:115)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:81)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116)
at grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter.doFilter(UpdateRequestContextHolderExceptionTranslationFilter.groovy:64)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter.doFilter(GrailsAnonymousAuthenticationFilter.groovy:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:102)
at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:93)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:219)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:213)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:219)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:213)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:64)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:110)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:80)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.csrf.CsrfFilter.doFilterInternal(CsrfFilter.java:117)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:336)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:211)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:183)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:359)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1735)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.base/java.lang.Thread.run(Thread.java:829)
Suppressed: org.neo4j.driver.internal.util.ErrorUtil$InternalExceptionCause: null
    at org.neo4j.driver.internal.util.ErrorUtil.newResultConsumedError(ErrorUtil.java:63)
    at org.neo4j.driver.internal.cursor.DisposableAsyncResultCursor.assertNotDisposed(DisposableAsyncResultCursor.java:112)
    at org.neo4j.driver.internal.cursor.DisposableAsyncResultCursor.peekAsync(DisposableAsyncResultCursor.java:66)
    ... 104 common frames omitted

The build.gradle file is as follows. We are currently using Gradle v7.4.1:

buildscript {
    repositories {
        maven { url "https://repo.grails.org/grails/core" }
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath "org.grails:grails-gradle-plugin:$grailsGradlePluginVersion"
        classpath "gradle.plugin.com.github.erdi.webdriver-binaries:webdriver-binaries-gradle-plugin:2.0"
        classpath "com.bertramlabs.plugins:asset-pipeline-gradle:3.3.4"
        classpath "org.owasp:dependency-check-gradle:6.3.1"
    }
}

version "0.1"
group "org.myorg.myapp"

apply plugin:"eclipse"
apply plugin:"idea"
apply plugin:"war"
apply plugin:"org.grails.grails-web"
apply plugin:"com.github.erdi.webdriver-binaries"
apply plugin:"com.bertramlabs.asset-pipeline"
apply plugin:"org.grails.grails-gsp"
apply plugin: "org.owasp.dependencycheck"

ext {
    drivers = ["firefox", "chrome", "chromeHeadless"]
}

repositories {
    maven { url "https://repo.grails.org/grails/core" }
    mavenCentral()
}

sourceSets {
    integrationTest {
        groovy {
            srcDir file("src/integration-test/groovy")
            compileClasspath += sourceSets.main.output + sourceSets.test.output + configurations.testRuntime
            runtimeClasspath += sourceSets.main.output + sourceSets.test.output + configurations.testRuntime
        }
        resources.srcDir file("src/integration-test/resources")
    }
}

bootWar {
    archiveName "ROOT.war"
}

configurations {
    integrationTestCompile.extendsFrom testCompileOnly
    integrationTestRuntime.extendsFrom testRuntimeOnly
    integrationTestImplementation.extendsFrom testImplementation
    
    developmentOnly
    runtimeClasspath {
        extendsFrom developmentOnly
    }
}

dependencies {
    developmentOnly "org.springframework.boot:spring-boot-devtools"
    implementation "org.springframework.boot:spring-boot-starter-logging"
    implementation "org.springframework.boot:spring-boot-autoconfigure"
    implementation "org.grails:grails-core"
    implementation "org.grails:grails-web-boot"
    implementation "org.grails:grails-logging"
    implementation "org.grails:grails-plugin-databinding"
    implementation "org.grails:grails-plugin-i18n"
    implementation "org.grails.plugins:async"
    implementation "org.grails.plugins:scaffolding"
    implementation "org.grails:grails-plugin-rest"
    implementation "org.grails.plugins:events"
    implementation "org.grails.plugins:cache"
    implementation "org.grails:grails-plugin-url-mappings"
    implementation "org.grails:grails-plugin-interceptors"
    implementation "org.grails.plugins:gsp"
    implementation group: "org.grails.plugins", name: "spring-security-core", version: "4.0.3"
    implementation "org.grails.plugins:mail:3.0.0"
    implementation group: "org.springframework", name: "spring-core", version: "5.3.16"
    implementation group: "org.codehaus.groovy", name: "groovy-dateutil"
    implementation group: "org.grails", name: "grails-plugin-services"
    implementation group: "org.springframework.boot", name: "spring-boot-starter-tomcat"
    implementation group: "org.springframework.boot", name: "spring-boot-starter-actuator"
    implementation group: "org.springframework.boot", name: "spring-boot-starter-validation"
    implementation group: "org.grails.plugins", name: "neo4j"
    implementation files("lib/dxlclient-0.2.7.jar")
    implementation group: "org.grails.plugins", name: "spring-security-ui", version: "4.0.0.M1"
    implementation group: "io.jsonwebtoken", name: "jjwt-api", version: "0.11.2"
    implementation group: "io.jsonwebtoken", name: "jjwt-impl", version: "0.11.2"
    implementation group: "io.jsonwebtoken", name: "jjwt-jackson", version: "0.11.2"
    implementation group: "com.opencsv", name: "opencsv", version: "5.6"
    implementation group: "org.apache.poi", name: "poi-ooxml", version: "5.2.1"
    implementation "org.quartz-scheduler:quartz"
    implementation "org.grails.plugins:quartz:2.0.13"
    testImplementation group: "org.grails", name: "grails-web-testing-support"
    testImplementation group: "com.h2database", name: "h2"
    testImplementation "io.micronaut:micronaut-inject-groovy"
    console "org.grails:grails-console"
    profile "org.grails.profiles:web"
    runtimeOnly "org.glassfish.web:el-impl:2.2.1-b05"
    runtimeOnly "org.apache.tomcat:tomcat-jdbc"
    runtimeOnly "javax.xml.bind:jaxb-api"
    runtimeOnly "com.bertramlabs.plugins:asset-pipeline-grails:3.3.1"
    testImplementation "org.grails:grails-gorm-testing-support"
    testImplementation "org.mockito:mockito-core"
    testImplementation "org.seleniumhq.selenium:selenium-remote-driver:3.14.0"
    testImplementation "org.seleniumhq.selenium:selenium-api:3.14.0"
    integrationTestImplementation group: "org.grails.plugins", name: "geb"
    testImplementation "org.seleniumhq.selenium:selenium-chrome-driver:3.141.59"
    testImplementation "org.seleniumhq.selenium:selenium-firefox-driver:3.141.59"
    testImplementation group: "io.github.bonigarcia", name: "webdrivermanager", version: "5.1.0"
    implementation group: "org.codehaus.janino", name: "janino", version: "3.1.6"
}

bootRun {
    jvmArgs(
        "-Dspring.output.ansi.enabled=always", 
        "-noverify", 
        "-XX:TieredStopAtLevel=1",
        "-Xmx1024m")
    sourceResources sourceSets.main
    String springProfilesActive = "spring.profiles.active"
    systemProperty springProfilesActive, System.getProperty(springProfilesActive)
}

springBoot {
    mainClass.set("org.myorg.Application")
}

integrationTest {
    systemProperties System.properties
    outputs.upToDateWhen { false }
//    For debugging
//    testLogging.showExceptions = true
//    testLogging.showStandardStreams = true
//    testLogging.exceptionFormat = "full"
//    toggle for UI tests
//    exclude "UI/**"
}

tasks.withType(Test) {
    maxHeapSize = "2g"
    jvmArgs "-XX:MaxMetaspaceSize=1024m"
    testLogging {
        exceptionFormat = "full"
    }
}

tasks.withType(GroovyCompile) {
    groovyOptions.forkOptions.memoryMaximumSize = "256m"
}

assets {
    minifyJs = true
    minifyCss = true
}

dependencyCheck {
    formats=["HTML","JUNIT"]
    suppressionFile="${rootProject.projectDir}/suppression.xml"

    String environment = System.getenv("DEPENDENCY_CHECK_ENV")

    if (environment.equals("PRODUCTION")) {
        failBuildOnCVSS=7.0
    }
}

The gradle.properties file:

grailsVersion=5.1.3
grailsGradlePluginVersion=5.1.3
groovyVersion=3.0.7
gormVersion=7.2.1

Any suggestions for resolving this issue would be greatly appreciated.

UPDATE 3/21/2022: If I debug my upgraded application and step through the code, everything works fine. If I turn off debugging, and simply run the application from my IDE, then I get the ResultConsumedException all throughout the application. This behavior seems to indicate that a race condition is occurring...possibly a bug?

SOLUTION: I found some improper usages of the GORM @Transactional annotation in our code. The latest version of GORM must be more strict in enforcing adherence to its specification. After adding or removing the @Transactional annotation to/from various application classes and methods, everything started working without any code changes.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source