Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

[馃悰 Bug]: Session is killed and removed from Session Map in the same second that it receives another request #2129

Closed
alequint opened this issue Feb 8, 2024 · 19 comments

Comments

@alequint
Copy link

alequint commented Feb 8, 2024

What happened?

Session is killed and removed from Session Map in the same second that it receives another request.

My selenium tests are running in a Kubernetes cluster (OpenShift), and they are configured to point to a remote selenium grid deployed in the same cluster and installed via helm chart (using chrome node and with auto scale enabled). Follow versions and configuration details:

Versions

  • selenium/hub = 4.17.0-20240123
  • selenium/chrome-node = 4.17.0-20240123

AutoScaling as configured in Helm values

autoscaling:
  enabled: true
  scalingType: deployment
  scaledOptions:
    maxReplicaCount: 999

I have noticed the following behaviors:

  • When my tests run one after the other they run fine till the end and pass
  • When these same tests run all at the same time, sometimes (not always), hub lost a reference to the session before a request is processed resulting in NoSuchException error.

Here is the exception we have in the test container:

Session Id: 6e5053d746543857588f380cafbe73f1

org.openqa.selenium.NoSuchSessionException: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
Build info: version: '4.16.1', revision: '9b4c83354e'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.17'
Driver info: org.openqa.selenium.remote.RemoteWebDriver$ByteBuddy$qHh51oC6$ByteBuddy$HdqocFzk
Command: [6e5053d746543857588f380cafbe73f1, quit {}]
Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 119.0.6045.159, chrome: {chromedriverVersion: 119.0.6045.105 (38c72552c5e..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:43971}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:bidiEnabled: false, se:cdp: ws://admin:admin@selenium-h..., se:cdpVersion: 119.0.6045.159, se:vnc: ws://admin:admin@selenium-h..., se:vncEnabled: true, se:vncLocalAddress: ws://10.254.21.152:7900, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 6e5053d746543857588f380cafbe73f1
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:200)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:133)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:52)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:191)
	at org.openqa.selenium.remote.TracedCommandExecutor.execute(TracedCommandExecutor.java:51)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:523)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:596)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:600)
	at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:438)
	at framework.AutomationBaseTest.shutdownDriver(AutomationBaseTest.java:464)
	at framework.AutomationBaseTest.afterClass(AutomationBaseTest.java:445)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:69)
	at org.testng.internal.invokers.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:361)
	at org.testng.internal.invokers.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:296)
	at org.testng.internal.invokers.TestMethodWorker.invokeAfterClassMethods(TestMethodWorker.java:222)
	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:131)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.testng.TestRunner.privateRun(TestRunner.java:829)
	at org.testng.TestRunner.run(TestRunner.java:602)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:437)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:431)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:391)
	at org.testng.SuiteRunner.run(SuiteRunner.java:330)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1176)
	at org.testng.TestNG.runSuites(TestNG.java:1099)
	at org.testng.TestNG.run(TestNG.java:1067)
	at org.testng.TestNG.privateMain(TestNG.java:1414)
	at org.testng.TestNG.main(TestNG.java:1378)
Number of open drivers: 0
FAILED: tests.testdriver.TestDriver.Driver
org.openqa.selenium.NoSuchSessionException: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
Build info: version: '4.16.1', revision: '9b4c83354e'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.17'
Driver info: org.openqa.selenium.remote.RemoteWebDriver$ByteBuddy$qHh51oC6$ByteBuddy$HdqocFzk
Command: [6e5053d746543857588f380cafbe73f1, screenshot {}]
Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 119.0.6045.159, chrome: {chromedriverVersion: 119.0.6045.105 (38c72552c5e..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:43971}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:bidiEnabled: false, se:cdp: ws://admin:admin@selenium-h..., se:cdpVersion: 119.0.6045.159, se:vnc: ws://admin:admin@selenium-h..., se:vncEnabled: true, se:vncLocalAddress: ws://10.254.21.152:7900, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 6e5053d746543857588f380cafbe73f1
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:200)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:133)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:52)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:191)
	at org.openqa.selenium.remote.TracedCommandExecutor.execute(TracedCommandExecutor.java:51)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:523)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:596)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:600)
	at org.openqa.selenium.remote.RemoteWebDriver.getScreenshotAs(RemoteWebDriver.java:326)
	at framework.Logger.getScreenshot(Logger.java:687)
	at framework.Logger.getScreenshot(Logger.java:844)
	at tests.testdriver.TestDriver.Driver(TestDriver.java:851)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:677)
	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:221)
	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:969)
	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:194)
	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148)
	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.testng.TestRunner.privateRun(TestRunner.java:829)
	at org.testng.TestRunner.run(TestRunner.java:602)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:437)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:431)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:391)
	at org.testng.SuiteRunner.run(SuiteRunner.java:330)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1176)
	at org.testng.TestNG.runSuites(TestNG.java:1099)
	at org.testng.TestNG.run(TestNG.java:1067)
	at org.testng.TestNG.privateMain(TestNG.java:1414)
	at org.testng.TestNG.main(TestNG.java:1378)

