fix: replace duplicate packet IDs before sending queue (#646)

This commit is contained in:
Andre K
2023-06-20 08:22:10 -03:00
committed by GitHub
parent 9970ced53b
commit bb3b1eaa85
3 changed files with 17 additions and 0 deletions

View File

@@ -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)
}

View File

@@ -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<DataPacket>

View File

@@ -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) {