Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AssertionError: INTERNAL ASSERTION FAILED: Encoded field value should not be null. #491

Closed
daviduzan opened this issue Jun 5, 2019 · 3 comments

Comments

@daviduzan
Copy link

commented Jun 5, 2019

  • Android Studio version: 3.4.1
  • Firebase Component: Firestore
  • Component version: 19.0.2

Writing FieldValue.increment(1) together with FieldValue.serverTimestamp() to document while being offline results in a crash the second time:
Caused by: java.lang.AssertionError: INTERNAL ASSERTION FAILED: Encoded field value should not be null.

Steps to reproduce & Relevant Code:

When internet connection is not available:
'''

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    Map<String, Object> map1 = new HashMap<>();

    map1.put("field1", FieldValue.increment(1));
    map1.put("field2", FieldValue.serverTimestamp());
    
    db.collection("temp").document("temp").set(map1, SetOptions.merge());
    db.collection("temp").document("temp").set(map1, SetOptions.merge());

'''

Stack trace:

java.lang.RuntimeException: Internal error in Firestore (19.0.2).
at com.google.firebase.firestore.util.AsyncQueue.lambda$panic$5(com.google.firebase:firebase-firestore@@19.0.2:379)
at com.google.firebase.firestore.util.AsyncQueue$$Lambda$5.run(Unknown Source:2)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6718)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.AssertionError: INTERNAL ASSERTION FAILED: Encoded field value should not be null.
at com.google.firebase.firestore.util.Assert.fail(com.google.firebase:firebase-firestore@@19.0.2:46)
at com.google.firebase.firestore.util.Assert.hardAssert(com.google.firebase:firebase-firestore@@19.0.2:31)
at com.google.firebase.firestore.remote.RemoteSerializer.encodeValue(com.google.firebase:firebase-firestore@@19.0.2:263)
at com.google.firebase.firestore.remote.RemoteSerializer.encodeMapValue(com.google.firebase:firebase-firestore@@19.0.2:360)
at com.google.firebase.firestore.remote.RemoteSerializer.encodeValue(com.google.firebase:firebase-firestore@@19.0.2:276)
at com.google.firebase.firestore.remote.RemoteSerializer.encodeDocument(com.google.firebase:firebase-firestore@@19.0.2:389)
at com.google.firebase.firestore.remote.RemoteSerializer.encodeMutation(com.google.firebase:firebase-firestore@@19.0.2:436)
at com.google.firebase.firestore.local.LocalSerializer.encodeMutationBatch(com.google.firebase:firebase-firestore@@19.0.2:169)
at com.google.firebase.firestore.local.SQLiteMutationQueue.addMutationBatch(com.google.firebase:firebase-firestore@@19.0.2:188)
at com.google.firebase.firestore.local.LocalStore.lambda$writeLocally$1(com.google.firebase:firebase-firestore@@19.0.2:237)
at com.google.firebase.firestore.local.LocalStore$$Lambda$2.get(Unknown Source:8)
at com.google.firebase.firestore.local.SQLitePersistence.runTransaction(com.google.firebase:firebase-firestore@@19.0.2:200)
at com.google.firebase.firestore.local.LocalStore.writeLocally(com.google.firebase:firebase-firestore@@19.0.2:201)
at com.google.firebase.firestore.core.SyncEngine.writeMutations(com.google.firebase:firebase-firestore@@19.0.2:227)
at com.google.firebase.firestore.core.FirestoreClient.lambda$write$11(com.google.firebase:firebase-firestore@@19.0.2:215)
at com.google.firebase.firestore.core.FirestoreClient$$Lambda$11.run(Unknown Source:6)
at com.google.firebase.firestore.util.AsyncQueue.lambda$enqueue$4(com.google.firebase:firebase-firestore@@19.0.2:311)
at com.google.firebase.firestore.util.AsyncQueue$$Lambda$4.call(Unknown Source:2)
at com.google.firebase.firestore.util.AsyncQueue.lambda$enqueue$3(com.google.firebase:firebase-firestore@@19.0.2:287)
at com.google.firebase.firestore.util.AsyncQueue$$Lambda$3.run(Unknown Source:4)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at com.google.firebase.firestore.util.AsyncQueue$DelayedStartFactory.run(com.google.firebase:firebase-firestore@@19.0.2:205)
at java.lang.Thread.run(Thread.java:764)

@mikelehen

This comment has been minimized.

Copy link
Member

commented Jun 5, 2019

@daviduzan Thanks for the detailed report! We'll take a look.

@mikelehen mikelehen self-assigned this Jun 5, 2019

@mikelehen

This comment has been minimized.

Copy link
Member

commented Jun 5, 2019

@schmidt-sebastian Can you take a look?

Here's an integration test you can use to reproduce:

  @Test
  public void testOverwriteServerTimestampAndIncrement() throws ExecutionException, InterruptedException {
    Tasks.await(docRef.getFirestore().disableNetwork());

    docRef.set(map("st", FieldValue.serverTimestamp()));
    docRef.set(map("st", FieldValue.serverTimestamp(), "sum", FieldValue.increment(1)));

    DocumentSnapshot snap = accumulator.awaitLocalEvent();
    assertNotNull(snap.getTimestamp("st", DocumentSnapshot.ServerTimestampBehavior.ESTIMATE));

    snap = accumulator.awaitLocalEvent();
    assertNotNull(snap.getTimestamp("st", DocumentSnapshot.ServerTimestampBehavior.ESTIMATE));
    assertEquals(1, (long)snap.getLong("sum"));

    Tasks.await(docRef.getFirestore().enableNetwork());

    snap = accumulator.awaitRemoteEvent();
    assertNotNull(snap.getTimestamp("st"));
    assertEquals(1, (long)snap.getLong("sum"));
  }

We seem to be trying to serialize an unresolved ServerTimestamp while serializing the baseMutations for the mutation batch that contains the FieldValue.increment and it's failing... I'm not sure if this is expected or not.

@schmidt-sebastian

This comment has been minimized.

Copy link
Member

commented Jun 5, 2019

This is failing because we store an ObjectValue that contains a nested ServerTimestamp in the base PatchMutation:

However, I can't come up with a clean fix right now. I'll ponder more about this.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
4 participants
You can’t perform that action at this time.