Skip to content

Commit 57d594b

Browse files
SK-2296: Release/25.9.14 (#200)
* Merge pull request #199 from skyflowapi/skyflow-vivek/SK-2296-use-sessions-for-insert SK-2296 Use sessions for insert method * [AUTOMATED] Private Release 1.15.4.dev0+1c45049 --------- Co-authored-by: skyflow-vivek <121149418+skyflow-vivek@users.noreply.github.com> Co-authored-by: skyflow-shravan <skyflow-shravan@users.noreply.github.com>
1 parent 450db9d commit 57d594b

File tree

8 files changed

+151
-33
lines changed

8 files changed

+151
-33
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
name: Internal Release
2+
3+
on:
4+
push:
5+
tags-ignore:
6+
- '*.*'
7+
paths-ignore:
8+
- "setup.py"
9+
- "*.yml"
10+
- "*.md"
11+
- "skyflow/version.py"
12+
- "samples/**"
13+
branches:
14+
- release/*
15+
16+
jobs:
17+
build-and-deploy:
18+
uses: ./.github/workflows/shared-build-and-deploy.yml
19+
with:
20+
ref: ${{ github.ref_name }}
21+
tag: 'internal'
22+
secrets: inherit
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
name: Shared Build and Deploy
2+
3+
on:
4+
workflow_call:
5+
inputs:
6+
ref:
7+
description: 'Git reference to use (e.g., main or branch name)'
8+
required: true
9+
type: string
10+
11+
tag:
12+
description: 'Release Tag'
13+
required: true
14+
type: string
15+
16+
jobs:
17+
build-and-deploy:
18+
runs-on: ubuntu-latest
19+
steps:
20+
- uses: actions/checkout@v2
21+
with:
22+
fetch-depth: 0
23+
24+
- uses: actions/setup-python@v2
25+
- name: Install dependencies
26+
run: |
27+
python -m pip install --upgrade pip
28+
pip install setuptools wheel twine
29+
- name: Resolve Branch for the Tagged Commit
30+
id: resolve-branch
31+
if: ${{ inputs.tag == 'beta' || inputs.tag == 'public' }}
32+
run: |
33+
TAG_COMMIT=$(git rev-list -n 1 ${{ github.ref_name }})
34+
BRANCH_NAME=$(git branch -r --contains $TAG_COMMIT | grep -o 'origin/.*' | sed 's|origin/||' | head -n 1)
35+
if [ -z "$BRANCH_NAME" ]; then
36+
echo "Error: Could not resolve branch for the tag."
37+
exit 1
38+
fi
39+
echo "Resolved Branch Name: $BRANCH_NAME"
40+
echo "branch_name=$BRANCH_NAME" >> $GITHUB_ENV
41+
- name: Get Previous tag
42+
id: previoustag
43+
uses: WyriHaximus/github-action-get-previous-tag@v1
44+
with:
45+
fallback: 1.0.0
46+
47+
- name: Bump Version
48+
run: |
49+
chmod +x ./ci-scripts/bump_version.sh
50+
if ${{ inputs.tag == 'internal' }}; then
51+
./ci-scripts/bump_version.sh "${{ steps.previoustag.outputs.tag }}" "$(git rev-parse --short "$GITHUB_SHA")"
52+
else
53+
./ci-scripts/bump_version.sh "${{ steps.previoustag.outputs.tag }}"
54+
fi
55+
- name: Commit changes
56+
run: |
57+
git config user.name "${{ github.actor }}"
58+
git config user.email "${{ github.actor }}@users.noreply.github.com"
59+
git add setup.py
60+
git add skyflow/version.py
61+
if [[ "${{ inputs.tag }}" == "internal" ]]; then
62+
VERSION="${{ steps.previoustag.outputs.tag }}.dev0+$(git rev-parse --short $GITHUB_SHA)"
63+
COMMIT_MESSAGE="[AUTOMATED] Private Release $VERSION"
64+
git commit -m "$COMMIT_MESSAGE"
65+
git push origin ${{ github.ref_name }} -f
66+
fi
67+
- name: Build and Publish to JFrog Artifactory
68+
if: ${{ inputs.tag == 'internal' }}
69+
env:
70+
TWINE_USERNAME: ${{ secrets.JFROG_USERNAME }}
71+
TWINE_PASSWORD: ${{ secrets.JFROG_PASSWORD }}
72+
run: |
73+
python setup.py sdist bdist_wheel
74+
twine upload --repository-url https://prekarilabs.jfrog.io/artifactory/api/pypi/skyflow-python/ dist/*

ci-scripts/bump_version.sh

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
11
Version=$1
22
SEMVER=$Version
3-
43
if [ -z $2 ]
54
then
65
echo "Bumping package version to $1"
7-
86
sed -E "s/current_version = .+/current_version = \'$SEMVER\'/g" setup.py > tempfile && cat tempfile > setup.py && rm -f tempfile
97
sed -E "s/SDK_VERSION = .+/SDK_VERSION = \'$SEMVER\'/g" skyflow/version.py > tempfile && cat tempfile > skyflow/version.py && rm -f tempfile
10-
118
echo --------------------------
129
echo "Done, Package now at $1"
1310

1411
else
15-
echo "Bumping package version to $1-dev.$2"
12+
echo "Bumping package version to $1.dev0+$2"
1613

17-
sed -E "s/current_version = .+/current_version = \'$SEMVER-dev.$2\'/g" setup.py > tempfile && cat tempfile > setup.py && rm -f tempfile
18-
sed -E "s/SDK_VERSION = .+/SDK_VERSION = \'$SEMVER-dev.$2\'/g" skyflow/version.py > tempfile && cat tempfile > skyflow/version.py && rm -f tempfile
14+
sed -E "s/current_version = .+/current_version = \'$SEMVER.dev0+$2\'/g" setup.py > tempfile && cat tempfile > setup.py && rm -f tempfile
15+
sed -E "s/SDK_VERSION = .+/SDK_VERSION = \'$SEMVER.dev0+$2\'/g" skyflow/version.py > tempfile && cat tempfile > skyflow/version.py && rm -f tempfile
1916

2017
echo --------------------------
21-
echo "Done, Package now at $1-dev.$2"
22-
fi
18+
echo "Done, Package now at $1.dev0+$2"
19+
fi

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
if sys.version_info < (3, 7):
88
raise RuntimeError("skyflow requires Python 3.7+")
9-
current_version = '1.15.4'
9+
current_version = '1.15.4.dev0+1c45049'
1010

1111
setup(
1212
name='skyflow',

skyflow/_utils.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ def log_error(message: str, interface: str):
5353
class InfoMessages(Enum):
5454
INITIALIZE_CLIENT = "Initializing skyflow client"
5555
CLIENT_INITIALIZED = "Initialized skyflow client successfully"
56+
CLOSING_SESSION = "Closing the session"
5657
VALIDATE_INSERT_RECORDS = "Validating insert records"
5758
VALIDATE_DETOKENIZE_INPUT = "Validating detokenize input"
5859
VALIDATE_GET_BY_ID_INPUT = "Validating getByID input"

skyflow/errors/_skyflow_errors.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class SkyflowErrorCodes(Enum):
1616

1717
class SkyflowErrorMessages(Enum):
1818
API_ERROR = "Server returned status code %s"
19+
NETWORK_ERROR = "Network error occurred: %s"
1920

2021
FILE_NOT_FOUND = "File at %s not found"
2122
FILE_INVALID_JSON = "File at %s is not in JSON format"

skyflow/vault/_client.py

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import types
66
import requests
77
import asyncio
8+
from requests.adapters import HTTPAdapter
89
from skyflow.vault._insert import getInsertRequestBody, processResponse, convertResponse
910
from skyflow.vault._update import sendUpdateRequests, createUpdateResponseBody
1011
from skyflow.vault._config import Configuration, ConnectionConfig, DeleteOptions, DetokenizeOptions, GetOptions, InsertOptions, UpdateOptions, QueryOptions
@@ -36,49 +37,71 @@ def __init__(self, config: Configuration):
3637
raise SkyflowError(SkyflowErrorCodes.INVALID_INPUT, SkyflowErrorMessages.TOKEN_PROVIDER_ERROR.value % (
3738
str(type(config.tokenProvider))), interface=interface)
3839

40+
self._create_session()
3941
self.vaultID = config.vaultID
4042
self.vaultURL = config.vaultURL.rstrip('/')
4143
self.tokenProvider = config.tokenProvider
4244
self.storedToken = ''
4345
log_info(InfoMessages.CLIENT_INITIALIZED.value, interface=interface)
46+
47+
def _create_session(self):
48+
self.session = requests.Session()
49+
adapter = HTTPAdapter(pool_connections=1, pool_maxsize=25, pool_block=True)
50+
self.session.mount("https://", adapter)
51+
52+
def __del__(self):
53+
if (self.session is not None):
54+
log_info(InfoMessages.CLOSING_SESSION.value, interface=InterfaceName.CLIENT.value)
55+
self.session.close()
56+
self.session = None
57+
58+
def _get_session(self):
59+
if (self.session is None):
60+
self._create_session()
61+
return self.session
4462

4563
def insert(self, records: dict, options: InsertOptions = InsertOptions()):
64+
max_retries = 1
4665
interface = InterfaceName.INSERT.value
4766
log_info(InfoMessages.INSERT_TRIGGERED.value, interface=interface)
4867
self._checkConfig(interface)
49-
5068
jsonBody = getInsertRequestBody(records, options)
5169
requestURL = self._get_complete_vault_url()
52-
self.storedToken = tokenProviderWrapper(
53-
self.storedToken, self.tokenProvider, interface)
54-
headers = {
55-
"Authorization": "Bearer " + self.storedToken,
56-
"sky-metadata": json.dumps(getMetrics())
57-
}
58-
max_retries = 3
59-
# Use for-loop for retry logic, avoid code repetition
60-
for attempt in range(max_retries+1):
70+
71+
for attempt in range(max_retries + 1):
6172
try:
62-
# If jsonBody is a dict, use json=, else use data=
63-
response = requests.post(requestURL, data=jsonBody, headers=headers)
73+
self.storedToken = tokenProviderWrapper(
74+
self.storedToken, self.tokenProvider, interface)
75+
headers = {
76+
"Authorization": "Bearer " + self.storedToken,
77+
"sky-metadata": json.dumps(getMetrics()),
78+
}
79+
response = self._get_session().post(
80+
requestURL,
81+
data=jsonBody,
82+
headers=headers,
83+
)
6484
processedResponse = processResponse(response)
6585
result, partial = convertResponse(records, processedResponse, options)
6686
if partial:
6787
log_error(SkyflowErrorMessages.BATCH_INSERT_PARTIAL_SUCCESS.value, interface)
68-
raise SkyflowError(SkyflowErrorCodes.PARTIAL_SUCCESS, SkyflowErrorMessages.BATCH_INSERT_PARTIAL_SUCCESS.value, result, interface=interface)
69-
if 'records' not in result:
88+
elif 'records' not in result:
7089
log_error(SkyflowErrorMessages.BATCH_INSERT_FAILURE.value, interface)
71-
raise SkyflowError(SkyflowErrorCodes.SERVER_ERROR, SkyflowErrorMessages.BATCH_INSERT_FAILURE.value, result, interface=interface)
72-
log_info(InfoMessages.INSERT_DATA_SUCCESS.value, interface)
90+
else:
91+
log_info(InfoMessages.INSERT_DATA_SUCCESS.value, interface)
7392
return result
74-
except Exception as err:
93+
except requests.exceptions.ConnectionError as err:
7594
if attempt < max_retries:
76-
continue
77-
else:
78-
if isinstance(err, SkyflowError):
79-
raise err
80-
else:
81-
raise SkyflowError(SkyflowErrorCodes.SERVER_ERROR, f"Error occurred: {err}", interface=interface)
95+
continue
96+
raise SkyflowError(
97+
SkyflowErrorCodes.SERVER_ERROR,
98+
SkyflowErrorMessages.NETWORK_ERROR.value % str(err),
99+
interface=interface
100+
)
101+
except SkyflowError as err:
102+
if err.code != SkyflowErrorCodes.SERVER_ERROR or attempt >= max_retries:
103+
raise err
104+
continue
82105

83106
def detokenize(self, records: dict, options: DetokenizeOptions = DetokenizeOptions()):
84107
interface = InterfaceName.DETOKENIZE.value

skyflow/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
SDK_VERSION = '1.15.4'
1+
SDK_VERSION = '1.15.4.dev0+1c45049'

0 commit comments

Comments
 (0)