Skip to content

Conversation

@ono-max
Copy link
Contributor

@ono-max ono-max commented Mar 5, 2025

When Launchable server is unstable, ReadTimeout exception can occur. To prevent the execution from slowing down, we disable retrying the request in this case.

Before

$ launchable verify
Organization: 'launchableinc'
Workspace: 'mothership'
Proxy: None
Platform: 'macOS-14.7.4-arm64-arm-64bit'
Python version: '3.12.6'
Java command: 'java'
launchable version: '1.97.3.dev6+g34704db0'
WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)")': /intake/organizations/launchableinc/workspaces/mothership/verification
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)")': /intake/organizations/launchableinc/workspaces/mothership/verification
WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)")': /intake/organizations/launchableinc/workspaces/mothership/verification
HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /intake/organizations/launchableinc/workspaces/mothership/verification (Caused by ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)"))
Your CLI configuration is successfully verified 🎉

After

$ launchable verify
Organization: 'launchableinc'
Workspace: 'mothership'
Proxy: None
Platform: 'macOS-14.7.4-arm64-arm-64bit'
Python version: '3.12.6'
Java command: 'java'
launchable version: '1.97.3.dev6+g34704db0.d20250305'
HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /intake/organizations/launchableinc/workspaces/mothership/verification (Caused by ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)"))
Your CLI configuration is successfully verified 🎉

Summary by CodeRabbit

  • New Features
    • Enhanced network request reliability through a flexible retry mechanism that adapts timeout behavior based on configuration settings, ensuring smoother and more resilient operations.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 5, 2025

Walkthrough

This pull request updates the HTTP client’s retry strategy and configuration. In the HTTP client module, the import statement now includes the new environment key, and a constant MAX_RETRIES is set to 3. The _HttpClient class is modified to accept additional arguments (test_runner and app), and its retry logic now uses MAX_RETRIES instead of a hardcoded value. The read timeout is set conditionally based on whether the SKIP_TIMEOUT_RETRY environment variable is present. Additionally, the environment keys module now defines the SKIP_TIMEOUT_RETRY constant.

Changes

File(s) Change Summary
launchable/.../http_client.py - Updated import to include SKIP_TIMEOUT_RETRY
- Introduced constant MAX_RETRIES = 3
- Modified _HttpClient.__init__ to include test_runner and app parameters
- Updated retry logic with conditional read timeout based on SKIP_TIMEOUT_RETRY
launchable/.../env_keys.py - Added new constant SKIP_TIMEOUT_RETRY with value "LAUNCHABLE_SKIP_TIMEOUT_RETRY"

Sequence Diagram(s)

sequenceDiagram
    participant C as Caller
    participant H as _HttpClient
    participant E as Environment

    C->>H: Instantiate _HttpClient(base_url, session, test_runner, app)
    H->>E: Check for SKIP_TIMEOUT_RETRY variable
    alt SKIP_TIMEOUT_RETRY is set
        H->>H: Set read timeout to 0
    else
        H->>H: Set read timeout to MAX_RETRIES (3)
    end
    H->>C: Return configured _HttpClient instance
Loading

Poem

I’m a rabbit in the code’s vast field,
Hopping through changes with each new yield.
Constants bloom and imports align,
Timeout logic updated, oh so fine.
With every hop, the code sings anew—
A playful dance of refresh and review!


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bec4614 and 9875b30.

📒 Files selected for processing (2)
  • launchable/utils/env_keys.py (1 hunks)
  • launchable/utils/http_client.py (3 hunks)
✅ Files skipped from review due to trivial changes (1)
  • launchable/utils/env_keys.py
🚧 Files skipped from review as they are similar to previous changes (1)
  • launchable/utils/http_client.py
⏰ Context from checks skipped due to timeout of 90000ms (14)
  • GitHub Check: build (windows-latest, 3.12)
  • GitHub Check: build (windows-latest, 3.11)
  • GitHub Check: build (windows-latest, 3.10)
  • GitHub Check: build (windows-latest, 3.9)
  • GitHub Check: build (windows-latest, 3.8)
  • GitHub Check: build (windows-latest, 3.7)
  • GitHub Check: build (windows-latest, 3.6)
  • GitHub Check: build (ubuntu-20.04, 3.12)
  • GitHub Check: build (ubuntu-20.04, 3.11)
  • GitHub Check: build (ubuntu-20.04, 3.10)
  • GitHub Check: build (ubuntu-20.04, 3.9)
  • GitHub Check: build (ubuntu-20.04, 3.8)
  • GitHub Check: build (ubuntu-20.04, 3.7)
  • GitHub Check: build (ubuntu-20.04, 3.6)

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@ono-max ono-max requested a review from Konboi March 5, 2025 03:57
@ono-max
Copy link
Contributor Author

