Skip to content

🎨Storage: HA (🚨🚨🚨 test with multiple replicas) #7375

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’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
f03ada0
added async task for completing upload of file
sanderegg Mar 17, 2025
ce26c50
corrected return value
sanderegg Mar 20, 2025
c106041
now completion is a worker task
sanderegg Mar 20, 2025
86fddde
removed useless code
sanderegg Mar 20, 2025
fe50d9a
new task for copying
sanderegg Mar 20, 2025
3f4385e
added todos to fix
sanderegg Mar 20, 2025
7b1fd2d
call into celery
sanderegg Mar 20, 2025
1531597
added RPC exposed entrypoint for copying folders
sanderegg Mar 20, 2025
58cae29
added exposed RPC entrypoint
sanderegg Mar 20, 2025
8cc2c68
added generator for submit and wait
sanderegg Mar 20, 2025
59e425e
converted to RPC
sanderegg Mar 20, 2025
37fa5be
converted to RPC
sanderegg Mar 20, 2025
d9e8ef8
copy with progress bar
sanderegg Mar 20, 2025
af6c9da
convert S3 progress to progress bar data
sanderegg Mar 20, 2025
0d7f27a
improve
sanderegg Mar 20, 2025
517f4ef
use task_id for coroutines
sanderegg Mar 20, 2025
796933d
still to be fixed
sanderegg Mar 20, 2025
4c9c6d7
mypy
sanderegg Mar 20, 2025
5e8f40c
removed api entrypoint
sanderegg Mar 21, 2025
af3704d
services/storage api version: 0.6.0 → 0.7.0
sanderegg Mar 21, 2025
8523b28
remove moto
sanderegg Mar 24, 2025
b0e24c7
back to moto
sanderegg Mar 24, 2025
ff1b21c
rename
sanderegg Mar 24, 2025
0b052b3
moved stuff around
sanderegg Mar 24, 2025
e7c4324
revert file
sanderegg Mar 24, 2025
9735c64
set an undefined product name
sanderegg Mar 24, 2025
2454b44
type
sanderegg Mar 24, 2025
f05cb05
ensure we do not test with 5Gb
sanderegg Mar 24, 2025
c187e59
reduce load
sanderegg Mar 24, 2025
c83f944
added product_name
sanderegg Mar 24, 2025
0bac485
use fsync=off on postgres while testing
sanderegg Mar 24, 2025
7cda420
moving copy to RPC
sanderegg Mar 24, 2025
aec9cbb
moving copy to RPC
sanderegg Mar 24, 2025
9715c17
moving copy to RPC
sanderegg Mar 24, 2025
d8e9161
moving copy to RPC
sanderegg Mar 24, 2025
490f7b9
pylint
sanderegg Mar 25, 2025
21136c9
minor
sanderegg Mar 25, 2025
3b02d3c
cleanup
sanderegg Mar 25, 2025
80b0f0d
cleanup
sanderegg Mar 25, 2025
d6aa93e
bad merge
sanderegg Mar 25, 2025
1ba4166
added doc
sanderegg Mar 25, 2025
5e12062
cleanup
sanderegg Mar 25, 2025
d8d98c5
fixed error handling
sanderegg Mar 25, 2025
bf7931f
cleanup
sanderegg Mar 25, 2025
a76274c
@GitHK review: add exceptions
sanderegg Mar 25, 2025
52d9a13
fix mock
sanderegg Mar 25, 2025
92003a3
fix test mocks
sanderegg Mar 25, 2025
d6739e1
@pcrespov review: use ProductName
sanderegg Mar 25, 2025
f0c615b
use dataclass
sanderegg Mar 25, 2025
c970452
fixed tests?
sanderegg Mar 25, 2025
ec038e4
fix the test
sanderegg Mar 25, 2025
77dc4d4
fixed size
sanderegg Mar 25, 2025
d2f85a3
maybe fixes it
sanderegg Mar 25, 2025
21d7e5b
Revert "temporary remove this test"
sanderegg Mar 26, 2025
ed7f753
bad test
sanderegg Mar 26, 2025
bcc3829
fix the test
sanderegg Mar 26, 2025
19006db
revert
sanderegg Mar 26, 2025
b882693
fixed
sanderegg Mar 26, 2025
feb72ea
cleanup
sanderegg Mar 26, 2025
b893180
rename
sanderegg Mar 26, 2025
f36680b
typo
sanderegg Mar 26, 2025
d212b4a
bad merge
sanderegg Mar 26, 2025
de9c703
bad merge
sanderegg Mar 26, 2025
4e1502f
fixed tests
sanderegg Mar 26, 2025
dd67a48
missing dependency
sanderegg Mar 26, 2025
4248b0c
should not be necessary anymore
sanderegg Mar 26, 2025
eb3c42e
ensure sto-worker is there too
sanderegg Mar 26, 2025
30478c8
seems to work better
sanderegg Mar 26, 2025
3907cf9
cannot stop
sanderegg Mar 27, 2025
de6ff9b
add logging of 500
sanderegg Mar 27, 2025
e39a883
being broken because of progress
sanderegg Mar 27, 2025
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
20 changes: 19 additions & 1 deletion packages/service-library/src/servicelib/fastapi/http_error.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import logging
from collections.abc import Awaitable, Callable
from typing import TypeVar

