Mail Notification Failed: SecurityManager Not Available in Async Context (OD-2699)
Yusuf Akbaş opened 1 day ago

I'm experiencing an issue where email notifications are not being triggered in OneDev. The system throws a UnavailableSecurityManagerException when attempting to send emails asynchronously after transaction commit.

	at org.apache.shiro.SecurityUtils.getSecurityManager(SecurityUtils.java:123)
	at org.apache.shiro.subject.Subject$Builder.<init>(Subject.java:626)
	at org.apache.shiro.SecurityUtils.getSubject(SecurityUtils.java:56)
	at io.onedev.server.security.SecurityUtils.inheritSubject(SecurityUtils.java:623)
	at io.onedev.server.CoreModule$2.execute(CoreModule.java:616)
	at io.onedev.server.mail.DefaultMailService.lambda$sendMailAsync$1(DefaultMailService.java:198)
	at io.onedev.server.persistence.DefaultTransactionService$1.afterCompletion(DefaultTransactionService.java:117)
	at org.hibernate.resource.transaction.internal.SynchronizationRegistryStandardImpl.notifySynchronizationsAfterTransactionCompletion(SynchronizationRegistryStandardImpl.java:84)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.afterCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:201)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$400(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:283)
	at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
	at io.onedev.server.persistence.DefaultTransactionService.lambda$call$0(DefaultTransactionService.java:63)
	at io.onedev.server.persistence.DefaultSessionService.call(DefaultSessionService.java:85)
	at io.onedev.server.persistence.DefaultTransactionService.call(DefaultTransactionService.java:53)
	at io.onedev.server.persistence.TransactionInterceptor.invoke(TransactionInterceptor.java:18)
	at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:75)
	at com.google.inject.internal.InterceptorStackCallback.invoke(InterceptorStackCallback.java:55)
	at io.onedev.server.job.DefaultJobService$$EnhancerByGuice$$172834061.on(<generated>)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.onedev.server.event.Listener.notify(Listener.java:19)
	at io.onedev.server.event.DefaultListenerRegistry.invokeListeners(DefaultListenerRegistry.java:104)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$0(DefaultListenerRegistry.java:119)
	at io.onedev.server.persistence.DefaultSessionService.lambda$run$0(DefaultSessionService.java:103)
	at io.onedev.server.persistence.DefaultSessionService.call(DefaultSessionService.java:85)
	at io.onedev.server.persistence.DefaultSessionService.run(DefaultSessionService.java:102)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$1(DefaultListenerRegistry.java:119)
	at io.onedev.commons.utils.LockUtils.call(LockUtils.java:87)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$9d344d3f$1(DefaultListenerRegistry.java:118)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at com.hazelcast.executor.impl.DistributedExecutorService$Processor.run(DistributedExecutorService.java:276)
	at com.hazelcast.internal.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:217)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
	at com.hazelcast.internal.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76)
	at com.hazelcast.internal.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:111)
2026-02-09 14:37:43,408 ERROR [hz.172.27.0.3:5710.cached.thread-7] i.o.s.p.DefaultTransactionService Error executing after commit
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.
	at org.apache.shiro.SecurityUtils.getSecurityManager(SecurityUtils.java:123)
	at org.apache.shiro.subject.Subject$Builder.<init>(Subject.java:626)
	at org.apache.shiro.SecurityUtils.getSubject(SecurityUtils.java:56)
	at io.onedev.server.security.SecurityUtils.inheritSubject(SecurityUtils.java:623)
	at io.onedev.server.CoreModule$2.execute(CoreModule.java:616)
	at io.onedev.server.mail.DefaultMailService.lambda$sendMailAsync$1(DefaultMailService.java:198)
	at io.onedev.server.persistence.DefaultTransactionService$1.afterCompletion(DefaultTransactionService.java:117)
	at org.hibernate.resource.transaction.internal.SynchronizationRegistryStandardImpl.notifySynchronizationsAfterTransactionCompletion(SynchronizationRegistryStandardImpl.java:84)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.afterCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:201)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$400(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:283)
	at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
	at io.onedev.server.persistence.DefaultTransactionService.lambda$call$0(DefaultTransactionService.java:63)
	at io.onedev.server.persistence.DefaultSessionService.call(DefaultSessionService.java:85)
	at io.onedev.server.persistence.DefaultTransactionService.call(DefaultTransactionService.java:53)
	at io.onedev.server.persistence.TransactionInterceptor.invoke(TransactionInterceptor.java:18)
	at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:75)
	at com.google.inject.internal.InterceptorStackCallback.invoke(InterceptorStackCallback.java:55)
	at io.onedev.server.job.DefaultJobService$$EnhancerByGuice$$172834061.on(<generated>)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.onedev.server.event.Listener.notify(Listener.java:19)
	at io.onedev.server.event.DefaultListenerRegistry.invokeListeners(DefaultListenerRegistry.java:104)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$0(DefaultListenerRegistry.java:119)
	at io.onedev.server.persistence.DefaultSessionService.lambda$run$0(DefaultSessionService.java:103)
	at io.onedev.server.persistence.DefaultSessionService.call(DefaultSessionService.java:85)
	at io.onedev.server.persistence.DefaultSessionService.run(DefaultSessionService.java:102)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$1(DefaultListenerRegistry.java:119)
	at io.onedev.commons.utils.LockUtils.call(LockUtils.java:87)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$9d344d3f$1(DefaultListenerRegistry.java:118)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at com.hazelcast.executor.impl.DistributedExecutorService$Processor.run(DistributedExecutorService.java:276)
	at com.hazelcast.internal.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:217)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
	at com.hazelcast.internal.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76)
	at com.hazelcast.internal.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:111)
2026-02-09 14:37:43,425 ERROR [hz.172.27.0.3:5710.cached.thread-7] i.o.s.p.DefaultTransactionService Error executing after commit
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton.  This is an invalid application configuration.
	at org.apache.shiro.SecurityUtils.getSecurityManager(SecurityUtils.java:123)
	at org.apache.shiro.subject.Subject$Builder.<init>(Subject.java:626)
	at org.apache.shiro.SecurityUtils.getSubject(SecurityUtils.java:56)
	at io.onedev.server.security.SecurityUtils.inheritSubject(SecurityUtils.java:623)
	at io.onedev.server.CoreModule$2.execute(CoreModule.java:616)
	at io.onedev.server.persistence.DefaultSessionService.runAsync(DefaultSessionService.java:110)
	at io.onedev.server.persistence.DefaultSessionService.lambda$runAsyncAfterCommit$2(DefaultSessionService.java:121)
	at io.onedev.server.persistence.DefaultTransactionService$1.afterCompletion(DefaultTransactionService.java:117)
	at org.hibernate.resource.transaction.internal.SynchronizationRegistryStandardImpl.notifySynchronizationsAfterTransactionCompletion(SynchronizationRegistryStandardImpl.java:84)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.afterCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:201)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$400(JdbcResourceLocalTransactionCoordinatorImpl.java:40)
	at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:283)
	at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101)
	at io.onedev.server.persistence.DefaultTransactionService.lambda$call$0(DefaultTransactionService.java:63)
	at io.onedev.server.persistence.DefaultSessionService.call(DefaultSessionService.java:85)
	at io.onedev.server.persistence.DefaultTransactionService.call(DefaultTransactionService.java:53)
	at io.onedev.server.persistence.TransactionInterceptor.invoke(TransactionInterceptor.java:18)
	at com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:75)
	at com.google.inject.internal.InterceptorStackCallback.invoke(InterceptorStackCallback.java:55)
	at io.onedev.server.job.DefaultJobService$$EnhancerByGuice$$172834061.on(<generated>)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:569)
	at io.onedev.server.event.Listener.notify(Listener.java:19)
	at io.onedev.server.event.DefaultListenerRegistry.invokeListeners(DefaultListenerRegistry.java:104)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$0(DefaultListenerRegistry.java:119)
	at io.onedev.server.persistence.DefaultSessionService.lambda$run$0(DefaultSessionService.java:103)
	at io.onedev.server.persistence.DefaultSessionService.call(DefaultSessionService.java:85)
	at io.onedev.server.persistence.DefaultSessionService.run(DefaultSessionService.java:102)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$1(DefaultListenerRegistry.java:119)
	at io.onedev.commons.utils.LockUtils.call(LockUtils.java:87)
	at io.onedev.server.event.DefaultListenerRegistry.lambda$post$9d344d3f$1(DefaultListenerRegistry.java:118)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at com.hazelcast.executor.impl.DistributedExecutorService$Processor.run(DistributedExecutorService.java:276)
	at com.hazelcast.internal.util.executor.CachedExecutorServiceDelegate$Worker.run(CachedExecutorServiceDelegate.java:217)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)
	at com.hazelcast.internal.util.executor.HazelcastManagedThread.executeRun(HazelcastManagedThread.java:76)
	at com.hazelcast.internal.util.executor.HazelcastManagedThread.run(HazelcastManagedThread.java:111)
issue 1/1
Type
Bug
Priority
Normal
Assignee
Affected Versions
14.1.0, 14.1.4
Labels
No labels
Issue Votes (0)
Watchers (2)
Reference
OD-2699
Please wait...
Connection lost or session expired, reload to recover
Page is in error, reload to recover