Skip to content

Commit

Permalink
feat: Replace vfolder's status_history's type dict with list
Browse files Browse the repository at this point in the history
  • Loading branch information
jopemachine committed Dec 5, 2024
1 parent ecef6b9 commit f8a44b4
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""Replace vfolders status_history's type map with list
Revision ID: 786be66ef4e5
Revises: 8c8e90aebacd
Create Date: 2024-05-07 05:10:23.799723
"""

from alembic import op

# revision identifiers, used by Alembic.
revision = "786be66ef4e5"
down_revision = "8c8e90aebacd"
branch_labels = None
depends_on = None


def upgrade():
op.execute(
"""
WITH data AS (
SELECT id,
(jsonb_each(status_history)).key AS status,
(jsonb_each(status_history)).value AS timestamp
FROM vfolders
)
UPDATE vfolders
SET status_history = (
SELECT jsonb_agg(
jsonb_build_object('status', status, 'timestamp', timestamp)
)
FROM data
WHERE data.id = vfolders.id
);
"""
)

op.execute("UPDATE vfolders SET status_history = '[]'::jsonb WHERE status_history IS NULL;")
op.alter_column(
"vfolders",
"status_history",
nullable=False,
default=[],
)


def downgrade():
op.execute(
"""
WITH data AS (
SELECT id,
jsonb_object_agg(
elem->>'status', elem->>'timestamp'
) AS new_status_history
FROM vfolders,
jsonb_array_elements(status_history) AS elem
GROUP BY id
)
UPDATE vfolders
SET status_history = data.new_status_history
FROM data
WHERE data.id = vfolders.id;
"""
)

op.alter_column("vfolders", "status_history", nullable=True, default=None)
op.execute("UPDATE vfolders SET status_history = NULL WHERE status_history = '[]'::jsonb;")
28 changes: 15 additions & 13 deletions src/ai/backend/manager/models/vfolder.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,12 @@
from .storage import PermissionContext as StorageHostPermissionContext
from .storage import PermissionContextBuilder as StorageHostPermissionContextBuilder
from .user import UserRole, UserRow
from .utils import ExtendedAsyncSAEngine, execute_with_retry, execute_with_txn_retry, sql_json_merge
from .utils import (
ExtendedAsyncSAEngine,
execute_with_retry,
execute_with_txn_retry,
sql_append_dict_to_list,
)

if TYPE_CHECKING:
from ..api.context import BackgroundTaskManager
Expand Down Expand Up @@ -364,14 +369,14 @@ class VFolderCloneInfo(NamedTuple):
nullable=False,
index=True,
),
# status_history records the most recent status changes for each status
# status_history records the status changes of the vfolder.
# e.g)
# {
# "ready": "2022-10-22T10:22:30",
# "delete-pending": "2022-10-22T11:40:30",
# "delete-ongoing": "2022-10-25T10:22:30"
# }
sa.Column("status_history", pgsql.JSONB(), nullable=True, default=sa.null()),
# [
# {"status": "ready", "timestamp": "2022-10-22T10:22:30"},
# {"status": "delete-pending", "timestamp": "2022-10-22T11:40:30"},
# {"status": "delete-ongoing", "timestamp": "2022-10-25T10:22:30"}
# ]
sa.Column("status_history", pgsql.JSONB(), nullable=False, default=[]),
sa.Column("status_changed", sa.DateTime(timezone=True), nullable=True, index=True),
)

Expand Down Expand Up @@ -1049,12 +1054,9 @@ async def _update() -> None:
values = {
"status": update_status,
"status_changed": now,
"status_history": sql_json_merge(
"status_history": sql_append_dict_to_list(
VFolderRow.status_history,
(),
{
update_status.name: now.isoformat(),
},
{"status": update_status.name, "timestamp": now.isoformat()},
),
}
if update_status == VFolderOperationStatus.DELETE_ONGOING:
Expand Down

0 comments on commit f8a44b4

Please sign in to comment.