ono-max commented Mar 5, 2025

@Konboi

I assigned you as a reviewer since you're involved in #257.

Copy link
Contributor

@Konboi Konboi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are cases where a retry should be performed even after a timeout, especially for the subset requests.

Since loading the model takes time, the first request may time out.
However, in many cases, the model loading is completed by the second third request, so a response can be returned without timing out.

Don’t you think that the current modification would prevent us from handling such (subset) cases?

@ono-max
Copy link
Contributor Author

ono-max commented Mar 5, 2025

@Konboi

Oh, I didn't know that. Thank you for your information. Therefore, I'll change the code so that requests are retried when the CLI requests test subsets.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🔭 Outside diff range comments (1)
launchable/utils/http_client.py (1)

131-131: ⚠️ Potential issue

Verify handling of session parameter in request method

Line 131 uses self.session to make the request, but the method now accepts a custom session parameter. You should use the session parameter that was set up earlier in the method instead of self.session.

- response = self.session.request(method, url, headers=headers, timeout=timeout, data=data,
-                                 params=params, verify=(not self.skip_cert_verification))
+ response = session.request(method, url, headers=headers, timeout=timeout, data=data,
+                           params=params, verify=(not self.skip_cert_verification))
🧹 Nitpick comments (2)
launchable/utils/http_client.py (2)

94-100: Consider potential duplication in retry configuration

There's some duplication between the retry configuration in __init__ and in the request method. While they serve different purposes, it might be worth refactoring to have a single function that generates the appropriate retry strategy based on the context.

- strategy = Retry(
-     total=MAX_RETRIES,
-     read=read,
-     allowed_methods=["GET", "PUT", "PATCH", "DELETE"],
-     status_forcelist=[429, 500, 502, 503, 504],
-     backoff_factor=2
- )
+ strategy = self._create_retry_strategy(read)

# Then add this method to the class
+ def _create_retry_strategy(self, read=0):
+     return Retry(
+         total=MAX_RETRIES,
+         read=read,
+         allowed_methods=["GET", "PUT", "PATCH", "DELETE"],
+         status_forcelist=[429, 500, 502, 503, 504],
+         backoff_factor=2
+     )

85-107: Consider resource management for created sessions

When creating a new session object in the request method, there's no explicit cleanup of these sessions. While Python's garbage collection will eventually clean them up, it would be better to ensure that sessions are closed properly, especially if this method is called frequently.

You could handle this by using a context manager approach:

if session is None:
    # Create the retry strategy and adapter as before
    s = Session()
    s.mount("http://", adapter)
    s.mount("https://", adapter)
    session = s
    
    # Mark that we need to close this session
    should_close_session = True
else:
    should_close_session = False

try:
    # Use the session as before
    response = session.request(...)
    return response
finally:
    if should_close_session:
        session.close()
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fb12b5d and f6a6768.

📒 Files selected for processing (1)
  • launchable/utils/http_client.py (4 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (14)
  • GitHub Check: build (windows-latest, 3.12)
  • GitHub Check: build (windows-latest, 3.11)
  • GitHub Check: build (windows-latest, 3.10)
  • GitHub Check: build (windows-latest, 3.9)
  • GitHub Check: build (windows-latest, 3.8)
  • GitHub Check: build (windows-latest, 3.7)
  • GitHub Check: build (windows-latest, 3.6)
  • GitHub Check: build (ubuntu-20.04, 3.12)
  • GitHub Check: build (ubuntu-20.04, 3.11)
  • GitHub Check: build (ubuntu-20.04, 3.10)
  • GitHub Check: build (ubuntu-20.04, 3.9)
  • GitHub Check: build (ubuntu-20.04, 3.8)
  • GitHub Check: build (ubuntu-20.04, 3.7)
  • GitHub Check: build (ubuntu-20.04, 3.6)
🔇 Additional comments (6)
launchable/utils/http_client.py (6)

11-11: Good update to import directly from urllib3

The import path for Retry has been updated to import directly from urllib3.util.retry instead of through requests.packages. This is a cleaner approach as it leverages the direct dependency.


27-28: Good refactoring by introducing a constant for retry configuration

Introducing the MAX_RETRIES constant improves maintainability by centralizing the retry configuration value.


56-59: Implementation aligns with PR objective to disable read timeout retries

Setting read=0 in the retry strategy effectively disables retries when ReadTimeout occurs, which matches the PR objective to prevent execution delays when the Launchable server is unstable.


83-83: Good enhancement to the request method signature

Adding an optional session parameter provides more flexibility by allowing callers to provide their own session with custom retry configurations.


85-107: Well-implemented session handling with specialized retry strategy

The implementation correctly:

  1. Creates a new session with custom retry strategy when session is not provided
  2. Disables read timeout retries by default (read=0)
  3. Makes a special exception for the "subset" path to allow retries

This approach aligns perfectly with the PR objective while maintaining functionality for subset requests that require retries.


89-94:

Details

✅ Verification successful

Good implementation of subset path exception

The special handling for the "subset" path is well implemented and documented. This ensures that retries are still enabled for subset requests where they are needed.


🏁 Script executed:

#!/bin/bash
# Let's confirm if the subset path is used in the codebase to validate this special case

# Search for direct references to the subset endpoint
echo "Searching for direct references to subset endpoint..."
rg -l "path\s*=\s*['\"]subset['\"]" --type py

# Search for more general usage of the subset keyword
echo "Searching for general subset keyword usage..."
rg "\bsubset\b" --type py

Length of output: 33344


Subset Request Exception Handling Approved

The implementation in launchable/utils/http_client.py clearly distinguishes the "subset" path by setting read = MAX_RETRIES with an appropriate comment explaining why extra retries are warranted. The code and its documentation have been verified against the codebase usage, and no issues were found.

@ono-max ono-max force-pushed the AIENG-73 branch 4 times, most recently from ca14ea7 to 7ddb7e3 Compare March 5, 2025 05:26
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
launchable/commands/subset.py (1)

527-530: Consider revisiting the TODO comment about extended timeout.

This TODO comment indicates a temporary workaround for slow API responses. While unrelated to the current PR's focus on retry behavior, it would be good to track this as a separate issue if it hasn't been addressed yet.

Consider adding a ticket/issue reference to this TODO comment for better traceability:

- # temporarily extend the timeout because subset API response has become slow
- # TODO: remove this line when API response return respose
- # within 300 sec
+ # temporarily extend the timeout because subset API response has become slow
+ # TODO: [AIENG-XX] Remove this extended timeout when API responses return within 300 sec
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b189639 and bec4614.

📒 Files selected for processing (2)
  • launchable/commands/subset.py (2 hunks)
  • launchable/utils/http_client.py (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • launchable/utils/http_client.py
⏰ Context from checks skipped due to timeout of 90000ms (14)
  • GitHub Check: build (windows-latest, 3.12)
  • GitHub Check: build (windows-latest, 3.11)
  • GitHub Check: build (windows-latest, 3.10)
  • GitHub Check: build (windows-latest, 3.9)
  • GitHub Check: build (windows-latest, 3.8)
  • GitHub Check: build (windows-latest, 3.7)
  • GitHub Check: build (windows-latest, 3.6)
  • GitHub Check: build (ubuntu-20.04, 3.12)
  • GitHub Check: build (ubuntu-20.04, 3.11)
  • GitHub Check: build (ubuntu-20.04, 3.10)
  • GitHub Check: build (ubuntu-20.04, 3.9)
  • GitHub Check: build (ubuntu-20.04, 3.8)
  • GitHub Check: build (ubuntu-20.04, 3.7)
  • GitHub Check: build (ubuntu-20.04, 3.6)
🔇 Additional comments (4)
launchable/commands/subset.py (4)

11-12: Good addition of necessary imports for HTTP session management.

These imports provide the required classes for configuring custom HTTP retry logic, which aligns with the PR objective to manage retry behavior.


16-16: LGTM: Import of retry utilities from the centralized HTTP client.

The import of MAX_RETRIES and default_retry_strategy from the HTTP client module enables consistent retry behavior configuration across the application.


523-523: Good: Properly passing the custom session to the LaunchableClient.

The custom session with the configured retry strategy is correctly passed to the LaunchableClient, ensuring that the client uses the defined retry behavior for all requests.


512-520:

Details

❓ Verification inconclusive

Appropriate implementation of custom retry strategy for subset requests.

This implementation correctly creates a custom HTTP session with a retry strategy specifically for subset requests. The strategy allows retries for read operations, which is an intentional exception to the PR's general objective of disabling retries for ReadTimeout errors. This is appropriate since, as the comments note, subset requests may require retries due to model loading time on the server side.

I do have a question about the implementation details of default_retry_strategy():


🏁 Script executed:

#!/bin/bash
# Check the implementation of default_retry_strategy to understand how it handles ReadTimeout
grep -rn "def default_retry_strategy" --include="*.py" .
cat $(grep -l "def default_retry_strategy" --include="*.py" . | head -1)

Length of output: 225


Attention: Validate default_retry_strategy Implementation Details

The custom HTTP session and retry configuration for subset requests is implemented appropriately and intentionally allows retries on read operations. However, the script to verify the implementation of default_retry_strategy() (located in launchable/utils/http_client.py) did not yield its code snippet due to a directory scanning error. Please ensure that:

  • The implementation of default_retry_strategy() properly configures retries for read operations (especially for ReadTimeout conditions) as intended for subset requests.
  • There are no unintended side effects on the general error-handling behavior elsewhere in the codebase.

It is recommended to run a revised check (for example, using a corrected script) or perform a manual review of the function’s details to confirm its behavior.

try:
test_runner = context.invoked_subcommand

strategy = default_retry_strategy()
Copy link
Contributor Author

@ono-max ono-max Mar 5, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked split-subset logic in Launchable server, but it doesn't load the model in that API. Hence, I believe it's enough to retry requests in only subset API.

@ono-max ono-max requested a review from Konboi March 5, 2025 05:43
try:
test_runner = context.invoked_subcommand

strategy = default_retry_strategy()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel that the HTTP client logic is getting too involved here… even this is subset.py
Can we overwrite it before the request phase using path?

return os.getenv(BASE_URL_KEY) or DEFAULT_BASE_URL


def default_retry_strategy():
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’m wondering if it’s really okay for the default behavior to not retry on read timeouts.

Wouldn’t it be better to enable retries by default, and provide an environment variable to skip retries specifically for read timeouts if needed?

e.g.)

SKIP_TIMEOUT_RETRY=true launchable xxx

What do you think?

@sonarqubecloud
Copy link

sonarqubecloud bot commented Mar 6, 2025

@ono-max
Copy link
Contributor Author

ono-max commented Mar 6, 2025

@Konboi

I modified code so that we can disable retrying requests by configuring a environment variable 👍

$ launchable verify
Organization: 'launchableinc'
Workspace: 'mothership'
Proxy: None
Platform: 'macOS-14.7.4-arm64-arm-64bit'
Python version: '3.12.6'
Java command: 'java'
launchable version: '1.97.3.dev9+g9875b306'
WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=2, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)")': /intake/organizations/launchableinc/workspaces/mothership/verification
WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=1, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)")': /intake/organizations/launchableinc/workspaces/mothership/verification
WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=0, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)")': /intake/organizations/launchableinc/workspaces/mothership/verification
HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /intake/organizations/launchableinc/workspaces/mothership/verification (Caused by ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)"))
Your CLI configuration is successfully verified 🎉
$ LAUNCHABLE_SKIP_TIMEOUT_RETRY='1' launchable verify
Organization: 'launchableinc'
Workspace: 'mothership'
Proxy: None
Platform: 'macOS-14.7.4-arm64-arm-64bit'
Python version: '3.12.6'
Java command: 'java'
launchable version: '1.97.3.dev9+g9875b306'
HTTPConnectionPool(host='localhost', port=8080): Max retries exceeded with url: /intake/organizations/launchableinc/workspaces/mothership/verification (Caused by ReadTimeoutError("HTTPConnectionPool(host='localhost', port=8080): Read timed out. (read timeout=15)"))
Your CLI configuration is successfully verified 🎉

