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

pull/650/head
Andre K 2023-06-20 08:22:10 -03:00 zatwierdzone przez GitHub
rodzic 9970ced53b
commit bb3b1eaa85
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 17 dodań i 0 usunięć

Wyświetl plik

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

Wyświetl plik

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

Wyświetl plik

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