From bb3b1eaa85fd39baf637a2e0a654e59c8889bee5 Mon Sep 17 00:00:00 2001 From: Andre K Date: Tue, 20 Jun 2023 08:22:10 -0300 Subject: [PATCH] fix: replace duplicate packet IDs before sending queue (#646) --- .../java/com/geeksville/mesh/database/PacketRepository.kt | 4 ++++ .../java/com/geeksville/mesh/database/dao/PacketDao.kt | 6 ++++++ .../main/java/com/geeksville/mesh/service/MeshService.kt | 7 +++++++ 3 files changed, 17 insertions(+) diff --git a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt b/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt index 9775bb0db..7f0f54d9f 100644 --- a/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt +++ b/app/src/main/java/com/geeksville/mesh/database/PacketRepository.kt @@ -34,6 +34,10 @@ class PacketRepository @Inject constructor(private val packetDaoLazy: dagger.Laz packetDao.updateMessageStatus(d, m) } + suspend fun updateMessageId(d: DataPacket, id: Int) = withContext(Dispatchers.IO) { + packetDao.updateMessageId(d, id) + } + suspend fun getDataPacketById(requestId: Int) = withContext(Dispatchers.IO) { packetDao.getDataPacketById(requestId) } diff --git a/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt b/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt index 9c166c024..979b699ea 100644 --- a/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt +++ b/app/src/main/java/com/geeksville/mesh/database/dao/PacketDao.kt @@ -48,6 +48,12 @@ interface PacketDao { findDataPacket(data)?.let { update(it.copy(data = new)) } } + @Transaction + fun updateMessageId(data: DataPacket, id: Int) { + val new = data.copy(id = id) + findDataPacket(data)?.let { update(it.copy(data = new)) } + } + @Query("Select data from packet order by received_time asc") fun getDataPackets(): List diff --git a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt index e82f78083..d327586eb 100644 --- a/app/src/main/java/com/geeksville/mesh/service/MeshService.kt +++ b/app/src/main/java/com/geeksville/mesh/service/MeshService.kt @@ -850,6 +850,13 @@ class MeshService : Service(), Logging { private fun processQueuedPackets() = serviceScope.handledLaunch { packetRepository.get().getQueuedPackets()?.forEach { p -> + // check for duplicate packet IDs before sending (so ACK/NAK updates can work) + if (getDataPacketById(p.id)?.time != p.time) { + val newId = generatePacketId() + debug("Replaced duplicate packet ID in queue: ${p.id}, with: $newId") + packetRepository.get().updateMessageId(p, newId) + p.id = newId + } try { sendNow(p) } catch (ex: Exception) {