Skip to content

Friend location updates stop processing after some time #2183

@tobru

Description

@tobru

After the app has been running for an some time, incoming location messages from friends are received via MQTT but never processed to update their locations on the map and in the friend list. The issue resolves after restarting the app.

Expected Behavior

When location messages arrive from other friends via MQTT, their positions should be updated in the contacts repository and reflected on the map.

Actual Behavior

  • MQTT messages from friends are received (visible in logs as Received incoming message: MessageLocation on owntracks/...)
  • But the coroutine that processes these messages never executes
  • No Contact X moved to... log entries appear
  • No MemoryContactsRepo updates occur
  • Friends' locations become stale on the map

Steps to Reproduce

  1. Run the app for an extended period (hours/days)
  2. Observe that friends' locations stop updating
  3. Check logs - incoming MQTT messages appear but no processing logs follow
  4. Restart the app - friends' locations immediately update

Root Cause Analysis

The issue might be in MessageProcessor.kt at lines 471-487. The processIncomingMessage(MessageLocation) method calls scope.launch { ... } to process incoming location messages, but after extended runtime, these coroutines fail to execute.

Key observation from logs:

Working (after fresh start):

[MQTT Call: p10p] MessageProcessor: Received incoming message: MessageLocation on owntracks/friend/gn
[DefaultDispatcher-worker-5] MessageProcessor$processIncomingMessage: Contact owntracks/friend/gn moved to 47.08...
[DefaultDispatcher-worker-5] MemoryContactsRepo: update location for contact owntracks/friend/gn took 270.859us

Broken (after extended runtime):

[MQTT Call: p10p] MessageProcessor: Received incoming message: MessageLocation on owntracks/gisela/gn
// No subsequent processing logs - the scope.launch block never executes

Notably, the outgoing message loop continues to work (messages are sent successfully), but new incoming message coroutines don't launch.

Potential Fix

The ApplicationScope CoroutineScope in ScopeModule.kt is missing the @Singleton annotation:

// Current code (line 21-25):
@ApplicationScope
@Provides
fun providesCoroutineScope(
    @CoroutineScopes.DefaultDispatcher defaultDispatcher: CoroutineDispatcher
): CoroutineScope = CoroutineScope(SupervisorJob() + defaultDispatcher)

Should be:

@Singleton  // Add this annotation
@ApplicationScope
@Provides
fun providesCoroutineScope(
    @CoroutineScopes.DefaultDispatcher defaultDispatcher: CoroutineDispatcher
): CoroutineScope = CoroutineScope(SupervisorJob() + defaultDispatcher)

Without @Singleton, there's no guarantee of a single consistent scope instance. While MessageProcessor is a singleton and receives one scope at injection time, the scope may enter an unhealthy state over time where it cannot launch new coroutines.

Environment

  • App version: 2.5.5
  • Android version: 16 (BP4A.260105.004.A2)
  • Device: Pixel 10 Pro
  • Connection mode: MQTT

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions