mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-27 20:15:21 +00:00
fix: check actual collisions instead of not
This commit is contained in:
parent
50c4dd4b43
commit
f723069775
@ -23,14 +23,6 @@ class SessionJobDatabase(context: Context, helper: SQLCipherOpenHelper) : Databa
|
|||||||
fun persistJob(job: Job) {
|
fun persistJob(job: Job) {
|
||||||
val database = databaseHelper.writableDatabase
|
val database = databaseHelper.writableDatabase
|
||||||
val contentValues = ContentValues(4)
|
val contentValues = ContentValues(4)
|
||||||
val existing = database.get(sessionJobTable, "$jobID = ?", arrayOf(job.id!!)) { cursor ->
|
|
||||||
cursor.count
|
|
||||||
} ?: 0
|
|
||||||
// When adding multiple jobs in rapid succession, timestamps might not be good enough as a unique ID. To
|
|
||||||
// deal with this we keep track of the number of jobs with a given timestamp and that to the end of the
|
|
||||||
// timestamp to make it a unique ID. We can't use a random number because we do still want to keep track
|
|
||||||
// of the order in which the jobs were added.
|
|
||||||
job.id += existing
|
|
||||||
contentValues.put(jobID, job.id)
|
contentValues.put(jobID, job.id)
|
||||||
contentValues.put(jobType, job.getFactoryKey())
|
contentValues.put(jobType, job.getFactoryKey())
|
||||||
contentValues.put(failureCount, job.failureCount)
|
contentValues.put(failureCount, job.failureCount)
|
||||||
|
@ -6,7 +6,9 @@ import kotlinx.coroutines.channels.Channel.Factory.UNLIMITED
|
|||||||
import org.session.libsession.messaging.MessagingConfiguration
|
import org.session.libsession.messaging.MessagingConfiguration
|
||||||
import org.session.libsignal.utilities.logging.Log
|
import org.session.libsignal.utilities.logging.Log
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
import kotlin.concurrent.schedule
|
import kotlin.concurrent.schedule
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
import kotlin.math.pow
|
import kotlin.math.pow
|
||||||
@ -16,6 +18,8 @@ import kotlin.math.roundToLong
|
|||||||
class JobQueue : JobDelegate {
|
class JobQueue : JobDelegate {
|
||||||
private var hasResumedPendingJobs = false // Just for debugging
|
private var hasResumedPendingJobs = false // Just for debugging
|
||||||
|
|
||||||
|
private val jobTimestampMap = ConcurrentHashMap<Long, AtomicInteger>()
|
||||||
|
|
||||||
private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
|
private val dispatcher = Executors.newSingleThreadExecutor().asCoroutineDispatcher()
|
||||||
private val scope = GlobalScope + SupervisorJob()
|
private val scope = GlobalScope + SupervisorJob()
|
||||||
private val queue = Channel<Job>(UNLIMITED)
|
private val queue = Channel<Job>(UNLIMITED)
|
||||||
@ -44,7 +48,14 @@ class JobQueue : JobDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun addWithoutExecuting(job: Job) {
|
private fun addWithoutExecuting(job: Job) {
|
||||||
job.id = System.currentTimeMillis().toString()
|
// When adding multiple jobs in rapid succession, timestamps might not be good enough as a unique ID. To
|
||||||
|
// deal with this we keep track of the number of jobs with a given timestamp and that to the end of the
|
||||||
|
// timestamp to make it a unique ID. We can't use a random number because we do still want to keep track
|
||||||
|
// of the order in which the jobs were added.
|
||||||
|
val currentTime = System.currentTimeMillis()
|
||||||
|
jobTimestampMap.putIfAbsent(currentTime, AtomicInteger())
|
||||||
|
job.id = jobTimestampMap[currentTime]!!.getAndIncrement().toString()
|
||||||
|
|
||||||
MessagingConfiguration.shared.storage.persistJob(job)
|
MessagingConfiguration.shared.storage.persistJob(job)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user