realm / realm-java

Realm is a mobile database: a replacement for SQLite & ORMs
http://realm.io
Apache License 2.0
11.47k stars 1.75k forks source link

Realm not opening when offline #7883

Open hkchakladar opened 7 months ago

hkchakladar commented 7 months ago

How frequently does the bug occur?

Always

Description

Expectation : Realm.getInstance() to load faster whether online/offline like any other offline library and continue read/write ops. And Realm check network connection, sync in background.

What actually happened : Realm not behaving like offline-first. Works like online-only. Realm is not opening in Offline mode and taking very long in online.

When online, Realm.getInstanceAsync takes long time to load, based on network speed. On fast network it takes ~1000ms and on slow network it takes almost 10-20 seconds.

This freeze the UI and makes it unsable.

Stacktrace & log output

2023-11-21 19:58:57.841 26613-26796 REALM_SYNC              com.in                   E  Failed to resolve 'ws.asia-south1.gcp.realm.mongodb.com:443': Host not found (authoritative)
2023-11-21 19:58:57.845 26613-26796 REALM_JAVA              com.in                   W  Unknown error code: 'unknown:1999'
2023-11-21 19:58:57.845 26613-26796 REALM_JAVA              com.in                   W  Unknown error code: 'unknown:1999'
2023-11-21 19:58:57.846 26613-26796 REALM_JAVA              com.in                   E  Session Error[wss://realm.mongodb.com/]: UNKNOWN(unknown:1999): WebSocket: Resolve Failed
2023-11-21 19:58:58.634 26613-26796 REALM_SYNC              com.in                   E  Failed to resolve 'ws.asia-south1.gcp.realm.mongodb.com:443': Host not found (authoritative)
2023-11-21 19:58:58.634 26613-26796 REALM_JAVA              com.in                   W  Unknown error code: 'unknown:1999'
2023-11-21 19:58:58.635 26613-26796 REALM_JAVA              com.in                   W  Unknown error code: 'unknown:1999'
2023-11-21 19:58:58.635 26613-26796 REALM_JAVA              com.in                   E  Session Error[wss://realm.mongodb.com/]: UNKNOWN(unknown:1999): WebSocket: Resolve Failed
2023-11-21 19:59:00.191 26613-26796 REALM_SYNC              com.in                   E  Failed to resolve 'ws.asia-south1.gcp.realm.mongodb.com:443': Host not found (authoritative)
2023-11-21 19:59:00.193 26613-26796 REALM_JAVA              com.in                   W  Unknown error code: 'unknown:1999'
2023-11-21 19:59:00.194 26613-26796 REALM_JAVA              com.in                   W  Unknown error code: 'unknown:1999'
2023-11-21 19:59:00.194 26613-26796 REALM_JAVA              com.in                   E  Session Error[wss://realm.mongodb.com/]: UNKNOWN(unknown:1999): WebSocket: Resolve Failed

Can you reproduce the bug?

Always

Reproduction Steps

Here is my code:

long startTime = System.currentTimeMillis();

app = new App(new AppConfiguration.Builder("app-id").build());

if (app.currentUser() != null) {

    Log.e(TAG, "onCreate: Realm user already logged in uid -> " + app.currentUser().getIdentities());

    SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser())
            .initialSubscriptions(new SyncConfiguration.InitialFlexibleSyncSubscriptions() {
                @Override
                public void configure(Realm realm, MutableSubscriptionSet subscriptions) {
                    subscriptions.addOrUpdate(Subscription.create(
                            realm.where(RealmCustomerModel.class).equalTo("uid", app.currentUser().getId()))
                    );

                    subscriptions.addOrUpdate(Subscription.create(
                            realm.where(RealmTxnModel.class).equalTo("uid", app.currentUser().getId()))
                    );
                }
            }).build();

    Log.e(TAG, "Realm getInstance/Async started");

    Realm.getInstanceAsync(config, new Realm.Callback() {
        @Override
        public void onSuccess(Realm realm) {
            uiThreadRealm = realm;
            Log.e(TAG, "onSuccess: Realm getInstanceAsync success in " + (System.currentTimeMillis() - startTime) + "ms");
            populateUi();
            Realm.setDefaultConfiguration(config);
        }
    });
}

Is the configuration correct or am I doing something wrong?

Version

10.15.1

What Atlas App Services are you using?

Both Atlas Device Sync and Atlas App Services

Are you using encryption?

No

Platform OS and version(s)

Android 12

Build environment

Android Studio version: Android Studio Giraffe | 2022.3.1 Patch 2 Android Build Tools version: ... Gradle version: 8.1.2

sync-by-unito[bot] commented 7 months ago

➤ PM Bot commented:

Jira ticket: RJAVA-1256

kneth commented 7 months ago

A bug in Realm Core v13.26.0 preventing open a Realm when offline has been fixed in v14.4.0. The fix hasn't yet been release for Realm Java. Said that, I don't believe that you are affected by this bug but it might have been introduced earlier than Realm Core v13.26.0.

About the slow downloads: if you have many backlinks, poor performance can be observed. There is an enhancement for it in Realm Java v10.18.0

hkchakladar commented 7 months ago

So what's the solution of Offline issue?

nirinchev commented 7 months ago

Can you share trace-level logs from a run where you're seeing slow open speeds?

hkchakladar commented 7 months ago

Let's forget the slow download for now.

How to solve the not opening in offline?

hkchakladar commented 6 months ago

update?

rorbech commented 6 months ago

Hi @hkchakladar. I didn't find anything that should block opening the realm in your snippets. One alternative could be to try to created a named subscription instead of the initialSubscriptions with

SyncConfiguration config = new SyncConfiguration.Builder(app.currentUser())
    .build();

    Log.e(TAG, "Realm getInstance/Async started");

    Realm.getInstanceAsync(config, new Realm.Callback() {
        @Override
        public void onSuccess(Realm realm) {
            uiThreadRealm = realm;
            uiThreadRealm.subscriptions.update {
                    addOrUpdate("subscription1", Subscription.create(
                            realm.where(RealmCustomerModel.class).equalTo("uid", app.currentUser().getId()))
                    );
                    addOrUpdate("subscription2", Subscription.create(
                            realm.where(RealmTxnModel.class).equalTo("uid", app.currentUser().getId()))
                    );
           }
           Log.e(TAG, "onSuccess: Realm getInstanceAsync success in " + (System.currentTimeMillis() - startTime) + "ms");
           populateUi();
           Realm.setDefaultConfiguration(config);
        }
    });

It would probably require some additional insights to know exactly where it is stalling, so if you could supply the trace level logs we might be able to get an idea about the root cause.