Then here is what happens in Selenium Hub from the point 6e5053d746543857588f380cafbe73f1is created (03:04:48.747) till it has its slot released (03:18:12.023) and then deleted from Session Map (03:18:12.023). Few miliseconds later, in the same seconds (03:18:12.265), it complains saying it is Unable to process a request against the just removed session.

03:04:48.747 INFO [LocalDistributor.newSession] - Session created by the Distributor. Id: 6e5053d746543857588f380cafbe73f1 
 Caps: Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 119.0.6045.159, chrome: {chromedriverVersion: 119.0.6045.105 (38c72552c5e..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:43971}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: {}, se:bidiEnabled: false, se:cdp: ws://admin:admin@selenium-h..., se:cdpVersion: 119.0.6045.159, se:vnc: ws://admin:admin@selenium-h..., se:vncEnabled: true, se:vncLocalAddress: ws://10.254.21.152:7900, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}

(...)

03:18:12.023 INFO [GridModel.release] - Releasing slot for session id 6e5053d746543857588f380cafbe73f1
03:18:12.023 INFO [LocalSessionMap.lambda$new$0] - Deleted session from local Session Map, Id: 6e5053d746543857588f380cafbe73f1
03:18:12.264 WARN [SeleniumSpanExporter$1.lambda$export$1] - Unable to execute request for an existing session: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
03:18:12.265 WARN [SeleniumSpanExporter$1.lambda$export$1] - org.openqa.selenium.NoSuchSessionException: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
	at org.openqa.selenium.grid.sessionmap.local.LocalSessionMap.get(LocalSessionMap.java:132)
	at org.openqa.selenium.grid.router.HandleSession.lambda$loadSessionId$4(HandleSession.java:160)
	at io.opentelemetry.context.Context.lambda$wrap$2(Context.java:224)
	at org.openqa.selenium.grid.router.HandleSession.execute(HandleSession.java:122)
	at org.openqa.selenium.remote.http.Route$PredicatedRoute.handle(Route.java:382)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.grid.router.Router.execute(Router.java:87)
	at org.openqa.selenium.grid.web.EnsureSpecCompliantResponseHeaders.lambda$apply$0(EnsureSpecCompliantResponseHeaders.java:34)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.grid.security.BasicAuthenticationFilter.lambda$apply$0(BasicAuthenticationFilter.java:54)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.AddWebDriverSpecHeaders.lambda$apply$0(AddWebDriverSpecHeaders.java:35)
	at org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.netty.server.SeleniumHandler.lambda$channelRead0$0(SeleniumHandler.java:44)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

Later in the logs of hub it keeps trying to process that request and keeps complaining it is unable to find that session id.

Again, we do not see this problem when the test is executed in isolation. We can reproduce this when other tests are running at the same time (each test runs in a differenr container but all pointing to the hub remotely). Thoughts?

Complete hub log is attached for further analysis here:

selenium-hub-94b85cd4-b6bvs-selenium-hub.log

Command used to start Selenium Grid with Docker (or Kubernetes)

Selenium Grid is installed via helm as follows:


helm install -n {{ selenium_namespace }} selenium-grid docker-selenium/selenium-grid -f /tmp/selenium-values.yml --version 0.25.0

selenium-values-yml have versions and "autoscaling" mentioned above, but images are pulled from our internal registry. Follow template used (only chrome node is enabled):

autoscaling:
  enabled: true
  scalingType: deployment
  scaledOptions:
    maxReplicaCount: 999

chromeNode:
  imageName: {{ fvt_image_registry }}/selenium/node-chrome
  imageTag: 4.17.0-20240123
  imagePullSecret: artifactory

firefoxNode:
  enabled: false
  imageName: {{ fvt_image_registry }}/selenium/node-firefox
  imageTag: 4.17.0-20240123
  imagePullSecret: artifactory

edgeNode:
  enabled: false
  imageName: {{ fvt_image_registry }}/selenium/node-edge
  imageTag: 4.17.0-20240123
  imagePullSecret: artifactory

videoRecorder:
  imageName: {{ fvt_image_registry }}/selenium/video
  imageTag: ffmpeg-6.1-20240123
  imagePullSecret: artifactory

hub:
  imageName: {{ fvt_image_registry }}/selenium/hub
  imageTag: 4.17.0-20240123
  imagePullSecret: artifactory

ingress:
  hostname: selenium-grid.local
  path: /selenium


### Relevant log output

```shell
Client Side:

org.openqa.selenium.NoSuchSessionException: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
Build info: version: '4.16.1', revision: '9b4c83354e'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.17'
Driver info: org.openqa.selenium.remote.RemoteWebDriver$ByteBuddy$qHh51oC6$ByteBuddy$HdqocFzk
Command: [6e5053d746543857588f380cafbe73f1, quit {}]
Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 119.0.6045.159, chrome: {chromedriverVersion: 119.0.6045.105 (38c72552c5e..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:43971}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:bidiEnabled: false, se:cdp: ws://admin:admin@selenium-h..., se:cdpVersion: 119.0.6045.159, se:vnc: ws://admin:admin@selenium-h..., se:vncEnabled: true, se:vncLocalAddress: ws://10.254.21.152:7900, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 6e5053d746543857588f380cafbe73f1
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:200)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:133)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:52)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:191)
	at org.openqa.selenium.remote.TracedCommandExecutor.execute(TracedCommandExecutor.java:51)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:523)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:596)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:600)
	at org.openqa.selenium.remote.RemoteWebDriver.quit(RemoteWebDriver.java:438)
	at framework.AutomationBaseTest.shutdownDriver(AutomationBaseTest.java:464)
	at framework.AutomationBaseTest.afterClass(AutomationBaseTest.java:445)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:69)
	at org.testng.internal.invokers.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:361)
	at org.testng.internal.invokers.ConfigInvoker.invokeConfigurations(ConfigInvoker.java:296)
	at org.testng.internal.invokers.TestMethodWorker.invokeAfterClassMethods(TestMethodWorker.java:222)
	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:131)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.testng.TestRunner.privateRun(TestRunner.java:829)
	at org.testng.TestRunner.run(TestRunner.java:602)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:437)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:431)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:391)
	at org.testng.SuiteRunner.run(SuiteRunner.java:330)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1176)
	at org.testng.TestNG.runSuites(TestNG.java:1099)
	at org.testng.TestNG.run(TestNG.java:1067)
	at org.testng.TestNG.privateMain(TestNG.java:1414)
	at org.testng.TestNG.main(TestNG.java:1378)
Number of open drivers: 0
FAILED: tests.testdriver.TestDriver.Driver
org.openqa.selenium.NoSuchSessionException: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
Build info: version: '4.16.1', revision: '9b4c83354e'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.17'
Driver info: org.openqa.selenium.remote.RemoteWebDriver$ByteBuddy$qHh51oC6$ByteBuddy$HdqocFzk
Command: [6e5053d746543857588f380cafbe73f1, screenshot {}]
Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 119.0.6045.159, chrome: {chromedriverVersion: 119.0.6045.105 (38c72552c5e..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:43971}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: Proxy(), se:bidiEnabled: false, se:cdp: ws://admin:admin@selenium-h..., se:cdpVersion: 119.0.6045.159, se:vnc: ws://admin:admin@selenium-h..., se:vncEnabled: true, se:vncLocalAddress: ws://10.254.21.152:7900, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}
Session ID: 6e5053d746543857588f380cafbe73f1
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:200)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:133)
	at org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:52)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:191)
	at org.openqa.selenium.remote.TracedCommandExecutor.execute(TracedCommandExecutor.java:51)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:523)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:596)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:600)
	at org.openqa.selenium.remote.RemoteWebDriver.getScreenshotAs(RemoteWebDriver.java:326)
	at framework.Logger.getScreenshot(Logger.java:687)
	at framework.Logger.getScreenshot(Logger.java:844)
	at tests.testdriver.TestDriver.Driver(TestDriver.java:851)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
	at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:677)
	at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:221)
	at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
	at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:969)
	at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:194)
	at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148)
	at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
	at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
	at org.testng.TestRunner.privateRun(TestRunner.java:829)
	at org.testng.TestRunner.run(TestRunner.java:602)
	at org.testng.SuiteRunner.runTest(SuiteRunner.java:437)
	at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:431)
	at org.testng.SuiteRunner.privateRun(SuiteRunner.java:391)
	at org.testng.SuiteRunner.run(SuiteRunner.java:330)
	at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
	at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
	at org.testng.TestNG.runSuitesSequentially(TestNG.java:1256)
	at org.testng.TestNG.runSuitesLocally(TestNG.java:1176)
	at org.testng.TestNG.runSuites(TestNG.java:1099)
	at org.testng.TestNG.run(TestNG.java:1067)
	at org.testng.TestNG.privateMain(TestNG.java:1414)
	at org.testng.TestNG.main(TestNG.java:1378)



Hub:


03:04:48.747 INFO [LocalDistributor.newSession] - Session created by the Distributor. Id: 6e5053d746543857588f380cafbe73f1 
 Caps: Capabilities {acceptInsecureCerts: true, browserName: chrome, browserVersion: 119.0.6045.159, chrome: {chromedriverVersion: 119.0.6045.105 (38c72552c5e..., userDataDir: /tmp/.org.chromium.Chromium...}, fedcm:accounts: true, goog:chromeOptions: {debuggerAddress: localhost:43971}, networkConnectionEnabled: false, pageLoadStrategy: normal, platformName: linux, proxy: {}, se:bidiEnabled: false, se:cdp: ws://admin:admin@selenium-h..., se:cdpVersion: 119.0.6045.159, se:vnc: ws://admin:admin@selenium-h..., se:vncEnabled: true, se:vncLocalAddress: ws://10.254.21.152:7900, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: dismiss and notify, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:extension:minPinLength: true, webauthn:extension:prf: true, webauthn:virtualAuthenticators: true}

(...)

03:18:12.023 INFO [GridModel.release] - Releasing slot for session id 6e5053d746543857588f380cafbe73f1
03:18:12.023 INFO [LocalSessionMap.lambda$new$0] - Deleted session from local Session Map, Id: 6e5053d746543857588f380cafbe73f1
03:18:12.264 WARN [SeleniumSpanExporter$1.lambda$export$1] - Unable to execute request for an existing session: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
03:18:12.265 WARN [SeleniumSpanExporter$1.lambda$export$1] - org.openqa.selenium.NoSuchSessionException: Unable to find session with ID: 6e5053d746543857588f380cafbe73f1
Build info: version: '4.15.0', revision: '1d14b5521b'
System info: os.name: 'Linux', os.arch: 'amd64', os.version: '4.18.0-372.59.1.el8_6.x86_64', java.version: '11.0.20.1'
Driver info: driver.version: unknown
	at org.openqa.selenium.grid.sessionmap.local.LocalSessionMap.get(LocalSessionMap.java:132)
	at org.openqa.selenium.grid.router.HandleSession.lambda$loadSessionId$4(HandleSession.java:160)
	at io.opentelemetry.context.Context.lambda$wrap$2(Context.java:224)
	at org.openqa.selenium.grid.router.HandleSession.execute(HandleSession.java:122)
	at org.openqa.selenium.remote.http.Route$PredicatedRoute.handle(Route.java:382)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.grid.router.Router.execute(Router.java:87)
	at org.openqa.selenium.grid.web.EnsureSpecCompliantResponseHeaders.lambda$apply$0(EnsureSpecCompliantResponseHeaders.java:34)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.grid.security.BasicAuthenticationFilter.lambda$apply$0(BasicAuthenticationFilter.java:54)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.remote.http.Route$CombinedRoute.handle(Route.java:345)
	at org.openqa.selenium.remote.http.Route.execute(Route.java:69)
	at org.openqa.selenium.remote.AddWebDriverSpecHeaders.lambda$apply$0(AddWebDriverSpecHeaders.java:35)
	at org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.remote.ErrorFilter.lambda$apply$0(ErrorFilter.java:44)
	at org.openqa.selenium.remote.http.Filter$1.execute(Filter.java:63)
	at org.openqa.selenium.netty.server.SeleniumHandler.lambda$channelRead0$0(SeleniumHandler.java:44)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:829)

Operating System

Kubernetes (OpenShift)

Docker Selenium version (image tag)

4.17.0-20240123

Selenium Grid chart version (chart version)

0.25.0

@alequint alequint changed the title [馃悰 Bug]: Session is killed and removed from Session Map in the same second it receives another request [馃悰 Bug]: Session is killed and removed from Session Map in the same second that it receives another request Feb 8, 2024
Copy link

github-actions bot commented Feb 8, 2024

@alequint, thank you for creating this issue. We will troubleshoot it as soon as we can.


Info for maintainers

Triage this issue by using labels.

If information is missing, add a helpful comment and then I-issue-template label.

If the issue is a question, add the I-question label.

If the issue is valid but there is no time to troubleshoot it, consider adding the help wanted label.

If the issue requires changes or fixes from an external project (e.g., ChromeDriver, GeckoDriver, MSEdgeDriver, W3C), add the applicable G-* label, and it will provide the correct link and auto-close the issue.

After troubleshooting the issue, please add the R-awaiting answer label.

Thank you!

@VietND96
Copy link
Member

@diemol, have you seen something similar was reported to the upstream repo before? I guess there is no actionable from the container side.

@diemol
Copy link
Member

diemol commented Feb 10, 2024

No, I've never seen that reported. If it truly was an issue, several people would be affected.

I don't really know what to do with an issue like this. It feels like they are dump their environment logs here for us to figure out what the issue is.

@alequint
Copy link
Author

@VietND96 @diemol the logs above are mainly to give you a clearer understanding of what issue we are facing... in summary, hub detects session was killed, then hub release the slot, delete the session and, in the same second we they say, correctly, to be unable to execute request for that just removed session.

In what situation NoSuchSessionException may happen in practice?

I don't know how test could run against a session that it just killed, may any async process trying to use a session no longer in use by accident as it happens in the same second when session was killed?

@diemol
Copy link
Member

diemol commented Feb 12, 2024

In what situation NoSuchSessionException may happen in practice?

When you are using a session id that is no longer active.

When my tests run one after the other they run fine till the end and pass

This is a good indicator that your test code is not working well when executed concurrently. Most likely you are using static variables or the like. If you need help figuring that out, feel free to join our chat where more people can help. I will leave the links for that below.

Copy link

馃挰 Please ask questions at:

@alequint
Copy link
Author

Hey guys, @diemol @VietND96, I understand the issue is closed, but I would like to give you more context about this.

First, a comment from @diemol :

This is a good indicator that your test code is not working well when executed concurrently. Most likely you are using static variables or the like

This is not really the case, because we have separated containers running 1 different client for each test we run, so they are not sharing same variables of even environment, though both point to the same grid via remote driver.

Another comment from @diemol :

No, I've never seen that reported. If it truly was an issue, several people would be affected.

@diemol I have been looking at the backlog of issues we have here, and I noticed some similar issues being reported, quite similar to what we reported here. And in all the cases, however, users have difficulty to reproduce the same, pretty much like me, as they really happen randomly and there is no clear step by step to reach that bad result.

Let me point some of the issues we noticed here:

By the fact that several people are reporting the same issue and struggle to reproduce them clearly, isn't there anything or any insights or suggestions you guys could provide for cases like this?

Let me know if we can reopen the issue and continue the work here, we are really focused on that problem and can contribute to that issue others are also reporting

@diemol
Copy link
Member

diemol commented Feb 16, 2024

Can you share a test script we can use to reproduce the script reliably? With that, we'd be happy to reopen and have a look at this.

@VietND96
Copy link
Member

In my view, looks like this unstable appears when autoscaling in K8s, even your report here also autoscaling.enabled: true, scalingType: deployment
I don't know that when this failure was happening, how many Node pods are up, and how many Node pods are being (or could be) terminated (by the scaler)
In the autoscaling type deployment, the Node pods can be scaled down randomly by the cool-down period, and to ensure the Node shutdown gracefully, in preStop hook there is cURL calling the Node drain endpoint, which is described here
I am thinking about a possible race condition that can happen, something like, in the same second (or the latency around 1-2 seconds in distributed components communication), for example, the Distributor already assigned a session to a Node (e.g just wrote to SessionMap and the signal not come to Node), the scaler also scaled down that Node, the Node send drain signal to Grid and it was accepted to drain immediately instead of stay with status draining.
That is my thought when seeing "in the same second", still need to find logs to prove that is the cause of this unstable

@VietND96 VietND96 pinned this issue Feb 16, 2024
@alequint
Copy link
Author

Thanks a lot for the insights @VietND96 ... Some comments about your post above:

  • In my debug sessions here I noticed that, 5 minutes before the test finished and session slot is released, hub in fact drains the node (from UP to DRAIN) - but node is in fact immediately deprovisioned. Is it expected node keeps drain status for some time? is there a env var we can configure to set that? (we use defaults here)

  • Other question that came to my mind... we are using autoscaler as deployment for no particular reason, it was really the first we used. Do you think that by changing it to job and compare results might be a good idea in this case? It is not clear to me when is better use one of the other.

@VietND96
Copy link
Member

In my debug sessions here I noticed that, 5 minutes before the test finished and session slot is released, hub in fact drains the node (from UP to DRAIN) - but node is in fact immediately deprovisioned. Is it expected node keeps drain status for some time? is there a env var we can configure to set that? (we use defaults here)

I think the hub will not drain the node automatically, message (from UP to DRAIN) I believe at that time, Node was scaled down by the scaler, before Node shutdown, pod exec preStop hook to send drain signal to hub and wait. If the Node deprovisioned immediately, I believe there was no session in progress in that Node. Otherwise Node keep running with status DRAINING, and Hub will not assign any new session to that Node. In a sequential, this process is fine, I just don't know what happens if both assign and drain in the same second as my comment above.

Other question that came to my mind... we are using autoscaler as deployment for no particular reason, it was really the first we used. Do you think that by changing it to job and compare results might be a good idea in this case? It is not clear to me when is better use one of the other.

As my observation on how it works, job is better for solving the problem "randomly scaled down" in deployment, since we can control when the job is done.
The definition of a done job is controlled by the env var SE_DRAIN_AFTER_SESSION_COUNT, by default it is 1 set in Node ConfigMap. This means 1 Node serves 1 session at a time and it will be drained after that 1 session is done (whenever the client calls driver.quit()), from kubectl get pods view, pod will change from Running to Completed, and disappear then.

The difference with deployment is, even we bring env var SE_DRAIN_AFTER_SESSION_COUNT: 1 set to Node config, after 1 session, the Node pod still Running (it just restarted and continues running until the Scaler sets different replicas for deployment)

You can try job once and feedback. For the stable evaluation, a large-scale environment is a dependency
Btw, when trying scaledJob, if you observed the issue something like 1 request in queue but there are more pods up and leftover after that, let's change to strategy: default (as comment in #2133)

@alequint
Copy link
Author

alequint commented Feb 20, 2024

@VietND96 thanks for your insights above and detailed explanation, appreciate the help. Just want to give you an answer back: I have configured my scaling type to job. It is too soon to say all our problems are fixed, but so far, in the two runs of our selenium test pipeline configured like that, I did not see the problem mentioned in this issue anymore. No session issues so far! As this was a random issue that used to happen when tests were running in parallel (normally), we need some more runs to evaluate, but that move to use Job had some much better results than the previous deployment type. I will keep you posted.

@VietND96
Copy link
Member

@alequint, thank you for your continuous feedback. Let me consider putting this info into the chart README, then people can be aware when dealing with grid autoscaling on Kubernetes.

@alequint
Copy link
Author

alequint commented Feb 29, 2024

@VietND96 one more comment here about your last sentence above related to strategy: default.

I've really noticed the behavior you commented above. I did run a very simple test here which just authenticate in our application and then suddenly 15 new nodes (running jobs) were created, but only the first one had a session assigned to it (which made it enter in draining state). But the other 14 pods were left there and never completed.

What is interesting to note is there if I run a test that just instantiates remote driver, requesting a session, and then does nothing, the hub receives the request and it assigns that to one of the 14 running jobs. And when it happened, that pod enters in a draining state and when session is killed we end up with 13 leftover pods.

The problem really comes when I run tests that really do something in browser, in parallel or one after the other in pipeline, because one will create 15 pods, the other creates 8 and then I end up in a CPU issue and pods get Pending because of the amount of resources in place.

I will try the strategy default that you recommended here: #2068 (comment)

During my tests I end up with two more weird problems, these ones not related to scaling type, but they cause some trouble to our processes. I will open in different issues, just FYI in case you already saw something similiar:

  • Prob 1: Jobs or Deployment nodes stuck in Terminating (or in Running state), even though selenium processes look like being terminated (SIGTERM signals sent at least). Even if I reinstall Helm chart, Terminating are still there. I had to reload my worker nodes to make it work again :)
  • Prob 2: could not create new sessions... grid enters in a state where hub does not receive new session requests and test end up with a org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure. - it happened after reload of nodes mentioned above, it seems grid did not restart in a proper condition. I had to reinstall helm chart (delete and install) to make it work.

Just want to anticipate the problems in case you know any existing topic about that from the top of your head... but I will open individual issues about these two items. Thanks for your support.

@VietND96
Copy link
Member

Regarding

Prob 2: could not create new sessions... grid enters in a state where hub does not receive new session requests and test end up with a org.openqa.selenium.SessionNotCreatedException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.

Can you read through this comment to see any similar? #2093 (comment) - myself still finding a possible case for that issue

@alequint
Copy link
Author

alequint commented Feb 29, 2024

@VietND96 coincidently, even after deleting and installing helm chart again, I still see the new session issue. In my screenshot, right side is the code that runs my test, left side is the hub that was supposed to be contacted. And, at this time, Keda Operator does not have any error. So it is something else.

image

I will read the commend linked above and let you know taking advantage I had reproduced the state just now.. let's see.

@VietND96
Copy link
Member

Regarding

Prob 1: Jobs or Deployment nodes stuck in Terminating (or in Running state), even though selenium processes look like being terminated (SIGTERM signals sent at least). Even if I reinstall Helm chart, Terminating are still there

I believe preStop is stuck. If you are using recent chart versions, preStop logs can be seen via kubectl logs. If not, command to run in preStop you can append >> /proc/1/fd/1

@alequint
Copy link
Author

Thanks @VietND96 , I will check... (using charts 0.25.0 - I need to upgrade).

I've seen two flavors of this Terminating issue.

  • First, and worst, mentioned above, is when chrome nodes do not Terminate - I can recover only by restarting worker nodes (will check preStop logs once I reproduce it again)

  • Second, that I discovered to confirm if scalingStrategy was properly applied to default (which worked great btw, 1 job only running and then completed), was that the CR of scaledobject stuck in "being deleted" (as all the other pods got terminated, I thought everything had gone, then installed chart with different strategy, but it did not change because original CR was still up and with old accurate value. I had to remove keda finalizer from the pod, forcing to terminate.

Copy link

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

@github-actions github-actions bot locked and limited conversation to collaborators Mar 31, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants