MauroDataMapper / mdm-core

The backend of MDM
Apache License 2.0
6 stars 3 forks source link

Server error on branching or deleting a VF #310

Open jamesrwelch opened 2 years ago

jamesrwelch commented 2 years ago

The same error message is occurring for both deleting (see below) and creating new branches.

{
  "headers": {
    "normalizedNames": {},
    "lazyUpdate": null
  },
  "status": 500,
  "statusText": "OK",
  "url": "https://modelcatalogue.cs.ox.ac.uk/nhsd-datadictionary/api/versionedFolders/1a111946-0e26-4a89-9c3f-388c13d415fd?permanent=true",
  "ok": false,
  "name": "HttpErrorResponse",
  "message": "Http failure response for https://modelcatalogue.cs.ox.ac.uk/nhsd-datadictionary/api/versionedFolders/1a111946-0e26-4a89-9c3f-388c13d415fd?permanent=true: 500 OK",
  "error": {
    "status": 500,
    "reason": "Internal Server Error",
    "errorCode": "GBSPMS",
    "message": "Cannot store on an unlocked GroupBasedUserSecurityPolicyManager",
    "path": "/api/versionedFolders/1a111946-0e26-4a89-9c3f-388c13d415fd",
    "version": "5.2.0-SNAPSHOT",
    "exception": {
      "type": "ApiInternalException",
      "message": "Cannot store on an unlocked GroupBasedUserSecurityPolicyManager",
      "stacktrace": [
        "uk.ac.ox.softeng.maurodatamapper.security.policy.GroupBasedSecurityPolicyManagerService.$tt__storeUserSecurityPolicyManager(GroupBasedSecurityPolicyManagerService.groovy:213)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.security.policy.GroupBasedSecurityPolicyManagerService$__tt__groupBasedSecurityPolicyManagerService_removeSecurityForSecurableResourceIds_closure32$_closure37.doCall(GroupBasedSecurityPolicyManagerService.groovy:142)",
        "uk.ac.ox.softeng.maurodatamapper.security.policy.GroupBasedSecurityPolicyManagerService$__tt__groupBasedSecurityPolicyManagerService_removeSecurityForSecurableResourceIds_closure32.doCall(GroupBasedSecurityPolicyManagerService.groovy:138)",
        "uk.ac.ox.softeng.maurodatamapper.security.policy.GroupBasedSecurityPolicyManagerService.$tt__groupBasedSecurityPolicyManagerService_removeSecurityForSecurableResourceIds(GroupBasedSecurityPolicyManagerService.groovy:136)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.model.ModelService.deleteAll(ModelService.groovy:241)",
        "uk.ac.ox.softeng.maurodatamapper.datamodel.DataModelService.$tt__dataModelService_deleteAllInContainer(DataModelService.groovy:882)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService$__tt__delete_closure52.doCall(FolderService.groovy:162)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__delete(FolderService.groovy:162)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService$__tt__delete_closure51.doCall(FolderService.groovy:161)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__delete(FolderService.groovy:161)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService$__tt__delete_closure51.doCall(FolderService.groovy:161)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__delete(FolderService.groovy:161)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderService.$tt__delete(VersionedFolderService.groovy:392)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderController.$tt__versionedFolderController_delete(VersionedFolderController.groovy:91)",
        "grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)",
        "org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)",
        "grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)",
        "org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)",
        "org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)",
        "org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)",
        "org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)",
        "org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)",
        "org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)",
        "org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:931)",
        "org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)",
        "org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)",
        "org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:126)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:64)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:101)",
        "org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:119)"
      ]
    }
  }
}
jamesrwelch commented 2 years ago

Stack trace for a new branch:

jamesrwelch commented 2 years ago
2022-05-24 14:32:10,239 [080-exec-1] ERROR o.g.web.errors.GrailsExceptionResolver   : ApiInternalException occurred when processing request: [PUT] /api/versionedFolders/5ca6ec5d-f874-4f20-bb66-282b39c522f1/newBranchModelVersion
Cannot store on an unlocked GroupBasedUserSecurityPolicyManager. Stacktrace follows:
uk.ac.ox.softeng.maurodatamapper.api.exception.ApiInternalException: Cannot store on an unlocked GroupBasedUserSecurityPolicyManager
        at uk.ac.ox.softeng.maurodatamapper.security.policy.GroupBasedSecurityPolicyManagerService.$tt__storeUserSecurityPolicyManager(GroupBasedSecurityPolicyManagerService.groovy:213)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.security.policy.GroupBasedSecurityPolicyManagerService.$tt__refreshUserSecurityPolicyManager(GroupBasedSecurityPolicyManagerService.groovy:239)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.security.policy.GroupBasedSecurityPolicyManagerService.$tt__groupBasedSecurityPolicyManagerService_addSecurityForSecurableResource(GroupBasedSecurityPolicyManagerService.groovy:119)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolderPass(FolderService.groovy:378)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService$__tt__copyFolderContents_closure63.doCall(FolderService.groovy:442)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolderContents(FolderService.groovy:431)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolderPass(FolderService.groovy:383)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService$__tt__copyFolderContents_closure63.doCall(FolderService.groovy:442)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolderContents(FolderService.groovy:431)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolderPass(FolderService.groovy:383)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.FolderService.$tt__copyFolder(FolderService.groovy:336)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderService.$tt__copyVersionedFolder(VersionedFolderService.groovy:560)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderService.$tt__copyFolderAsNewBranchFolder(VersionedFolderService.groovy:536)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderService.$tt__createNewBranchModelVersion(VersionedFolderService.groovy:476)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at uk.ac.ox.softeng.maurodatamapper.core.container.VersionedFolderController.$tt__newBranchModelVersion(VersionedFolderController.groovy:181)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at grails.gorm.transactions.GrailsTransactionTemplate$2.doInTransaction(GrailsTransactionTemplate.groovy:94)
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140)
        at grails.gorm.transactions.GrailsTransactionTemplate.execute(GrailsTransactionTemplate.groovy:91)
        at org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker.invoke(DefaultGrailsControllerClass.java:223)
        at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
        at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
        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.doPut(FrameworkServlet.java:920)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
        at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
        at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:126)
olliefreeman commented 2 years ago

due to the way the code is called theres no way for the lock to be removed by the same process, therefore the lock must being removed by another competing process. Therefore the solution is to have the "lock" call actually "holdForLock" to allow any other process to complete and unlock the policy before relocking and starting a new run

olliefreeman commented 2 years ago

unfortunately this doesnt seem to be replicatable locally, so i'm going to push a fix which will have to be tested insitu inside the nhsdd instance