Expand All @@ -10,6 +11,9 @@
from fastapi.responses import JSONResponse
from pydantic import ValidationError

from ..logging_errors import create_troubleshotting_log_kwargs
from ..status_codes_utils import is_5xx_server_error

validation_error_response_definition["properties"] = {
"errors": {
"title": "Validation errors",
Expand All @@ -21,6 +25,8 @@

TException = TypeVar("TException")

_logger = logging.getLogger(__name__)


def make_http_error_handler_for_exception(
status_code: int,
Expand All @@ -36,12 +42,24 @@ def make_http_error_handler_for_exception(
SEE https://docs.python.org/3/library/exceptions.html#concrete-exceptions
"""

async def _http_error_handler(_: Request, exc: Exception) -> JSONResponse:
async def _http_error_handler(request: Request, exc: Exception) -> JSONResponse:
assert isinstance(exc, exception_cls) # nosec
error_content = {
"errors": error_extractor(exc) if error_extractor else [f"{exc}"]
}

if is_5xx_server_error(status_code):
_logger.exception(
create_troubleshotting_log_kwargs(
"Unexpected error happened in the Resource Usage Tracker. Please contact support.",
error=exc,
error_context={
"request": request,
"request.method": f"{request.method}",
},
)
)

return JSONResponse(
content=jsonable_encoder(
{"error": error_content} if envelope_error else error_content
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
AsyncJobNameData,
)
from models_library.api_schemas_storage import STORAGE_RPC_NAMESPACE
from models_library.products import ProductName
from models_library.projects_nodes_io import LocationID
from models_library.rabbitmq_basic_types import RPCMethodName
from models_library.users import UserID
Expand All @@ -17,7 +18,7 @@ async def compute_path_size(
client: RabbitMQRPCClient,
*,
user_id: UserID,
product_name: str,
product_name: ProductName,
location_id: LocationID,
path: Path,
) -> tuple[AsyncJobGet, AsyncJobNameData]:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from models_library.api_schemas_rpc_async_jobs.async_jobs import (
AsyncJobGet,
AsyncJobNameData,
)
from models_library.api_schemas_storage import STORAGE_RPC_NAMESPACE
from models_library.api_schemas_storage.storage_schemas import FoldersBody
from models_library.rabbitmq_basic_types import RPCMethodName
from models_library.users import UserID

from ..._client_rpc import RabbitMQRPCClient
from ..async_jobs.async_jobs import submit


async def copy_folders_from_project(
client: RabbitMQRPCClient,
*,
user_id: UserID,
product_name: str,
body: FoldersBody,
) -> tuple[AsyncJobGet, AsyncJobNameData]:
job_id_data = AsyncJobNameData(user_id=user_id, product_name=product_name)
async_job_rpc_get = await submit(
rabbitmq_rpc_client=client,
rpc_namespace=STORAGE_RPC_NAMESPACE,
method_name=RPCMethodName("copy_folders_from_project"),
job_id_data=job_id_data,
body=body,
)
return async_job_rpc_get, job_id_data
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
"rabbit",
"redis",
"storage",
"sto-worker",
]

pytest_simcore_ops_services_selection = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
"rabbit",
"redis",
"storage",
"sto-worker",
]

pytest_simcore_ops_services_selection = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
"rabbit",
"redis",
"storage",
"sto-worker",
]

pytest_simcore_ops_services_selection = ["minio", "adminer"]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"rabbit",
"redis",
"storage",
"sto-worker",
]

pytest_simcore_ops_services_selection = [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
"rabbit",
"redis",
"storage",
"sto-worker",
]

pytest_simcore_ops_services_selection = [
Expand Down Expand Up @@ -280,7 +281,6 @@ async def test_port_file_accessors(
request: pytest.FixtureRequest,
constant_uuid4: None,
):

if item_value == "symlink_path":
item_value = request.getfixturevalue("symlink_path")
if config_value == "config_value_symlink_path":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@
"rabbit",
"redis",
"storage",
"sto-worker",
"redis",
]

Expand Down Expand Up @@ -934,15 +935,15 @@ async def test_nodeports_integration(
`aioboto` instead of `docker` or `storage-data_manager API`.
"""
# STEP 1
dynamic_services_urls: dict[
str, str
] = await _start_and_wait_for_dynamic_services_ready(
director_v2_client=async_client,
product_name=osparc_product_name,
user_id=current_user["id"],
workbench_dynamic_services=workbench_dynamic_services,
current_study=current_study,
catalog_url=services_endpoint["catalog"],
dynamic_services_urls: dict[str, str] = (
await _start_and_wait_for_dynamic_services_ready(
director_v2_client=async_client,
product_name=osparc_product_name,
user_id=current_user["id"],
workbench_dynamic_services=workbench_dynamic_services,
current_study=current_study,
catalog_url=services_endpoint["catalog"],
)
)

# STEP 2
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
"rabbit",
"redis",
"storage",
"sto-worker",
]

pytest_simcore_ops_services_selection = [
Expand Down Expand Up @@ -179,7 +180,6 @@ async def restore_legacy_state_archives(
node_id: NodeID,
state_paths_to_legacy_archives: dict[Path, Path],
) -> None:

tasks = []
for legacy_archive_zip in state_paths_to_legacy_archives.values():
s3_path = f"{project_id}/{node_id}/{legacy_archive_zip.name}"
Expand Down
2 changes: 1 addition & 1 deletion services/storage/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.6.0
0.7.0
137 changes: 0 additions & 137 deletions services/storage/openapi.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{

Check failure on line 1 in services/storage/openapi.json

View workflow job for this annotation

GitHub Actions / check OAS' are up to date

Error when checking services/storage/openapi.json
"openapi": "3.1.0",
"info": {
"title": "simcore_service_storage",
Expand Down Expand Up @@ -1185,60 +1185,6 @@
}
}
},
"/v0/simcore-s3/folders": {
"post": {
"tags": [
"simcore-s3"
],
"summary": "Copy Folders From Project",
"operationId": "copy_folders_from_project_v0_simcore_s3_folders_post",
"parameters": [
{
"name": "user_id",
"in": "query",
"required": true,
"schema": {
"type": "integer",
"exclusiveMinimum": true,
"title": "User Id",
"minimum": 0
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/FoldersBody"
}
}
}
},
"responses": {
"202": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Envelope_TaskGet_"
}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
},
"/v0/simcore-s3/folders/{folder_id}": {
"delete": {
"tags": [
Expand Down Expand Up @@ -1861,31 +1807,6 @@
"type": "object",
"title": "Envelope[S3Settings]"
},
"Envelope_TaskGet_": {
"properties": {
"data": {
"anyOf": [
{
"$ref": "#/components/schemas/TaskGet"
},
{
"type": "null"
}
]
},
"error": {
"anyOf": [
{},
{
"type": "null"
}
],
"title": "Error"
}
},
"type": "object",
"title": "Envelope[TaskGet]"
},
"Envelope_dict_": {
"properties": {
"data": {
Expand Down Expand Up @@ -2417,31 +2338,6 @@
],
"title": "FileUploadSchema"
},
"FoldersBody": {
"properties": {
"source": {
"type": "object",
"title": "Source"
},
"destination": {
"type": "object",
"title": "Destination"
},
"nodes_map": {
"additionalProperties": {
"type": "string",
"format": "uuid"
},
"propertyNames": {
"format": "uuid"
},
"type": "object",
"title": "Nodes Map"
}
},
"type": "object",
"title": "FoldersBody"
},
"HTTPValidationError": {
"properties": {
"errors": {
Expand Down Expand Up @@ -2639,39 +2535,6 @@
],
"title": "SoftCopyBody"
},
"TaskGet": {
"properties": {
"task_id": {
"type": "string",
"title": "Task Id"
},
"task_name": {
"type": "string",
"title": "Task Name"
},
"status_href": {
"type": "string",
"title": "Status Href"
},
"result_href": {
"type": "string",
"title": "Result Href"
},
"abort_href": {
"type": "string",
"title": "Abort Href"
}
},
"type": "object",
"required": [
"task_id",
"task_name",
"status_href",
"result_href",
"abort_href"
],
"title": "TaskGet"
},
"UploadedPart": {
"properties": {
"number": {
Expand Down
2 changes: 1 addition & 1 deletion services/storage/setup.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 0.6.0
current_version = 0.7.0
commit = True
message = services/storage api version: {current_version} → {new_version}
tag = False
Expand Down
Loading
Loading