fix(simulation): fix SQLite lock on Azure Files and Neo4j clone query

- Add nobrl,cache=strict,nosharesock,actimeo=30 mount options to the
  Azure Files volume so SQLite can use byte-range locking correctly over
  SMB (without nobrl, Reddit DB creation fails with 'database is locked')
- Fix _execute_neo4j_query to pass parameters as params= keyword arg
  (was parameters_= which the installed neo4j driver does not accept),
  restoring per-simulation graph isolation via clone_graph

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ubuntu 2026-05-11 22:49:38 +00:00
parent a6bf9b3891
commit df6c77255a
2 changed files with 6 additions and 9 deletions

View File

@ -246,8 +246,8 @@ resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
// Recursos mínim viable — escalar horitzontalment via rèpliques // Recursos mínim viable — escalar horitzontalment via rèpliques
resources: { resources: {
cpu: json('0.5') cpu: json('2')
memory: '1Gi' memory: '4Gi'
} }
// Muntar Azure Files quan s'ha configurat storage // Muntar Azure Files quan s'ha configurat storage
@ -266,6 +266,7 @@ resource containerApp 'Microsoft.App/containerApps@2023-05-01' = {
name: 'uploads' name: 'uploads'
storageType: 'AzureFile' storageType: 'AzureFile'
storageName: 'uploads' storageName: 'uploads'
mountOptions: 'nobrl,cache=strict,nosharesock,actimeo=30'
} }
] ]

View File

@ -521,13 +521,9 @@ class GraphitiBackend(GraphBackend):
) )
async def _execute_neo4j_query(self, query: str, parameters: dict = None): async def _execute_neo4j_query(self, query: str, parameters: dict = None):
"""Execute a raw Cypher query against Neo4j via the sync driver in a thread pool.""" """Execute a raw Cypher query against the async Neo4j driver."""
loop = asyncio.get_running_loop() kwargs = {"params": parameters} if parameters else {}
result = await loop.run_in_executor( return await self._client.driver.execute_query(query, **kwargs)
None,
lambda: self._client.driver.execute_query(query, **({"parameters_": parameters} if parameters else {}))
)
return result
async def clone_graph(self, src_group_id: str, dst_group_id: str) -> None: async def clone_graph(self, src_group_id: str, dst_group_id: str) -> None:
"""Clone all nodes and relationships from src_group_id to dst_group_id.""" """Clone all nodes and relationships from src_group_id to dst_group_id."""