fix: dont await lock releasing (#5161)
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
This commit is contained in:
@@ -692,17 +692,23 @@ const emit = defineEmits<{
|
|||||||
|
|
||||||
async function handleExit() {
|
async function handleExit() {
|
||||||
// Release if we own the lock, or if there was an error checking (we might still own it)
|
// Release if we own the lock, or if there was an error checking (we might still own it)
|
||||||
if (lockStatus.value?.isOwnLock || lockError.value) {
|
const projectId = projectV2.value?.id
|
||||||
const released = await moderationStore.releaseLock(projectV2.value.id)
|
if (projectId && (lockStatus.value?.isOwnLock || lockError.value)) {
|
||||||
|
const released = await moderationStore.releaseLock(projectId)
|
||||||
if (!released && lockStatus.value?.isOwnLock) {
|
if (!released && lockStatus.value?.isOwnLock) {
|
||||||
console.warn('Failed to release moderation lock for project:', projectV2.value.id)
|
console.warn('Failed to release moderation lock for project:', projectId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
emit('exit')
|
emit('exit')
|
||||||
}
|
}
|
||||||
|
|
||||||
async function retryAcquireLock() {
|
async function retryAcquireLock() {
|
||||||
const result = await moderationStore.acquireLock(projectV2.value.id)
|
const projectId = projectV2.value?.id
|
||||||
|
if (!projectId) {
|
||||||
|
console.warn('[retryAcquireLock] No project ID available')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const result = await moderationStore.acquireLock(projectId)
|
||||||
|
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
handleLockAcquired()
|
handleLockAcquired()
|
||||||
@@ -790,6 +796,8 @@ async function maintainPrefetchQueue() {
|
|||||||
if (isPrefetching.value) return
|
if (isPrefetching.value) return
|
||||||
if (!moderationStore.isQueueMode) return
|
if (!moderationStore.isQueueMode) return
|
||||||
|
|
||||||
|
const currentProjectId = projectV2.value?.id
|
||||||
|
|
||||||
isPrefetching.value = true
|
isPrefetching.value = true
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -798,7 +806,9 @@ async function maintainPrefetchQueue() {
|
|||||||
prefetchQueue.value = prefetchQueue.value.filter((p) => now - p.validatedAt < PREFETCH_STALE_MS)
|
prefetchQueue.value = prefetchQueue.value.filter((p) => now - p.validatedAt < PREFETCH_STALE_MS)
|
||||||
|
|
||||||
// 2. Remove entries for current project
|
// 2. Remove entries for current project
|
||||||
prefetchQueue.value = prefetchQueue.value.filter((p) => p.projectId !== projectV2.value.id)
|
if (currentProjectId) {
|
||||||
|
prefetchQueue.value = prefetchQueue.value.filter((p) => p.projectId !== currentProjectId)
|
||||||
|
}
|
||||||
|
|
||||||
// 3. If queue is full enough, exit early
|
// 3. If queue is full enough, exit early
|
||||||
if (prefetchQueue.value.length >= PREFETCH_TARGET_COUNT) {
|
if (prefetchQueue.value.length >= PREFETCH_TARGET_COUNT) {
|
||||||
@@ -808,7 +818,7 @@ async function maintainPrefetchQueue() {
|
|||||||
// 4. Get remaining queue items (excluding current and already prefetched)
|
// 4. Get remaining queue items (excluding current and already prefetched)
|
||||||
const prefetchedIds = new Set(prefetchQueue.value.map((p) => p.projectId))
|
const prefetchedIds = new Set(prefetchQueue.value.map((p) => p.projectId))
|
||||||
const queueItems = [...moderationStore.currentQueue.items]
|
const queueItems = [...moderationStore.currentQueue.items]
|
||||||
const currentIndex = queueItems.indexOf(projectV2.value.id)
|
const currentIndex = currentProjectId ? queueItems.indexOf(currentProjectId) : -1
|
||||||
const remainingItems =
|
const remainingItems =
|
||||||
currentIndex >= 0 ? queueItems.slice(currentIndex + 1) : queueItems.slice(1)
|
currentIndex >= 0 ? queueItems.slice(currentIndex + 1) : queueItems.slice(1)
|
||||||
|
|
||||||
@@ -873,7 +883,11 @@ const MAX_SKIP_ATTEMPTS = 10
|
|||||||
|
|
||||||
async function skipToNextProject() {
|
async function skipToNextProject() {
|
||||||
// Skip the current project
|
// Skip the current project
|
||||||
const currentProjectId = projectV2.value.id
|
const currentProjectId = projectV2.value?.id
|
||||||
|
if (!currentProjectId) {
|
||||||
|
console.warn('[skipToNextProject] No current project ID, aborting')
|
||||||
|
return
|
||||||
|
}
|
||||||
debug('[skipToNextProject] Starting. Current project:', currentProjectId)
|
debug('[skipToNextProject] Starting. Current project:', currentProjectId)
|
||||||
debug('[skipToNextProject] Queue before complete:', [...moderationStore.currentQueue.items])
|
debug('[skipToNextProject] Queue before complete:', [...moderationStore.currentQueue.items])
|
||||||
|
|
||||||
@@ -1822,16 +1836,30 @@ function generateModpackMessage(allFiles: {
|
|||||||
|
|
||||||
const hasNextProject = ref(false)
|
const hasNextProject = ref(false)
|
||||||
async function sendMessage(status: ProjectStatus) {
|
async function sendMessage(status: ProjectStatus) {
|
||||||
|
// Capture project data upfront to avoid null issues during async operations
|
||||||
|
const projectId = projectV2.value?.id
|
||||||
|
const threadId = projectV2.value?.thread_id
|
||||||
|
const projectType = projectV2.value?.project_type
|
||||||
|
|
||||||
|
if (!projectId) {
|
||||||
|
addNotification({
|
||||||
|
title: 'Error submitting moderation',
|
||||||
|
text: 'Project data unavailable. Please try again.',
|
||||||
|
type: 'error',
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await useBaseFetch(`project/${projectV2.value.id}`, {
|
await useBaseFetch(`project/${projectId}`, {
|
||||||
method: 'PATCH',
|
method: 'PATCH',
|
||||||
body: {
|
body: {
|
||||||
status,
|
status,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
if (message.value) {
|
if (message.value && threadId) {
|
||||||
await useBaseFetch(`thread/${projectV2.value.thread_id}`, {
|
await useBaseFetch(`thread/${threadId}`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: {
|
body: {
|
||||||
body: {
|
body: {
|
||||||
@@ -1842,10 +1870,7 @@ async function sendMessage(status: ProjectStatus) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (projectType === 'modpack' && Object.keys(modpackJudgements.value).length > 0) {
|
||||||
projectV2.value.project_type === 'modpack' &&
|
|
||||||
Object.keys(modpackJudgements.value).length > 0
|
|
||||||
) {
|
|
||||||
await useBaseFetch(`moderation/project`, {
|
await useBaseFetch(`moderation/project`, {
|
||||||
internal: true,
|
internal: true,
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -1853,12 +1878,16 @@ async function sendMessage(status: ProjectStatus) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const willHaveNext = moderationStore.completeCurrentProject(projectId, 'completed')
|
||||||
|
|
||||||
|
moderationStore.releaseLock(projectId).catch((err) => {
|
||||||
|
console.warn('Failed to release lock:', err)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Set both states together - hasNextProject MUST be set before done
|
||||||
|
// to avoid the race condition where done=true renders with hasNextProject=false
|
||||||
|
hasNextProject.value = willHaveNext
|
||||||
done.value = true
|
done.value = true
|
||||||
|
|
||||||
// Release the lock after successful submission
|
|
||||||
await moderationStore.releaseLock(projectV2.value.id)
|
|
||||||
|
|
||||||
hasNextProject.value = moderationStore.completeCurrentProject(projectV2.value.id, 'completed')
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error submitting moderation:', error)
|
console.error('Error submitting moderation:', error)
|
||||||
addNotification({
|
addNotification({
|
||||||
@@ -1900,7 +1929,7 @@ async function endChecklist(status?: string) {
|
|||||||
if (!(await navigateToNextUnlockedProject())) {
|
if (!(await navigateToNextUnlockedProject())) {
|
||||||
// Fallback: batch check remaining projects with metadata
|
// Fallback: batch check remaining projects with metadata
|
||||||
const remainingIds: string[] = []
|
const remainingIds: string[] = []
|
||||||
const currentProjectId = projectV2.value.id
|
const currentProjectId = projectV2.value?.id
|
||||||
const queueItems = moderationStore.currentQueue.items
|
const queueItems = moderationStore.currentQueue.items
|
||||||
|
|
||||||
// Build list of remaining projects, excluding current
|
// Build list of remaining projects, excluding current
|
||||||
@@ -1971,10 +2000,21 @@ async function endChecklist(status?: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function skipCurrentProject() {
|
async function skipCurrentProject() {
|
||||||
// Release the lock before skipping
|
const projectId = projectV2.value?.id
|
||||||
await moderationStore.releaseLock(projectV2.value.id)
|
if (!projectId) {
|
||||||
|
addNotification({
|
||||||
|
title: 'Error skipping project',
|
||||||
|
text: 'Project data unavailable. Please try again.',
|
||||||
|
type: 'error',
|
||||||
|
})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
hasNextProject.value = moderationStore.completeCurrentProject(projectV2.value.id, 'skipped')
|
moderationStore.releaseLock(projectId).catch((err) => {
|
||||||
|
console.warn('Failed to release lock:', err)
|
||||||
|
})
|
||||||
|
|
||||||
|
hasNextProject.value = moderationStore.completeCurrentProject(projectId, 'skipped')
|
||||||
|
|
||||||
await endChecklist('skipped')
|
await endChecklist('skipped')
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user