@ono-max ono-max requested a review from Konboi March 6, 2025 02:57
@ono-max ono-max merged commit 4f63ce4 into main Mar 6, 2025
17 checks passed
@ono-max ono-max deleted the AIENG-73 branch March 6, 2025 03:11
@github-actions github-actions bot mentioned this pull request Mar 6, 2025
ono-max added a commit to ruby/ruby that referenced this pull request Mar 12, 2025
…12877)

When a Launchable server is unstable, a ReadTimeoutException occurs in the Launchable CLI. In such case, the Launchable CLI retries requests, which slows down CI execution. In this PR, I configured the environment variable SKIP_TIMEOUT_RETRY to disable retry attempts on requests(Link: cloudbees-oss/smart-tests-cli#992).

```
WARNING:urllib3.connectionpool:Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)")': /intake/organizations/ruby/workspaces/ruby/commits/collect/options
  WARNING:urllib3.connectionpool:Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)")': /intake/organizations/ruby/workspaces/ruby/commits/collect/options
  WARNING:urllib3.connectionpool:Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)")': /intake/organizations/ruby/workspaces/ruby/commits/collect/options
  HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Max retries exceeded with url: /intake/organizations/ruby/workspaces/ruby/commits/collect/options (Caused by ReadTimeoutError("HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=15)"))
  Exception in thread "main" javax.net.ssl.SSLException: Connection reset
  	at sun.security.ssl.Alert.createSSLException(Alert.java:127)
  	at sun.security.ssl.TransportContext.fatal(TransportContext.java:331)
  	at sun.security.ssl.TransportContext.fatal(TransportContext.java:274)
  	at sun.security.ssl.TransportContext.fatal(TransportContext.java:269)
  	at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1572)
  	at sun.security.ssl.SSLSocketImpl.access$400(SSLSocketImpl.java:73)
  	at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:982)
  	at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:137)
  	at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:153)
  	at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:280)
  	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:138)
  	at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:56)
  	at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:259)
  	at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:163)
  	at org.apache.http.impl.conn.CPoolProxy.receiveResponseHeader(CPoolProxy.java:157)
  	at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:273)
  	at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
  	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:272)
  	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
  	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
  	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
  	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
  	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
  	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
  	at com.launchableinc.ingest.commits.CommitGraphCollector.transfer(CommitGraphCollector.java:131)
  	at com.launchableinc.ingest.commits.CommitIngester.run(CommitIngester.java:145)
  	at com.launchableinc.ingest.commits.CommitIngester.main(CommitIngester.java:72)
  	Suppressed: java.net.SocketException: Broken pipe (Write failed)
  		at java.net.SocketOutputStream.socketWrite0(Native Method)
  		at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
  		at java.net.SocketOutputStream.write(SocketOutputStream.java:155)
  		at sun.security.ssl.SSLSocketOutputRecord.encodeAlert(SSLSocketOutputRecord.java:81)
  		at sun.security.ssl.TransportContext.fatal(TransportContext.java:362)
  		... 25 more
  Caused by: java.net.SocketException: Connection reset
  	at java.net.SocketInputStream.read(SocketInputStream.java:210)
  	at java.net.SocketInputStream.read(SocketInputStream.java:141)
  	at sun.security.ssl.SSLSocketInputRecord.read(SSLSocketInputRecord.java:464)
  	at sun.security.ssl.SSLSocketInputRecord.bytesInCompletePacket(SSLSocketInputRecord.java:68)
  	at sun.security.ssl.SSLSocketImpl.readApplicationRecord(SSLSocketImpl.java:1350)
  	at sun.security.ssl.SSLSocketImpl.access$300(SSLSocketImpl.java:73)
  	at sun.security.ssl.SSLSocketImpl$AppInputStream.read(SSLSocketImpl.java:966)
  	... 20 more
  Couldn't get commit history from `/github/workspace/src`. Do you run command root of git-controlled directory? If not, please set a directory use by --source option.
  HTTPSConnectionPool(host='api.mercury.launchableinc.com', port=443): Read timed out. (read timeout=60)
  Command '['java', '-jar', '/root/.local/pipx/venvs/launchable/lib/python3.10/site-packages/launchable/jar/exe_deploy.jar', 'ingest:commit', '-endpoint', 
```

https://github.com/ruby/ruby/actions/runs/13572112090/job/37939529243
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants