refactor(persistence): consolidate monitoring index migrations

- Merge migrations 0039 through 0041 into a single 0039 migration
- Preserve existing indexes and support partial historical schemas
- Update migration tests for the consolidated revision
This commit is contained in:
BiFangKNT
2026-10-18 09:58:30 +08:00
parent d610d64c67
commit f42d3919cb
6 changed files with 46 additions and 88 deletions
@@ -10,7 +10,8 @@ from langbot.pkg.entity.persistence.monitoring import MonitoringMessage
def test_conversation_index_migration_preserves_history_and_matches_metadata():
migration = importlib.import_module('langbot.pkg.persistence.alembic.versions.0040_conversation_page_index')
migration = importlib.import_module('langbot.pkg.persistence.alembic.versions.0039_execution_lease_indexes')
index_name = 'ix_monitoring_messages_conversation_page'
engine = sa.create_engine('sqlite:///:memory:')
metadata = sa.MetaData()
table = sa.Table(
@@ -18,7 +19,16 @@ def test_conversation_index_migration_preserves_history_and_matches_metadata():
metadata,
*[
sa.Column(name, sa.String, primary_key=name == 'id')
for name in ('id', 'workspace_uuid', 'bot_id', 'session_id', 'timestamp', 'message_content')
for name in (
'id',
'workspace_uuid',
'bot_id',
'session_id',
'timestamp',
'message_content',
'status',
'execution_lease_expires_at',
)
],
)
sa.Index('existing_index', table.c.workspace_uuid)
@@ -32,8 +42,8 @@ def test_conversation_index_migration_preserves_history_and_matches_metadata():
indexes = {
index['name']: index['column_names'] for index in sa.inspect(connection).get_indexes(table.name)
}
expected = next(index for index in MonitoringMessage.__table__.indexes if index.name == migration.INDEX)
assert indexes[migration.INDEX] == [column.name for column in expected.columns]
expected = next(index for index in MonitoringMessage.__table__.indexes if index.name == index_name)
assert indexes[index_name] == [column.name for column in expected.columns]
migration.downgrade()
assert {index['name'] for index in sa.inspect(connection).get_indexes(table.name)} == {'existing_index'}
assert connection.scalar(sa.select(table.c.message_content)) == 'inline media'
@@ -53,9 +53,10 @@ def test_lease_index_migration_preserves_data_and_existing_indexes(source):
assert original_indexes[table] <= indexes.keys()
MIGRATION.downgrade()
for table, (index, _) in LEASE_INDEXES.items():
for table in LEASE_INDEXES:
remaining = {item['name'] for item in sa.inspect(connection).get_indexes(table)}
assert remaining == original_indexes[table] - {index}
removed = {index for index_table, index, _ in MIGRATION.INDEXES if index_table == table}
assert remaining == original_indexes[table] - removed
assert connection.scalar(sa.select(AgentRun.status)) == 'completed'
MIGRATION.upgrade()
@@ -306,7 +306,7 @@ async def test_storage_maintenance_uses_media_ttl_for_inline_records(application
def test_ttl_indexes_migrate_idempotently_and_support_cursor_queries():
migration = importlib.import_module('langbot.pkg.persistence.alembic.versions.0041_inline_media_ttl_indexes')
migration = importlib.import_module('langbot.pkg.persistence.alembic.versions.0039_execution_lease_indexes')
engine = sa.create_engine('sqlite:///:memory:')
try:
with engine.begin() as connection:
@@ -315,14 +315,12 @@ def test_ttl_indexes_migrate_idempotently_and_support_cursor_queries():
migration.downgrade()
migration.upgrade()
migration.upgrade()
for table, columns in migration.INDEXES:
for table, name, columns in migration.INDEXES:
indexes = {
index['name']: index['column_names'] for index in sa.inspect(connection).get_indexes(table)
}
assert indexes[f'ix_{table}_media_ttl'] == columns
orm_index = next(
index for index in Base.metadata.tables[table].indexes if index.name == f'ix_{table}_media_ttl'
)
assert indexes[name] == columns
orm_index = next(index for index in Base.metadata.tables[table].indexes if index.name == name)
assert [column.name for column in orm_index.columns] == columns
query = (
sa.select(MonitoringMessage.id, MonitoringMessage.message_content)
@@ -343,11 +341,8 @@ def test_ttl_indexes_migrate_idempotently_and_support_cursor_queries():
engine.dispose()
@pytest.mark.parametrize(
'revision', ['0039_execution_lease_indexes', '0040_conversation_page_index', '0041_inline_media_ttl_indexes']
)
def test_index_migrations_allow_historical_schemas_without_monitoring_tables(revision):
migration = importlib.import_module(f'langbot.pkg.persistence.alembic.versions.{revision}')
def test_index_migration_allows_historical_schemas_without_monitoring_tables():
migration = importlib.import_module('langbot.pkg.persistence.alembic.versions.0039_execution_lease_indexes')
engine = sa.create_engine('sqlite:///:memory:')
try:
with engine.begin() as connection: