From f4e5e5e36ad10351c51e14bb0c6513b633faff5a Mon Sep 17 00:00:00 2001 From: jubb Date: Mon, 5 Jul 2021 15:00:32 +1000 Subject: [PATCH] fix: duplicate message send bug on attachments --- .../thoughtcrime/securesms/database/Storage.kt | 3 +-- .../messaging/jobs/AttachmentDownloadJob.kt | 2 +- .../libsession/messaging/jobs/JobQueue.kt | 18 ++++++++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt index 15b91048e2..7fe982a9e3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Storage.kt @@ -27,7 +27,6 @@ import org.session.libsignal.utilities.KeyHelper import org.session.libsignal.utilities.guava.Optional import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper -import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob import org.thoughtcrime.securesms.loki.api.OpenGroupManager import org.thoughtcrime.securesms.loki.database.LokiThreadDatabase @@ -190,7 +189,7 @@ class Storage(context: Context, helper: SQLCipherOpenHelper) : Database(context, override fun resumeMessageSendJobIfNeeded(messageSendJobID: String) { val job = DatabaseFactory.getSessionJobDatabase(context).getMessageSendJob(messageSendJobID) ?: return - JobQueue.shared.add(job) + JobQueue.shared.resumePendingSendMessage(job) } override fun isJobCanceled(job: Job): Boolean { diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt index c2c43b9a31..dfc27eb10f 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt @@ -92,7 +92,7 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) } private fun handleSuccess() { - Log.w(AttachmentUploadJob.TAG, "Attachment downloaded successfully.") + Log.w("AttachmentDownloadJob", "Attachment downloaded successfully.") delegate?.handleJobSucceeded(this) } diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt index e6803e89dc..9ced85b110 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/JobQueue.kt @@ -23,6 +23,7 @@ class JobQueue : JobDelegate { private val attachmentDispatcher = Executors.newFixedThreadPool(2).asCoroutineDispatcher() private val scope = GlobalScope + SupervisorJob() private val queue = Channel(UNLIMITED) + private val pendingJobIds = mutableSetOf() val timer = Timer() @@ -86,6 +87,19 @@ class JobQueue : JobDelegate { MessagingModuleConfiguration.shared.storage.persistJob(job) } + fun resumePendingSendMessage(job: Job) { + val id = job.id ?: run { + Log.e("Loki", "tried to resume pending send job with no ID") + return + } + if (!pendingJobIds.add(id)) { + Log.e("Loki","tried to re-queue pending/in-progress job") + return + } + queue.offer(job) + Log.d("Loki", "resumed pending send message $id") + } + fun resumePendingJobs() { if (hasResumedPendingJobs) { Log.d("Loki", "resumePendingJobs() should only be called once.") @@ -120,6 +134,7 @@ class JobQueue : JobDelegate { override fun handleJobSucceeded(job: Job) { val jobId = job.id ?: return MessagingModuleConfiguration.shared.storage.markJobAsSucceeded(jobId) + pendingJobIds.remove(jobId) } override fun handleJobFailed(job: Job, error: Exception) { @@ -169,4 +184,7 @@ class JobQueue : JobDelegate { val maxBackoff = (10 * 60).toDouble() // 10 minutes return (1000 * 0.25 * min(maxBackoff, (2.0).pow(job.failureCount))).roundToLong() } + + private fun Job.isSend() = this is MessageSendJob || this is AttachmentUploadJob + } \ No newline at end of file