Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
483d163
SK-3023 add configurable connect/read/write timeouts (v3) (#374)
Devesh-Skyflow Jul 29, 2026
7bf3f56
SK-2986 pass PAT_ACTIONS into reusable workflow via workflow_call sec…
Devesh-Skyflow Jul 29, 2026
cda8a51
[AUTOMATED] Private Release 3.0.0-beta.12-dev-7bf3f56
Devesh-Skyflow Jul 29, 2026
d9cab85
[AUTOMATED] Private Release 3.0.0-beta.12-dev-cda8a51
skyflow-bharti Jul 29, 2026
8117a9b
[AUTOMATED] Private Release 3.0.0-beta.12-dev-d9cab85
skyflow-bharti Jul 29, 2026
81c2fec
[AUTOMATED] Private Release 3.0.0-beta.12-dev-8117a9b
skyflow-bharti Jul 29, 2026
089a75f
[AUTOMATED] Private Release 3.0.0-beta.12-dev-81c2fec
skyflow-bharti Jul 29, 2026
bc9f337
[AUTOMATED] Private Release 3.0.0-beta.12-dev-089a75f
skyflow-bharti Jul 29, 2026
db5ab4c
[AUTOMATED] Private Release 3.0.0-beta.12-dev-bc9f337
skyflow-bharti Jul 29, 2026
60bbb77
[AUTOMATED] Private Release 3.0.0-beta.12-dev-db5ab4c
skyflow-bharti Jul 29, 2026
584d6c9
[AUTOMATED] Private Release 3.0.0-beta.12-dev-60bbb77
skyflow-bharti Jul 29, 2026
f168a67
[AUTOMATED] Private Release 3.0.0-beta.12-dev-584d6c9
skyflow-bharti Jul 29, 2026
acf3bad
[AUTOMATED] Private Release 3.0.0-beta.12-dev-f168a67
skyflow-bharti Jul 29, 2026
02f1021
[AUTOMATED] Private Release 3.0.0-beta.12-dev-acf3bad
skyflow-bharti Jul 29, 2026
dd28a19
[AUTOMATED] Private Release 3.0.0-beta.12-dev-02f1021
skyflow-bharti Jul 29, 2026
55ce48d
[AUTOMATED] Private Release 3.0.0-beta.12-dev-dd28a19
skyflow-bharti Jul 29, 2026
99ea6ae
[AUTOMATED] Private Release 3.0.0-beta.12-dev-55ce48d
skyflow-bharti Jul 29, 2026
046fa87
[AUTOMATED] Private Release 3.0.0-beta.12-dev-99ea6ae
skyflow-bharti Jul 29, 2026
b91e710
[AUTOMATED] Private Release 3.0.0-beta.12-dev-046fa87
skyflow-bharti Jul 29, 2026
de523e5
[AUTOMATED] Private Release 3.0.0-beta.12-dev-b91e710
skyflow-bharti Jul 29, 2026
8cfd65b
[AUTOMATED] Private Release 3.0.0-beta.12-dev-de523e5
skyflow-bharti Jul 29, 2026
18a7e4f
[AUTOMATED] Private Release 3.0.0-beta.12-dev-8cfd65b
skyflow-bharti Jul 29, 2026
7420241
[AUTOMATED] Private Release 3.0.0-beta.12-dev-18a7e4f
skyflow-bharti Jul 29, 2026
e0ed60c
[AUTOMATED] Private Release 3.0.0-beta.12-dev-7420241
skyflow-bharti Jul 29, 2026
c9577b6
[AUTOMATED] Private Release 3.0.0-beta.12-dev-e0ed60c
skyflow-bharti Jul 29, 2026
fb4f521
[AUTOMATED] Private Release 3.0.0-beta.12-dev-c9577b6
skyflow-bharti Jul 29, 2026
c3733f9
[AUTOMATED] Private Release 3.0.0-beta.12-dev-fb4f521
skyflow-bharti Jul 29, 2026
67c90d4
[AUTOMATED] Private Release 3.0.0-beta.12-dev-c3733f9
skyflow-bharti Jul 29, 2026
51effd6
[AUTOMATED] Private Release 3.0.0-beta.12-dev-67c90d4
skyflow-bharti Jul 29, 2026
448e868
[AUTOMATED] Private Release 3.0.0-beta.12-dev-51effd6
skyflow-bharti Jul 29, 2026
e4b7f2c
[AUTOMATED] Private Release 3.0.0-beta.12-dev-448e868
skyflow-bharti Jul 29, 2026
f0944c6
[AUTOMATED] Private Release 3.0.0-beta.12-dev-e4b7f2c
skyflow-bharti Jul 29, 2026
abc2743
[AUTOMATED] Private Release 3.0.0-beta.12-dev-f0944c6
skyflow-bharti Jul 29, 2026
e6f8106
[AUTOMATED] Private Release 3.0.0-beta.12-dev-abc2743
skyflow-bharti Jul 29, 2026
edd978a
[AUTOMATED] Private Release 3.0.0-beta.12-dev-e6f8106
skyflow-bharti Jul 29, 2026
39f99f0
[AUTOMATED] Private Release 3.0.0-beta.12-dev-edd978a
skyflow-bharti Jul 29, 2026
f99cf19
[AUTOMATED] Private Release 3.0.0-beta.12-dev-39f99f0
skyflow-bharti Jul 29, 2026
2fb8822
[AUTOMATED] Private Release 3.0.0-beta.12-dev-f99cf19
skyflow-bharti Jul 29, 2026
fc3c440
[AUTOMATED] Private Release 3.0.0-beta.12-dev-2fb8822
skyflow-bharti Jul 29, 2026
70b57f2
[AUTOMATED] Private Release 3.0.0-beta.12-dev-fc3c440
skyflow-bharti Jul 29, 2026
6d363ee
[AUTOMATED] Private Release 3.0.0-beta.12-dev-70b57f2
skyflow-bharti Jul 29, 2026
c529797
[AUTOMATED] Private Release 3.0.0-beta.12-dev-6d363ee
skyflow-bharti Jul 29, 2026
1c6001e
[AUTOMATED] Private Release 3.0.0-beta.12-dev-c529797
skyflow-bharti Jul 29, 2026
5882394
[AUTOMATED] Private Release 3.0.0-beta.12-dev-1c6001e
skyflow-bharti Jul 29, 2026
8ee345f
[AUTOMATED] Private Release 3.0.0-beta.12-dev-5882394
skyflow-bharti Jul 29, 2026
e8f4b54
[AUTOMATED] Private Release 3.0.0-beta.12-dev-8ee345f
skyflow-bharti Jul 29, 2026
bbed68a
[AUTOMATED] Private Release 3.0.0-beta.12-dev-e8f4b54
skyflow-bharti Jul 29, 2026
67eb949
[AUTOMATED] Private Release 3.0.0-beta.12-dev-bbed68a
skyflow-bharti Jul 29, 2026
705fb45
[AUTOMATED] Private Release 3.0.0-beta.12-dev-67eb949
skyflow-bharti Jul 29, 2026
c662149
[AUTOMATED] Private Release 3.0.0-beta.12-dev-705fb45
skyflow-bharti Jul 29, 2026
888894b
[AUTOMATED] Private Release 3.0.0-beta.12-dev-c662149
skyflow-bharti Jul 29, 2026
823b252
[AUTOMATED] Private Release 3.0.0-beta.12-dev-888894b
skyflow-bharti Jul 29, 2026
f881631
[AUTOMATED] Private Release 3.0.0-beta.12-dev-823b252
skyflow-bharti Jul 29, 2026
4dd7326
[AUTOMATED] Private Release 3.0.0-beta.12-dev-f881631
skyflow-bharti Jul 29, 2026
3523f8a
[AUTOMATED] Private Release 3.0.0-beta.12-dev-4dd7326
skyflow-bharti Jul 29, 2026
6282711
[AUTOMATED] Private Release 3.0.0-beta.12-dev-3523f8a
skyflow-bharti Jul 29, 2026
2a4028a
[AUTOMATED] Private Release 3.0.0-beta.12-dev-6282711
skyflow-bharti Jul 29, 2026
44b105e
[AUTOMATED] Private Release 3.0.0-beta.12-dev-2a4028a
skyflow-bharti Jul 29, 2026
86846c8
[AUTOMATED] Private Release 3.0.0-beta.12-dev-44b105e
skyflow-bharti Jul 29, 2026
7b784a2
[AUTOMATED] Private Release 3.0.0-beta.12-dev-86846c8
skyflow-bharti Jul 29, 2026
60f32b3
[AUTOMATED] Private Release 3.0.0-beta.12-dev-7b784a2
skyflow-bharti Jul 29, 2026
2d12b39
[AUTOMATED] Private Release 3.0.0-beta.12-dev-60f32b3
skyflow-bharti Jul 29, 2026
6123754
[AUTOMATED] Private Release 3.0.0-beta.12-dev-2d12b39
skyflow-bharti Jul 29, 2026
93117b3
[AUTOMATED] Private Release 3.0.0-beta.12-dev-6123754
skyflow-bharti Jul 29, 2026
09cd6df
[AUTOMATED] Private Release 3.0.0-beta.12-dev-93117b3
skyflow-bharti Jul 29, 2026
90a01a8
[AUTOMATED] Private Release 3.0.0-beta.12-dev-09cd6df
skyflow-bharti Jul 29, 2026
b1c2d9f
[AUTOMATED] Private Release 3.0.0-beta.12-dev-90a01a8
skyflow-bharti Jul 29, 2026
35ce5d3
[AUTOMATED] Private Release 3.0.0-beta.12-dev-b1c2d9f
skyflow-bharti Jul 29, 2026
cd8295f
[AUTOMATED] Private Release 3.0.0-beta.12-dev-35ce5d3
skyflow-bharti Jul 29, 2026
7720bcf
[AUTOMATED] Private Release 3.0.0-beta.12-dev-cd8295f
skyflow-bharti Jul 29, 2026
5ee9ede
[AUTOMATED] Private Release 3.0.0-beta.12-dev-7720bcf
skyflow-bharti Jul 29, 2026
f0b12e5
[AUTOMATED] Private Release 3.0.0-beta.12-dev-5ee9ede
skyflow-bharti Jul 29, 2026
8d90de5
[AUTOMATED] Private Release 3.0.0-beta.12-dev-f0b12e5
skyflow-bharti Jul 29, 2026
75913d6
[AUTOMATED] Private Release 3.0.0-beta.12-dev-8d90de5
skyflow-bharti Jul 29, 2026
dc619e2
[AUTOMATED] Private Release 3.0.0-beta.12-dev-75913d6
skyflow-bharti Jul 29, 2026
871b076
[AUTOMATED] Private Release 3.0.0-beta.12-dev-dc619e2
skyflow-bharti Jul 29, 2026
3b78ea1
[AUTOMATED] Private Release 3.0.0-beta.12-dev-871b076
skyflow-bharti Jul 29, 2026
b4ba3b9
[AUTOMATED] Private Release 3.0.0-beta.12-dev-3b78ea1
skyflow-bharti Jul 29, 2026
a8b92ac
[AUTOMATED] Private Release 3.0.0-beta.12-dev-b4ba3b9
skyflow-bharti Jul 29, 2026
856f336
[AUTOMATED] Private Release 3.0.0-beta.12-dev-a8b92ac
skyflow-bharti Jul 29, 2026
eefe670
[AUTOMATED] Private Release 3.0.0-beta.12-dev-856f336
skyflow-bharti Jul 29, 2026
57be48f
[AUTOMATED] Private Release 3.0.0-beta.12-dev-eefe670
skyflow-bharti Jul 29, 2026
f9fe56b
[AUTOMATED] Private Release 3.0.0-beta.12-dev-57be48f
skyflow-bharti Jul 29, 2026
87cb2d6
[AUTOMATED] Private Release 3.0.0-beta.12-dev-f9fe56b
skyflow-bharti Jul 29, 2026
6d9ed9b
[AUTOMATED] Private Release 3.0.0-beta.12-dev-87cb2d6
skyflow-bharti Jul 29, 2026
8a898d7
[AUTOMATED] Private Release 3.0.0-beta.12-dev-6d9ed9b
skyflow-bharti Jul 29, 2026
05d00b4
[AUTOMATED] Private Release 3.0.0-beta.12-dev-8a898d7
skyflow-bharti Jul 29, 2026
7314518
[AUTOMATED] Private Release 3.0.0-beta.12-dev-05d00b4
skyflow-bharti Jul 29, 2026
ec46c76
[AUTOMATED] Private Release 3.0.0-beta.12-dev-7314518
skyflow-bharti Jul 29, 2026
5daf54a
[AUTOMATED] Private Release 3.0.0-beta.12-dev-ec46c76
skyflow-bharti Jul 29, 2026
bdbf86c
[AUTOMATED] Private Release 3.0.0-beta.12-dev-5daf54a
skyflow-bharti Jul 29, 2026
d04efc2
[AUTOMATED] Private Release 3.0.0-beta.12-dev-bdbf86c
skyflow-bharti Jul 29, 2026
5876f25
[AUTOMATED] Private Release 3.0.0-beta.12-dev-d04efc2
skyflow-bharti Jul 29, 2026
ce3a635
[AUTOMATED] Private Release 3.0.0-beta.12-dev-5876f25
skyflow-bharti Jul 29, 2026
b84c9f5
[AUTOMATED] Private Release 3.0.0-beta.12-dev-ce3a635
skyflow-bharti Jul 29, 2026
bccd071
[AUTOMATED] Private Release 3.0.0-beta.12-dev-b84c9f5
skyflow-bharti Jul 29, 2026
9258bfc
[AUTOMATED] Private Release 3.0.0-beta.12-dev-bccd071
skyflow-bharti Jul 29, 2026
347a849
[AUTOMATED] Private Release 3.0.0-beta.12-dev-9258bfc
skyflow-bharti Jul 29, 2026
36b25d4
[AUTOMATED] Private Release 3.0.0-beta.12-dev-347a849
skyflow-bharti Jul 29, 2026
18d6c20
[AUTOMATED] Private Release 3.0.0-beta.12-dev-36b25d4
skyflow-bharti Jul 29, 2026
19120fc
[AUTOMATED] Private Release 3.0.0-beta.12-dev-18d6c20
skyflow-bharti Jul 29, 2026
3cbf6d2
[AUTOMATED] Private Release 3.0.0-beta.12-dev-19120fc
skyflow-bharti Jul 29, 2026
8475268
[AUTOMATED] Private Release 3.0.0-beta.12-dev-3cbf6d2
skyflow-bharti Jul 29, 2026
c25b398
[AUTOMATED] Private Release 3.0.0-beta.12-dev-8475268
skyflow-bharti Jul 29, 2026
c850711
[AUTOMATED] Private Release 3.0.0-beta.12-dev-c25b398
skyflow-bharti Jul 29, 2026
176fec5
[AUTOMATED] Private Release 3.0.0-beta.12-dev-c850711
skyflow-bharti Jul 29, 2026
e531566
[AUTOMATED] Private Release 3.0.0-beta.12-dev-176fec5
skyflow-bharti Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/beta-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ jobs:
gpg-passphrase: ${{ secrets.MAVEN_GPG_PASSPHRASE }}
skyflow-credentials: ${{ secrets.SKYFLOW_CREDENTIALS }} >> .env
test-expired-token: ${{ secrets.TEST_EXPIRED_TOKEN }} >> .env
test-reusable-token: ${{ secrets.TEST_REUSABLE_TOKEN }} >> .env
test-reusable-token: ${{ secrets.TEST_REUSABLE_TOKEN }} >> .env
pat-actions: ${{ secrets.PAT_ACTIONS }}
3 changes: 2 additions & 1 deletion .github/workflows/internal-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ jobs:
gpg-passphrase: ${{ secrets.JFROG_GPG_PASSPHRASE }}
skyflow-credentials: ${{ secrets.SKYFLOW_CREDENTIALS }} >> .env
test-expired-token: ${{ secrets.TEST_EXPIRED_TOKEN }} >> .env
test-reusable-token: ${{ secrets.TEST_REUSABLE_TOKEN }} >> .env
test-reusable-token: ${{ secrets.TEST_REUSABLE_TOKEN }} >> .env
pat-actions: ${{ secrets.PAT_ACTIONS }}
1 change: 1 addition & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ jobs:
skyflow-credentials: ${{ secrets.SKYFLOW_CREDENTIALS }} >> .env
test-expired-token: ${{ secrets.TEST_EXPIRED_TOKEN }} >> .env
test-reusable-token: ${{ secrets.TEST_REUSABLE_TOKEN }} >> .env
pat-actions: ${{ secrets.PAT_ACTIONS }}
7 changes: 6 additions & 1 deletion .github/workflows/shared-build-and-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ on:
test-reusable-token:
required: true

pat-actions:
required: true

jobs:
publish:
runs-on: ubuntu-latest
Expand All @@ -61,7 +64,9 @@ jobs:
# checkout and reused for the automated version-bump push below, so
# that push satisfies the branch-protection ruleset's repo-admin
# bypass (github-actions[bot] is not a bypass actor). See SK-2986.
token: ${{ secrets.PAT_ACTIONS }}
# Passed through workflow_call.secrets since reusable workflows do
# not inherit the caller's secrets automatically.
token: ${{ secrets.pat-actions }}

- name: Set up maven or jfrog repository
uses: actions/setup-java@v1
Expand Down
20 changes: 16 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,14 +180,19 @@ You can control how long a request is allowed to run and whether failed requests
| Setting | Unit | Default | Description |
| --- | --- | --- | --- |
| `timeout` | seconds | `60` | Overall time budget for a request, including any retries and backoff. |
| `connectTimeout` | seconds | `10` | Time budget for establishing a connection, per attempt. |
| `readTimeout` | seconds | `10` | Time budget for reading the response, per attempt. |
| `writeTimeout` | seconds | `10` | Time budget for writing the request, per attempt. |
| `maxRetries` | count | `0` | Number of retry attempts. `0` disables retries. |
| `initialRetryDelayMillis` | milliseconds | `500` | Base delay before the first retry. |
| `maxRetryDelayMillis` | milliseconds | `2000` | Upper bound on the delay between retries. |

**How the four timeouts relate:** `timeout` is the *total* ceiling for the whole call — every attempt, every backoff sleep, all counted together. `connectTimeout`, `readTimeout`, and `writeTimeout` each bound a single *phase of one attempt* (connecting, reading, writing). Because the phase timeouts are per attempt, their sum across retries can exceed `timeout` — but `timeout` always wins and cuts the call off. In practice, set `timeout` to cap worst-case blocking, and use the phase timeouts to fail faster on a stalled connection or a slow-but-not-dead server. The three phase timeouts default to the underlying HTTP client's `10` seconds; leaving them unset preserves that default.

Each setting is available at two levels:

- **Client-wide** — on `Skyflow.builder()`: `.timeout(int)`, `.maxRetries(int)`, `.initialRetryDelayMillis(long)`, `.maxRetryDelayMillis(long)`. Applies to every vault.
- **Per vault** — on `VaultConfig`: `.setTimeout(int)`, `.setMaxRetries(int)`, `.setInitialRetryDelayMillis(long)`, `.setMaxRetryDelayMillis(long)`. Applies to that vault only.
- **Client-wide** — on `Skyflow.builder()`: `.timeout(int)`, `.connectTimeout(int)`, `.readTimeout(int)`, `.writeTimeout(int)`, `.maxRetries(int)`, `.initialRetryDelayMillis(long)`, `.maxRetryDelayMillis(long)`. Applies to every vault.
- **Per vault** — on `VaultConfig`: `.setTimeout(int)`, `.setConnectTimeout(int)`, `.setReadTimeout(int)`, `.setWriteTimeout(int)`, `.setMaxRetries(int)`, `.setInitialRetryDelayMillis(long)`, `.setMaxRetryDelayMillis(long)`. Applies to that vault only.

**Precedence:** a value set on `VaultConfig` (per vault) overrides the client-wide value set on `Skyflow.builder()`, which overrides the SDK default. Resolution is per field, so a vault can override just `timeout` and still inherit the client-wide retry settings.

Expand All @@ -206,21 +211,28 @@ vaultConfig.setClusterId("<CLUSTER_ID>");
vaultConfig.setEnv(Env.PROD);
vaultConfig.setCredentials(credentials);
vaultConfig.setTimeout(30); // seconds — overall request timeout
vaultConfig.setConnectTimeout(5); // seconds — per-attempt connect timeout
vaultConfig.setReadTimeout(20); // seconds — per-attempt read timeout
vaultConfig.setWriteTimeout(5); // seconds — per-attempt write timeout
vaultConfig.setMaxRetries(3); // retry attempts (0 = retries off)
vaultConfig.setInitialRetryDelayMillis(1000L); // base backoff in milliseconds
vaultConfig.setMaxRetryDelayMillis(4000L); // backoff cap in milliseconds

// Client-wide defaults: apply to every vault unless overridden on the vault (as above).
Skyflow skyflowClient = Skyflow.builder()
.timeout(60) // seconds — overall request timeout
.connectTimeout(10) // seconds — per-attempt connect timeout
.readTimeout(15) // seconds — per-attempt read timeout
.writeTimeout(10) // seconds — per-attempt write timeout
.maxRetries(2) // retry attempts (0 = retries off)
.initialRetryDelayMillis(500L) // base backoff in milliseconds
.maxRetryDelayMillis(2000L) // backoff cap in milliseconds
.addVaultConfig(vaultConfig)
.build();

// Result for this vault: timeout=30, maxRetries=3, initialRetryDelayMillis=1000, maxRetryDelayMillis=4000
// (all overridden per vault). A vault that sets none of these inherits the client-wide values above.
// Result for this vault: timeout=30, connectTimeout=5, readTimeout=20, writeTimeout=5,
// maxRetries=3, initialRetryDelayMillis=1000, maxRetryDelayMillis=4000 (all overridden per vault).
// A vault that sets none of these inherits the client-wide values above.
```

# Vault
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@
* <ul>
* <li>{@code timeout} – overall call timeout in <b>seconds</b> (bounds the whole
* request including retries and backoff). Default: 60.</li>
* <li>{@code connectTimeout} – per-attempt connection-establishment timeout in
* <b>seconds</b>. Default: 10 (the underlying HTTP client default).</li>
* <li>{@code readTimeout} – per-attempt response-read timeout in <b>seconds</b>.
* Default: 10.</li>
* <li>{@code writeTimeout} – per-attempt request-write timeout in <b>seconds</b>.
* Default: 10.</li>
* <li>{@code maxRetries} – retry attempts after the first failure (retries on HTTP
* 408 / 429 / 5xx). Default: 0 — retries are OFF unless you set this (avoids auto-retrying non-idempotent writes).</li>
* <li>{@code initialRetryDelayMillis} – base backoff before the first retry, in <b>milliseconds</b>.
Expand All @@ -22,6 +28,11 @@
* <b>milliseconds</b>. Default: 2000.</li>
* </ul>
*
* <p><b>How they relate:</b> {@code timeout} is the <i>total</i> ceiling for the whole call (all
* attempts + backoff). {@code connectTimeout}/{@code readTimeout}/{@code writeTimeout} each bound a
* single <i>phase of one attempt</i>; because they are per attempt, their sum across retries can
* exceed {@code timeout}, but {@code timeout} always wins and cuts the call off.
*
* <p><b>Two levels + precedence:</b> set client-wide defaults on {@code Skyflow.builder()}, and/or
* per-vault overrides on {@code VaultConfig}. The most specific value wins, resolved per field:
* <b>per-vault &rarr; client-wide &rarr; SDK default</b>.
Expand All @@ -44,6 +55,9 @@ public static void main(String[] args) {
// Per-vault overrides (optional). Any field left unset inherits the client-wide default below,
// and then the SDK default.
vaultConfig.setTimeout(30); // seconds – tighter overall ceiling for this vault
vaultConfig.setConnectTimeout(5); // seconds – fail fast if the connection stalls
vaultConfig.setReadTimeout(20); // seconds – allow a slower response read
vaultConfig.setWriteTimeout(5); // seconds – bound the request write
vaultConfig.setMaxRetries(2); // fewer retries for this vault
vaultConfig.setInitialRetryDelayMillis(500L);
vaultConfig.setMaxRetryDelayMillis(1000L);
Expand All @@ -53,6 +67,9 @@ public static void main(String[] args) {
Skyflow skyflowClient = Skyflow.builder()
.setLogLevel(LogLevel.ERROR)
.timeout(60) // seconds – client-wide overall call timeout
.connectTimeout(10) // seconds – client-wide per-attempt connect timeout
.readTimeout(15) // seconds – client-wide per-attempt read timeout
.writeTimeout(10) // seconds – client-wide per-attempt write timeout
.maxRetries(3) // client-wide retry attempts
.initialRetryDelayMillis(500L) // client-wide base backoff (ms)
.maxRetryDelayMillis(2000L) // client-wide backoff cap (ms)
Expand Down
2 changes: 1 addition & 1 deletion v3/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
</parent>

<artifactId>skyflow-java</artifactId>
<version>3.0.0-beta.12</version>
<version>3.0.0-beta.12-dev.176fec5</version>
<packaging>jar</packaging>
<name>${project.groupId}:${project.artifactId}</name>
<description>Skyflow V3 SDK for the Java programming language</description>
Expand Down
42 changes: 40 additions & 2 deletions v3/src/main/java/com/skyflow/Skyflow.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@ public static final class SkyflowClientBuilder extends BaseSkyflowClientBuilder
private final LinkedHashMap<String, VaultController> vaultClientsMap;
// Client-wide HTTP config defaults (apply to all vaults unless a vault overrides). null => SDK default.
private Integer timeout;
private Integer connectTimeout;
private Integer readTimeout;
private Integer writeTimeout;
private Integer maxRetries;
private Long initialRetryDelayMillis;
private Long maxRetryDelayMillis;
Expand Down Expand Up @@ -84,7 +87,8 @@ public SkyflowClientBuilder addVaultConfig(VaultConfig vaultConfig) throws Skyfl
} else {
this.vaultConfigMap.put(vaultConfigCopy.getVaultId(), vaultConfigCopy); // add new config in map
VaultController controller = new VaultController(vaultConfigCopy, this.skyflowCredentials); // new controller with new config
controller.setCommonHttpConfig(this.timeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis);
controller.setCommonHttpConfig(this.timeout, this.connectTimeout, this.readTimeout,
this.writeTimeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis);
this.vaultClientsMap.put(vaultConfigCopy.getVaultId(), controller);
LogUtil.printInfoLog(Utils.parameterizedString(
InfoLogs.VAULT_CONTROLLER_INITIALIZED.getLog(), vaultConfigCopy.getVaultId()));
Expand Down Expand Up @@ -114,6 +118,39 @@ public SkyflowClientBuilder timeout(int timeout) {
return this;
}

/**
* Client-wide per-attempt connection-establishment timeout in seconds. Applies to all vaults
* unless a vault overrides it; when unset the underlying HTTP client default (10s) applies.
* The overall {@code timeout} still bounds the whole call, including retries.
*/
public SkyflowClientBuilder connectTimeout(int connectTimeout) {
this.connectTimeout = connectTimeout;
propagateHttpConfig();
return this;
}

/**
* Client-wide per-attempt response-read timeout in seconds. Applies to all vaults unless a
* vault overrides it; when unset the underlying HTTP client default (10s) applies. The overall
* {@code timeout} still bounds the whole call, including retries.
*/
public SkyflowClientBuilder readTimeout(int readTimeout) {
this.readTimeout = readTimeout;
propagateHttpConfig();
return this;
}

/**
* Client-wide per-attempt request-write timeout in seconds. Applies to all vaults unless a
* vault overrides it; when unset the underlying HTTP client default (10s) applies. The overall
* {@code timeout} still bounds the whole call, including retries.
*/
public SkyflowClientBuilder writeTimeout(int writeTimeout) {
this.writeTimeout = writeTimeout;
propagateHttpConfig();
return this;
}

/** Client-wide retry attempt count. Applies to all vaults unless a vault overrides it. */
public SkyflowClientBuilder maxRetries(int maxRetries) {
this.maxRetries = maxRetries;
Expand All @@ -137,7 +174,8 @@ public SkyflowClientBuilder maxRetryDelayMillis(long maxRetryDelayMillis) {

private void propagateHttpConfig() {
for (VaultController vault : this.vaultClientsMap.values()) {
vault.setCommonHttpConfig(this.timeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis);
vault.setCommonHttpConfig(this.timeout, this.connectTimeout, this.readTimeout,
this.writeTimeout, this.maxRetries, this.initialRetryDelayMillis, this.maxRetryDelayMillis);
}
}

Expand Down
40 changes: 36 additions & 4 deletions v3/src/main/java/com/skyflow/VaultClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ public class VaultClient {
private String currentVaultURL = null;
// Client-wide (Skyflow builder) HTTP config defaults; null => fall back to the SDK defaults below.
private Integer commonTimeout;
private Integer commonConnectTimeout;
private Integer commonReadTimeout;
private Integer commonWriteTimeout;
private Integer commonMaxRetries;
private Long commonInitialRetryDelayMillis;
private Long commonMaxRetryDelayMillis;
Expand Down Expand Up @@ -84,9 +87,13 @@ protected void setCommonCredentials(Credentials commonCredentials) throws Skyflo
* Client-wide HTTP timeout/retry defaults from the Skyflow builder. Nulls out the cached client
* so the next call rebuilds with the new values.
*/
protected void setCommonHttpConfig(Integer timeout, Integer maxRetries,
protected void setCommonHttpConfig(Integer timeout, Integer connectTimeout, Integer readTimeout,
Integer writeTimeout, Integer maxRetries,
Long initialRetryDelayMillis, Long maxRetryDelayMillis) {
this.commonTimeout = timeout;
this.commonConnectTimeout = connectTimeout;
this.commonReadTimeout = readTimeout;
this.commonWriteTimeout = writeTimeout;
this.commonMaxRetries = maxRetries;
this.commonInitialRetryDelayMillis = initialRetryDelayMillis;
this.commonMaxRetryDelayMillis = maxRetryDelayMillis;
Expand Down Expand Up @@ -175,8 +182,12 @@ protected void updateExecutorInHTTP() {
vaultConfig.getInitialRetryDelayMillis(), commonInitialRetryDelayMillis, DEFAULT_INITIAL_RETRY_DELAY_MILLIS);
long maxRetryDelayMillis = resolveLong(
vaultConfig.getMaxRetryDelayMillis(), commonMaxRetryDelayMillis, DEFAULT_MAX_RETRY_DELAY_MILLIS);
// Per-attempt timeouts: null => leave OkHttp's built-in 10s default (backward compatible).
Integer connectTimeout = resolveNullableInt(vaultConfig.getConnectTimeout(), commonConnectTimeout);
Integer readTimeout = resolveNullableInt(vaultConfig.getReadTimeout(), commonReadTimeout);
Integer writeTimeout = resolveNullableInt(vaultConfig.getWriteTimeout(), commonWriteTimeout);

sharedHttpClient = new OkHttpClient.Builder()
OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder()
.connectionPool(new ConnectionPool(10, 1, TimeUnit.MINUTES))
.callTimeout(timeoutSeconds, TimeUnit.SECONDS) // overall ceiling; bounds the whole call incl. retries
.addInterceptor(new RetryInterceptor( // OUTER: retries (Fern generated; jitter default 0.2)
Expand All @@ -186,8 +197,18 @@ protected void updateExecutorInHTTP() {
.header("Authorization", "Bearer " + this.token)
.build();
return chain.proceed(requestWithAuth);
})
.build();
});
// Per-attempt phase timeouts; only override when explicitly configured.
if (connectTimeout != null) {
httpBuilder.connectTimeout(connectTimeout, TimeUnit.SECONDS);
}
if (readTimeout != null) {
httpBuilder.readTimeout(readTimeout, TimeUnit.SECONDS);
}
if (writeTimeout != null) {
httpBuilder.writeTimeout(writeTimeout, TimeUnit.SECONDS);
}
sharedHttpClient = httpBuilder.build();
apiClientBuilder.httpClient(sharedHttpClient);
}
}
Expand All @@ -200,6 +221,17 @@ private static int resolveInt(Integer vaultLevel, Integer clientLevel, int defau
return clientLevel != null ? clientLevel : defaultValue;
}

/**
* Resolve an optional int setting: vault-level override, else client-wide default, else null.
* Null means "not configured" — the caller leaves the underlying HTTP client default in place.
*/
private static Integer resolveNullableInt(Integer vaultLevel, Integer clientLevel) {
if (vaultLevel != null) {
return vaultLevel;
}
return clientLevel;
}

/** Resolve a long setting: vault-level override, else client-wide default, else SDK default. */
private static long resolveLong(Long vaultLevel, Long clientLevel, long defaultValue) {
if (vaultLevel != null) {
Expand Down
Loading
Loading