Details
Description
Issue Summary
When a hook script is added to a repository but not used for some time, it is deleted and the subsequent triggers result into an exception.
This is reproducible on Data Center: yes
Steps to Reproduce
- Set following configuration in BITBUCKET_HOME/mesh/mesh.properties file -
- hookscripts.gc.prune=1
- hookscripts.gc.raw-interval=PT5M
- Start Bitbucket with child sidecar
- Create a repository with some content
- Use /rest/api/latest/hook-scripts to register a simple PRE receive hook script.
- Use /rest/api/latest/projects/<PROJECT_KEY>/repos/<SLUG>/hook-scripts/<script-id> to configure hook script for "push" trigger.
- Push a change in the repository and verify that the hook gets triggered.
- Push another change after about 55 minutes.
- Wait for a little more than 1 hour 10 minutes since the first push OR till this message appears in the atlassian-mesh.log -
2022-11-14 22:12:38,639 INFO [task-scheduler1] - c.a.b.m.g.h.s.DefaultHookScriptManager Deleted stale hook script 1-0
- Push another change in the repository.
Expected Results
Pushing the commit is successful and the hook script gets triggered without any error.
Actual Results
Pushing fails with an error "remote: Hook script hook-scripts/1/0 not foundtest-script failed" and the below exception is thrown in the atlassian-mesh.log file:
2022-11-14 22:13:08,292 WARN [grpc-server:thread-4] admin 5O1LBAB4x1333x9x3 @AAK0IVx1333x3x0 127.0.0.1 "HookScriptService/CallHookScripts" (>1 <1) c.a.b.m.g.Call HookScriptsRequestObserver Client sent onCompleted, but some hook scripts have not been received: [hook-scripts/1/0] 2022-11-14 22:13:08,413 ERROR [grpc-server:thread-4] admin 5O1LBAB4x1333x9x3 @AAK0IVx1333x3x0 127.0.0.1 "HookScriptService/CallHookScripts" (>1 <1) c.a.b.m.g.h.s. DefaultHookScriptManager Hook script hook-scripts/1/0 not found com.atlassian.bitbucket.mesh.git.hook.script.HookScriptNotFoundException: There is no hook script with ID 'hook-scripts/1/0' at com.atlassian.bitbucket.mesh.git.hook.script.DefaultHookScriptManager.getPathOrThrow(DefaultHookScriptManager.java:367) at com.atlassian.bitbucket.mesh.git.hook.script.DefaultHookScriptManager.callHookScript(DefaultHookScriptManager.java:286) at com.atlassian.bitbucket.mesh.git.hook.script.DefaultHookScriptManager.call(DefaultHookScriptManager.java:122) at com.atlassian.bitbucket.mesh.git.hook.script.DefaultHookScriptManager$$FastClassBySpringCGLIB$$8f7b2ecf.invoke(<generated>)
and the following exception in atlassian-bitbucket.log
2022-11-14 22:13:08,280 INFO [mesh-grpc-request:thread-5] admin @AAK0IVx1333x3x0 127.0.0.1 "POST /scm/project_1/rep_1.git/git-receive-pack HTTP/1.1" c.a.s.i.s.g.m.GrpcHookScriptClient Sending missing hook scripts [hook-scripts/1/0] 2022-11-14 22:13:08,284 ERROR [mesh-grpc-request:thread-5] admin @AAK0IVx1333x3x0 127.0.0.1 "POST /scm/project_1/rep_1.git/git-receive-pack HTTP/1.1" c.a.s.i.h.script.DiskHookScriptStore 1: No file exists for version 0 java.nio.file.NoSuchFileException: /private/tmp/amps-standalone-bitbucket-LATEST/target/bitbucket/home/shared/config/hook-scripts/1-0 at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) at java.nio.file.Files.newByteChannel(Files.java:361) at java.nio.file.Files.newByteChannel(Files.java:407) at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384) at java.nio.file.Files.newInputStream(Files.java:152) at com.atlassian.stash.internal.hook.script.DiskHookScriptStore.getExecutable(DiskHookScriptStore.java:181) at com.atlassian.stash.internal.hook.script.DiskHookScriptStore.read(DiskHookScriptStore.java:212) at com.atlassian.stash.internal.hook.script.MeshHookScriptInvoker$PreUpdateHookCallback.onMissingScript(MeshHookScriptInvoker.java:361) at com.atlassian.stash.internal.scm.git.mesh.GrpcHookScriptClient$CallHookScriptsObserver.sendMissingScript(GrpcHookScriptClient.java:183) at com.atlassian.stash.internal.scm.git.mesh.GrpcHookScriptClient$CallHookScriptsObserver.onNext(GrpcHookScriptClient.java:136) at com.atlassian.stash.internal.scm.git.mesh.GrpcHookScriptClient$CallHookScriptsObserver.onNext(GrpcHookScriptClient.java:65) at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onMessage(ClientCalls.java:466) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at com.atlassian.stash.internal.scm.git.mesh.StatefulClientCallListener.onMessage(StatefulClientCallListener.java:45) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at com.atlassian.stash.internal.scm.git.mesh.DeadlinePropagatingClientInterceptor$DeadlinePropagatingListener.onMessage(DeadlinePropagatingClientInterceptor.java:169) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:661) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:646) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.lang.Thread.run(Thread.java:748) ... 1 frame trimmed 2022-11-14 22:13:08,287 WARN [mesh-grpc-request:thread-5] admin @AAK0IVx1333x3x0 127.0.0.1 "POST /scm/project_1/rep_1.git/git-receive-pack HTTP/1.1" c.a.s.i.s.g.m.GrpcHookScriptClient [PROJECT_1/rep_1[1]] Could not send hook script hook-scripts/1/0 to git agent com.atlassian.bitbucket.hook.script.HookScriptStoreException: Hook script version 1 could not be read. at com.atlassian.stash.internal.hook.script.DiskHookScriptStore.getExecutable(DiskHookScriptStore.java:199) at com.atlassian.stash.internal.hook.script.DiskHookScriptStore.read(DiskHookScriptStore.java:212) at com.atlassian.stash.internal.hook.script.MeshHookScriptInvoker$PreUpdateHookCallback.onMissingScript(MeshHookScriptInvoker.java:361) at com.atlassian.stash.internal.scm.git.mesh.GrpcHookScriptClient$CallHookScriptsObserver.sendMissingScript(GrpcHookScriptClient.java:183) at com.atlassian.stash.internal.scm.git.mesh.GrpcHookScriptClient$CallHookScriptsObserver.onNext(GrpcHookScriptClient.java:136) at com.atlassian.stash.internal.scm.git.mesh.GrpcHookScriptClient$CallHookScriptsObserver.onNext(GrpcHookScriptClient.java:65) at io.grpc.stub.ClientCalls$StreamObserverToCallListenerAdapter.onMessage(ClientCalls.java:466) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at com.atlassian.stash.internal.scm.git.mesh.StatefulClientCallListener.onMessage(StatefulClientCallListener.java:45) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at com.atlassian.stash.internal.scm.git.mesh.DeadlinePropagatingClientInterceptor$DeadlinePropagatingListener.onMessage(DeadlinePropagatingClientInterceptor.java:169) at io.grpc.ForwardingClientCallListener.onMessage(ForwardingClientCallListener.java:33) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal(ClientCallImpl.java:661) at io.grpc.internal.ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext(ClientCallImpl.java:646) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.lang.Thread.run(Thread.java:748) ... 1 frame trimmed Caused by: java.nio.file.NoSuchFileException: /private/tmp/amps-standalone-bitbucket-LATEST/target/bitbucket/home/shared/config/hook-scripts/1-0 at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) at java.nio.file.Files.newByteChannel(Files.java:361) at java.nio.file.Files.newByteChannel(Files.java:407) at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:384) at java.nio.file.Files.newInputStream(Files.java:152) at com.atlassian.stash.internal.hook.script.DiskHookScriptStore.getExecutable(DiskHookScriptStore.java:181) ... 19 common frames omitted
Workaround
Delete the hook script and re-create using REST end-point and configure it in the repository.