45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
"""user_disk_usage 表(§7.5 #4 软配额).
|
|
|
|
Revision ID: 0008
|
|
Revises: 0007
|
|
Create Date: 2026-05-27
|
|
|
|
per-user 工作目录字节使用快照,lifespan 后台 task 周期(默 15min)扫描 user_root 落库;
|
|
write 前 gate(DockerExecutor / /v1/files/upload)查这表对比 yaml `quotas.disk_bytes_per_user`,
|
|
超额返 [Error] 硬阻。
|
|
|
|
扫描间隙写入轻微突破上限接受(race-tolerant,跟 image/video 配额一致);外部用户开放前
|
|
OS 层 xfs prjquota 兜底真上限(§7.5 #4)。
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
|
|
revision: str = "0008"
|
|
down_revision: Union[str, None] = "0007"
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.create_table(
|
|
"user_disk_usage",
|
|
sa.Column("user_id", sa.UUID(as_uuid=True), nullable=False),
|
|
sa.Column("bytes_used", sa.BigInteger(), nullable=False,
|
|
server_default=sa.text("0")),
|
|
sa.Column("file_count", sa.Integer(), nullable=False,
|
|
server_default=sa.text("0")),
|
|
sa.Column("scanned_at", sa.DateTime(timezone=True), nullable=False,
|
|
server_default=sa.func.now()),
|
|
sa.PrimaryKeyConstraint("user_id"),
|
|
sa.ForeignKeyConstraint(
|
|
["user_id"], ["users.user_id"], ondelete="CASCADE",
|
|
),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_table("user_disk_usage")
|