realm / realm-js

Realm is a mobile database: an alternative to SQLite & key-value stores
https://realm.io
Apache License 2.0
5.6k stars 558 forks source link

React Native Android application crashing when using syncSession.addConnectionNotification #6579

Open gfrancischini opened 1 month ago

gfrancischini commented 1 month ago

How frequently does the bug occur?

Always

Description

The react native application is crashing when there is an active syncSession.addConnectionNotification and the app gets reloaded

Stacktrace & log output

Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x30 in tid 8357 (mqt_js), pid 8292 (om.synctutorial)
2024-03-26 17:24:24.007  8292-8292  unknown:Re...nceManager com.synctutorial                     E  destroyRootView called
2024-03-26 17:24:24.009  8292-8292  unknown:Re...nceManager com.synctutorial                     E  destroyRootView called, unmountReactApplication

Cmdline: com.synctutorial
2024-03-26 17:24:25.208  8538-8538  DEBUG                   crash_dump64                         A  pid: 8292, tid: 8357, name: mqt_js  >>> com.synctutorial <<<
2024-03-26 17:24:25.208  8538-8538  DEBUG                   crash_dump64                         A        #00 pc 00000000003bfd00  /data/app/~~kwxPndNsCq5S-a142smnIA==/com.synctutorial-Jxnmi56nwT1pLTopnsEDBg==/lib/arm64/librealm.so (BuildId: edf6f0d435afef43e7dfceba74cfdd58b0289992)
2024-03-26 17:24:25.208  8538-8538  DEBUG                   crash_dump64                         A        #01 pc 00000000003c061c  /data/app/~~kwxPndNsCq5S-a142smnIA==/com.synctutorial-Jxnmi56nwT1pLTopnsEDBg==/lib/arm64/librealm.so (BuildId: edf6f0d435afef43e7dfceba74cfdd58b0289992)
2024-03-26 17:24:25.208  8538-8538  DEBUG                   crash_dump64                         A        #02 pc 000000000041c924  /data/app/~~kwxPndNsCq5S-a142smnIA==/com.synctutorial-Jxnmi56nwT1pLTopnsEDBg==/lib/arm64/librealm.so (BuildId: edf6f0d435afef43e7dfceba74cfdd58b0289992)
2024-03-26 17:24:25.208  8538-8538  DEBUG                   crash_dump64                         A        #03 pc 000000000041d634  /data/app/~~kwxPndNsCq5S-a142smnIA==/com.synctutorial-Jxnmi56nwT1pLTopnsEDBg==/lib/arm64/librealm.so (BuildId: edf6f0d435afef43e7dfceba74cfdd58b0289992)

Can you reproduce the bug?

Yes, always

Reproduction Steps

Using this branch: https://github.com/Spring-Global/realm-react-native-sample/tree/realm-crash-callback

  1. Run the application on android emulator
  2. Refresh the react native app with cmd+r

Version

realm@12.6.2

What services are you using?

Atlas Device Sync

Are you using encryption?

No

Platform OS and version(s)

Android - Emulator API 34

Build environment

Which debugger for React Native: ..

Cocoapods version

No response

sync-by-unito[bot] commented 1 month ago

➤ PM Bot commented:

Jira ticket: RJS-2784

kneth commented 2 weeks ago

@gfrancischini Thank you for reporting.

The issue is similar to https://github.com/realm/realm-js/issues/6558, and we are investigating.

kneth commented 2 weeks ago

@gfrancischini I have a PR up which I think will fix the issue: #6612

gfrancischini commented 2 weeks ago

Hi Kneth, thanks for the update. It seems that the change is only on JS side right?

// Clear the internal state to prevent crashes when reloading on React Native
binding.RealmCoordinator.clearAllCaches();
binding.App.clearCachedApps();

I will give a try

vatsal-gadhiya-searce commented 5 days ago

@kneth We have tried hot reload this time and the app is still crashing for us with latest version of realm 12.7.1.

Note: It does not crashes normally though for the first time.

kneth commented 3 days ago

@vatsal-gadhiya-searce Sorry to hear. I'll reopen the issue and we need to investigate further. If you can share a stack trace, we will appreciate it.

Premshankar-Searce commented 19 hours ago

@kneth here repo realmDemo reproducible

https://github.com/realm/realm-js/assets/159114096/d0aed733-b221-4649-ae65-075f08b3a594

kraenhansen commented 17 hours ago

It seems to me we need to add a cleanup of connection state listeners, the same way we clean up other listeners passed to core, as part of the cleanup we do here: https://github.com/realm/realm-js/blob/56112c7351b9d4a5abdb6904bfd2ac14e61266cb/packages/realm/src/platform/react-native/index.ts#L28-L30

More specifically, we should expose a method on the SyncSession in Core (similiar to unregister_connection_change_callback) to remove all listeners from the underlying vector holding references to connection listener callbacks.