Develop #16
@@ -413,6 +413,7 @@ async def delete_resource(
|
|||||||
await soft_delete_object(resource.storage_object_id, request, session)
|
await soft_delete_object(resource.storage_object_id, request, session)
|
||||||
resource.status = "deleted"
|
resource.status = "deleted"
|
||||||
resource.deleted_at = datetime.now(UTC).replace(tzinfo=None)
|
resource.deleted_at = datetime.now(UTC).replace(tzinfo=None)
|
||||||
|
resource.is_deleted = 1
|
||||||
return {
|
return {
|
||||||
"request_id": context.request_id,
|
"request_id": context.request_id,
|
||||||
"data": {"resource_id": resource_id, "status": "deleted"},
|
"data": {"resource_id": resource_id, "status": "deleted"},
|
||||||
|
|||||||
@@ -504,10 +504,7 @@ async def create_script_record(
|
|||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
session.add(storage_object)
|
session.add(storage_object)
|
||||||
session.add(script)
|
|
||||||
await session.flush()
|
await session.flush()
|
||||||
await session.refresh(storage_object)
|
|
||||||
await session.refresh(script)
|
|
||||||
except Exception:
|
except Exception:
|
||||||
# Best-effort compensating cleanup: remove the Jupyter file we
|
# Best-effort compensating cleanup: remove the Jupyter file we
|
||||||
# just created so a failed flush does not leave an orphan on disk.
|
# just created so a failed flush does not leave an orphan on disk.
|
||||||
@@ -522,6 +519,27 @@ async def create_script_record(
|
|||||||
f"after DB flush error: {cleanup_exc.status_code} {cleanup_exc.detail}"
|
f"after DB flush error: {cleanup_exc.status_code} {cleanup_exc.detail}"
|
||||||
)
|
)
|
||||||
raise
|
raise
|
||||||
|
await session.refresh(storage_object)
|
||||||
|
|
||||||
|
try:
|
||||||
|
session.add(script)
|
||||||
|
await session.flush()
|
||||||
|
except Exception:
|
||||||
|
# If the Scripts row fails, the active transaction rolls back the
|
||||||
|
# StorageObjects insert as well because both share the same session.
|
||||||
|
# Still attempt to remove the Jupyter file we just pushed.
|
||||||
|
try:
|
||||||
|
await runtime_client.delete_file(workspace_id, name=jupyter_path)
|
||||||
|
except RuntimeClientError as cleanup_exc:
|
||||||
|
if cleanup_exc.status_code == 404:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
logger.warning(
|
||||||
|
f"failed to clean up Jupyter file {jupyter_path} "
|
||||||
|
f"after DB flush error: {cleanup_exc.status_code} {cleanup_exc.detail}"
|
||||||
|
)
|
||||||
|
raise
|
||||||
|
await session.refresh(script)
|
||||||
return script, storage_object
|
return script, storage_object
|
||||||
|
|
||||||
|
|
||||||
@@ -975,6 +993,7 @@ async def delete_workspace_directory(
|
|||||||
)
|
)
|
||||||
if script is not None:
|
if script is not None:
|
||||||
script.status = "deleted"
|
script.status = "deleted"
|
||||||
|
script.is_deleted = 1
|
||||||
script.deleted_at = datetime.now(UTC).replace(tzinfo=None)
|
script.deleted_at = datetime.now(UTC).replace(tzinfo=None)
|
||||||
deleted_scripts += 1
|
deleted_scripts += 1
|
||||||
descendant.object_status = "deleted"
|
descendant.object_status = "deleted"
|
||||||
@@ -1287,6 +1306,7 @@ async def delete_script(
|
|||||||
|
|
||||||
script.status = "deleted"
|
script.status = "deleted"
|
||||||
script.deleted_at = datetime.now(UTC).replace(tzinfo=None)
|
script.deleted_at = datetime.now(UTC).replace(tzinfo=None)
|
||||||
|
script.is_deleted = 1
|
||||||
return {
|
return {
|
||||||
"request_id": context.request_id,
|
"request_id": context.request_id,
|
||||||
"data": {
|
"data": {
|
||||||
|
|||||||
@@ -603,6 +603,7 @@ async def soft_delete_object(
|
|||||||
item.trash_key = trash_key
|
item.trash_key = trash_key
|
||||||
item.object_status = "deleted"
|
item.object_status = "deleted"
|
||||||
item.deleted_at = _utcnow_naive()
|
item.deleted_at = _utcnow_naive()
|
||||||
|
item.is_deleted = 1
|
||||||
return {
|
return {
|
||||||
"data": {
|
"data": {
|
||||||
"storage_object_id": storage_object_id,
|
"storage_object_id": storage_object_id,
|
||||||
|
|||||||
@@ -19,14 +19,6 @@ class Scripts(Base):
|
|||||||
"visibility",
|
"visibility",
|
||||||
"status",
|
"status",
|
||||||
),
|
),
|
||||||
Index("uk_scripts_current_object", "current_object_id", unique=True),
|
|
||||||
Index(
|
|
||||||
"uk_scripts_workspace_name",
|
|
||||||
"workspace_id",
|
|
||||||
"script_name",
|
|
||||||
"script_type",
|
|
||||||
unique=True,
|
|
||||||
),
|
|
||||||
{"comment": "可执行 Python/Notebook 脚本"},
|
{"comment": "可执行 Python/Notebook 脚本"},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,6 @@ class DataResources(Base):
|
|||||||
"visibility",
|
"visibility",
|
||||||
"status",
|
"status",
|
||||||
),
|
),
|
||||||
Index("uk_data_resources_object", "storage_object_id", unique=True),
|
|
||||||
{"comment": "数据资源"},
|
{"comment": "数据资源"},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user