fixing race condition

This commit is contained in:
otsmr 2025-07-14 01:20:06 +02:00
parent 65821aa2c8
commit 37b11cef79
3 changed files with 23 additions and 13 deletions

View file

@ -4,6 +4,7 @@ import 'dart:io';
import 'package:cryptography_plus/cryptography_plus.dart'; import 'package:cryptography_plus/cryptography_plus.dart';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
import 'package:mutex/mutex.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';
import 'package:twonly/src/database/twonly_database.dart'; import 'package:twonly/src/database/twonly_database.dart';
import 'package:twonly/src/database/tables/messages_table.dart'; import 'package:twonly/src/database/tables/messages_table.dart';
@ -19,18 +20,22 @@ import 'package:twonly/src/services/signal/encryption.signal.dart';
import 'package:twonly/src/utils/log.dart'; import 'package:twonly/src/utils/log.dart';
import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/utils/storage.dart';
final lockRetransmission = Mutex();
Future tryTransmitMessages() async { Future tryTransmitMessages() async {
final retransIds = return await lockRetransmission.protect(() async {
await twonlyDB.messageRetransmissionDao.getRetransmitAbleMessages(); final retransIds =
await twonlyDB.messageRetransmissionDao.getRetransmitAbleMessages();
Log.info("Retransmitting ${retransIds.length} text messages"); Log.info("Retransmitting ${retransIds.length} text messages");
if (retransIds.isEmpty) return; if (retransIds.isEmpty) return;
for (final retransId in retransIds) { for (final retransId in retransIds) {
sendRetransmitMessage(retransId, fromRetransmissionDb: true); sendRetransmitMessage(retransId, fromRetransmissionDb: true);
//twonlyDB.messageRetransmissionDao.deleteRetransmissionById(retransId); //twonlyDB.messageRetransmissionDao.deleteRetransmissionById(retransId);
} }
});
} }
Future sendRetransmitMessage(int retransId, Future sendRetransmitMessage(int retransId,
@ -45,6 +50,11 @@ Future sendRetransmitMessage(int retransId,
return; return;
} }
if (retrans.acknowledgeByServerAt != null) {
Log.error("$retransId message already retransmitted");
return;
}
MessageJson json = MessageJson.fromJson( MessageJson json = MessageJson.fromJson(
jsonDecode( jsonDecode(
utf8.decode( utf8.decode(
@ -52,15 +62,16 @@ Future sendRetransmitMessage(int retransId,
), ),
), ),
); );
DateTime timestampToCheck = DateTime.parse("2025-06-24T12:00:00");
DateTime timestampToCheck = DateTime.parse("2025-07-14T00:36:00");
if (json.timestamp.isBefore(timestampToCheck)) { if (json.timestamp.isBefore(timestampToCheck)) {
Log.info("Deleting retransmission because it is before the update..."); Log.info("Ignoring retransmission because it is before the update...");
await twonlyDB.messageRetransmissionDao await twonlyDB.messageRetransmissionDao
.deleteRetransmissionById(retransId); .deleteRetransmissionById(retransId);
return; return;
} }
Log.info("Retransmitting: ${json.kind} to ${retrans.contactId}"); Log.info("Retransmitting $retransId: ${json.kind} to ${retrans.contactId}");
Contact? contact = await twonlyDB.contactsDao Contact? contact = await twonlyDB.contactsDao
.getContactByUserId(retrans.contactId) .getContactByUserId(retrans.contactId)

View file

@ -3,7 +3,6 @@ import 'dart:io';
import 'package:cryptography_plus/cryptography_plus.dart'; import 'package:cryptography_plus/cryptography_plus.dart';
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:fixnum/fixnum.dart'; import 'package:fixnum/fixnum.dart';
import 'package:flutter/foundation.dart';
import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart'; import 'package:libsignal_protocol_dart/libsignal_protocol_dart.dart';
import 'package:mutex/mutex.dart'; import 'package:mutex/mutex.dart';
import 'package:twonly/globals.dart'; import 'package:twonly/globals.dart';

View file

@ -4,7 +4,7 @@ description: "twonly, a privacy-friendly way to connect with friends through sec
# Prevent accidental publishing to pub.dev. # Prevent accidental publishing to pub.dev.
publish_to: 'none' publish_to: 'none'
version: 0.0.54+54 version: 0.0.56+56
environment: environment:
sdk: ^3.6.0 sdk: ^3.6.0