amplify-android
amplify-android copied to clipboard
Multiauth DataStore sync fails if unauthorized models exist
Before opening, please confirm:
- [X] I have searched for duplicate or closed issues and discussions.
Language and Async Model
Java
Amplify Categories
DataStore
Gradle script dependencies
com.amplifyframework:core:2.14.11
com.amplifyframework:aws-api:2.14.11
com.amplifyframework:aws-auth-cognito:2.14.11
com.amplifyframework:aws-datastore:2.14.11
com.amplifyframework:aws-storage-s3:2.14.11
Environment information
------------------------------------------------------------
Gradle 8.2
------------------------------------------------------------
Build time: 2023-06-30 18:02:30 UTC
Revision: 5f4a070a62a31a17438ac998c2b849f4f6892877
Kotlin: 1.8.20
Groovy: 3.0.17
Ant: Apache Ant(TM) version 1.10.13 compiled on January 4 2023
JVM: 17.0.1 (Oracle Corporation 17.0.1+12-LTS-39)
OS: Mac OS X 13.5.2 aarch64
Please include any relevant guides or documentation you're referencing
No response
Describe the bug
It looks like the sync stops when there is an unauthorized model. However, in the app we use models that are only for guests and models that are for logged in users. We already use the following setup for iOS, it works without any problems here.
Our models are structured as follows:
type User
@model
@auth (rules: [ { allow: owner } ]) {
identityId: ID! @primaryKey
email: String!
}
type Guest
@model
@auth (rules: [ { allow: public, provider: iam } ]) {
identityId: ID! @primaryKey
}
Registered users use the Cognito user pool. Unauthenticated guests should be handled through the IAM provider. IAM is defined as the default authorization type and additional Cognito user pool. Conflict detection and auto merge is enabled.
The DatastorePlugin is configured like this:
DataStoreConfiguration dataStoreConfiguration = DataStoreConfiguration.builder()
.syncExpression(Guest.class, () -> Guest.IDENTITY_ID.eq(this.identityId))
.syncExpression(GuestTask.class, () -> GuestTask.IDENTITY_ID.eq(this.identityId))
.syncExpression(GuestProject.class, () -> GuestProject.IDENTITY_ID.eq(this.identityId))
.build();
AWSS3StoragePluginConfiguration.Builder builder = new AWSS3StoragePluginConfiguration.Builder();
builder.setAwsS3PluginPrefixResolver(new CustomPrefixResolver());
Amplify.addPlugin(new AWSCognitoAuthPlugin());
Amplify.addPlugin(new AWSApiPlugin());
AWSDataStorePlugin datastorePlugin = AWSDataStorePlugin.builder()
.dataStoreConfiguration(dataStoreConfiguration)
.authModeStrategy(AuthModeStrategyType.MULTIAUTH)
.build();
Amplify.addPlugin(datastorePlugin);
Amplify.addPlugin(new AWSS3StoragePlugin(builder.build()));
Amplify.configure(pAppContext);
Reproduction steps (if applicable)
No response
Code Snippet
// Put your code below this line.
Log output
2024-03-06 11:11:14.137 10501-16405 amplify:aws-datastore I DataStore plugin initialized.
2024-03-06 11:11:14.139 10501-16405 amplify:aws-datastore I Orchestrator transitioning from LOCAL_ONLY to SYNC_VIA_API
2024-03-06 11:11:14.139 10501-16405 amplify:aws-datastore I Setting currentState to SYNC_VIA_API
2024-03-06 11:11:14.140 10501-16409 amplify:aws-datastore I Starting API synchronization mode.
2024-03-06 11:11:14.140 10501-16405 amplify:aws-datastore I Orchestrator lock released.
2024-03-06 11:11:14.162 10501-16409 amplify:aws-datastore I Starting processing subscription events.
2024-03-06 11:11:14.181 10501-16453 BeTidy -> observe query D observationStarted
2024-03-06 11:11:14.267 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_DELETE GuestProject
2024-03-06 11:11:14.271 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_CREATE Guest
2024-03-06 11:11:14.274 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_UPDATE GuestTask
2024-03-06 11:11:14.284 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_UPDATE Guest
2024-03-06 11:11:14.287 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_DELETE GuestTask
2024-03-06 11:11:14.298 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_CREATE GuestProject
2024-03-06 11:11:14.315 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_UPDATE GuestProject
2024-03-06 11:11:14.344 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_CREATE GuestTask
2024-03-06 11:11:14.350 10501-16435 amplify:aws-datastore W Unauthorized failure:ON_DELETE Guest
2024-03-06 11:11:14.384 10501-16409 amplify:aws-datastore I Started subscription processor for models: [GuestProject, User, UserProject, Guest, UserTask, GuestTask, TaskHistory] of types [ON_CREATE, ON_UPDATE, ON_DELETE].
2024-03-06 11:11:14.547 10501-16468 amplify:aws-datastore I Successfully sync'd down model state from cloud.
2024-03-06 11:11:14.799 10501-16406 amplify:aws-datastore W Initial cloud sync failed for GuestTask.
IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}
at com.amplifyframework.datastore.syncengine.SyncProcessor.lambda$syncPage$16(SyncProcessor.java:323)
at com.amplifyframework.datastore.syncengine.SyncProcessor$$ExternalSyntheticLambda18.accept(Unknown Source:4)
at com.amplifyframework.datastore.appsync.AppSyncClient$$ExternalSyntheticLambda1.accept(Unknown Source:4)
at com.amplifyframework.api.aws.MultiAuthAppSyncGraphQLOperation$OkHttpCallback.onResponse(MultiAuthAppSyncGraphQLOperation.java:182)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:539)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
2024-03-06 11:11:14.800 10501-16406 amplify:aws-datastore E Error encountered in the DataStore.
DataStoreException{message=Initial cloud sync failed for GuestTask., cause=IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}, recoverySuggestion=Check your internet connection.}
at com.amplifyframework.datastore.syncengine.SyncProcessor.lambda$createHydrationTask$9$com-amplifyframework-datastore-syncengine-SyncProcessor(SyncProcessor.java:190)
at com.amplifyframework.datastore.syncengine.SyncProcessor$$ExternalSyntheticLambda6.accept(Unknown Source:6)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek$CompletableObserverImplementation.onError(CompletablePeek.java:88)
at io.reactivex.rxjava3.internal.operators.single.SingleFlatMapCompletable$FlatMapCompletableObserver.onError(SingleFlatMapCompletable.java:97)
at io.reactivex.rxjava3.internal.operators.single.SingleFlatMap$SingleFlatMapCallback$FlatMapSingleObserver.onError(SingleFlatMap.java:117)
at io.reactivex.rxjava3.internal.operators.completable.CompletableToSingle$ToSingle.onError(CompletableToSingle.java:73)
at io.reactivex.rxjava3.internal.util.AtomicThrowable.tryTerminateConsumer(AtomicThrowable.java:156)
at io.reactivex.rxjava3.internal.operators.mixed.FlowableConcatMapCompletable$ConcatMapCompletableObserver.onError(FlowableConcatMapCompletable.java:129)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableDematerialize$DematerializeSubscriber.onError(FlowableDematerialize.java:104)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableDematerialize$DematerializeSubscriber.onNext(FlowableDematerialize.java:87)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableFilter$FilterSubscriber.tryOnNext(FlowableFilter.java:74)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableFilter$FilterSubscriber.onNext(FlowableFilter.java:52)
at io.reactivex.rxjava3.internal.subscribers.SinglePostCompleteSubscriber.complete(SinglePostCompleteSubscriber.java:81)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableMaterialize$MaterializeSubscriber.onError(FlowableMaterialize.java:49)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.checkTerminated(FlowableObserveOn.java:209)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableObserveOn$ObserveOnSubscriber.runAsync(FlowableObserveOn.java:394)
at io.reactivex.rxjava3.internal.operators.flowable.FlowableObserveOn$BaseObserveOnSubscriber.run(FlowableObserveOn.java:176)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
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 java.lang.Thread.run(Thread.java:923)
Caused by: IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}
at com.amplifyframework.datastore.syncengine.SyncProcessor.lambda$syncPage$16(SyncProcessor.java:323)
at com.amplifyframework.datastore.syncengine.SyncProcessor$$ExternalSyntheticLambda18.accept(Unknown Source:4)
at com.amplifyframework.datastore.appsync.AppSyncClient$$ExternalSyntheticLambda1.accept(Unknown Source:4)
at com.amplifyframework.api.aws.MultiAuthAppSyncGraphQLOperation$OkHttpCallback.onResponse(MultiAuthAppSyncGraphQLOperation.java:182)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:539)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
2024-03-06 11:11:14.802 10501-16409 amplify:aws-datastore E Failure encountered while attempting to start API sync.
DataStoreException{message=Initial sync during DataStore initialization failed., cause=java.lang.RuntimeException: IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}, recoverySuggestion=There is a possibility that there is a bug if this error persists. Please take a look at
https://github.com/aws-amplify/amplify-android/issues to see if there are any existing issues that
match your scenario, and file an issue with the details of the bug if there isn't.}
at com.amplifyframework.datastore.syncengine.Orchestrator.lambda$startApiSync$4$com-amplifyframework-datastore-syncengine-Orchestrator(Orchestrator.java:362)
at com.amplifyframework.datastore.syncengine.Orchestrator$$ExternalSyntheticLambda8.subscribe(Unknown Source:2)
at io.reactivex.rxjava3.internal.operators.completable.CompletableCreate.subscribeActual(CompletableCreate.java:40)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletableSubscribeOn$SubscribeOnObserver.run(CompletableSubscribeOn.java:64)
at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:614)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
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 java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.RuntimeException: IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}
at io.reactivex.rxjava3.internal.util.ExceptionHelper.wrapOrThrow(ExceptionHelper.java:46)
at io.reactivex.rxjava3.internal.observers.BlockingMultiObserver.blockingGet(BlockingMultiObserver.java:94)
at io.reactivex.rxjava3.core.Completable.blockingAwait(Completable.java:1461)
at com.amplifyframework.datastore.syncengine.Orchestrator.lambda$startApiSync$4$com-amplifyframework-datastore-syncengine-Orchestrator(Orchestrator.java:358)
at com.amplifyframework.datastore.syncengine.Orchestrator$$ExternalSyntheticLambda8.subscribe(Unknown Source:2)
at io.reactivex.rxjava3.internal.operators.completable.CompletableCreate.subscribeActual(CompletableCreate.java:40)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletableSubscribeOn$SubscribeOnObserver.run(CompletableSubscribeOn.java:64)
at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:614)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
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 java.lang.Thread.run(Thread.java:923)
Caused by: IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}
at com.amplifyframework.datastore.syncengine.SyncProcessor.lambda$syncPage$16(SyncProcessor.java:323)
at com.amplifyframework.datastore.syncengine.SyncProcessor$$ExternalSyntheticLambda18.accept(Unknown Source:4)
at com.amplifyframework.datastore.appsync.AppSyncClient$$ExternalSyntheticLambda1.accept(Unknown Source:4)
at com.amplifyframework.api.aws.MultiAuthAppSyncGraphQLOperation$OkHttpCallback.onResponse(MultiAuthAppSyncGraphQLOperation.java:182)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:539)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
2024-03-06 11:11:14.803 10501-16409 amplify:aws-datastore W API sync failed - transitioning to LOCAL_ONLY.
DataStoreException{message=Initial sync during DataStore initialization failed., cause=java.lang.RuntimeException: IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}, recoverySuggestion=There is a possibility that there is a bug if this error persists. Please take a look at
https://github.com/aws-amplify/amplify-android/issues to see if there are any existing issues that
match your scenario, and file an issue with the details of the bug if there isn't.}
at com.amplifyframework.datastore.syncengine.Orchestrator.lambda$startApiSync$4$com-amplifyframework-datastore-syncengine-Orchestrator(Orchestrator.java:362)
at com.amplifyframework.datastore.syncengine.Orchestrator$$ExternalSyntheticLambda8.subscribe(Unknown Source:2)
at io.reactivex.rxjava3.internal.operators.completable.CompletableCreate.subscribeActual(CompletableCreate.java:40)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletableSubscribeOn$SubscribeOnObserver.run(CompletableSubscribeOn.java:64)
at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:614)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
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 java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.RuntimeException: IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}
at io.reactivex.rxjava3.internal.util.ExceptionHelper.wrapOrThrow(ExceptionHelper.java:46)
at io.reactivex.rxjava3.internal.observers.BlockingMultiObserver.blockingGet(BlockingMultiObserver.java:94)
at io.reactivex.rxjava3.core.Completable.blockingAwait(Completable.java:1461)
at com.amplifyframework.datastore.syncengine.Orchestrator.lambda$startApiSync$4$com-amplifyframework-datastore-syncengine-Orchestrator(Orchestrator.java:358)
at com.amplifyframework.datastore.syncengine.Orchestrator$$ExternalSyntheticLambda8.subscribe(Unknown Source:2)
at io.reactivex.rxjava3.internal.operators.completable.CompletableCreate.subscribeActual(CompletableCreate.java:40)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletablePeek.subscribeActual(CompletablePeek.java:51)
at io.reactivex.rxjava3.core.Completable.subscribe(Completable.java:2850)
at io.reactivex.rxjava3.internal.operators.completable.CompletableSubscribeOn$SubscribeOnObserver.run(CompletableSubscribeOn.java:64)
at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:614)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
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 java.lang.Thread.run(Thread.java:923)
Caused by: IrRecoverableException{message=Empty response from AppSync., cause=null, recoverySuggestion=Report to AWS team.}
at com.amplifyframework.datastore.syncengine.SyncProcessor.lambda$syncPage$16(SyncProcessor.java:323)
at com.amplifyframework.datastore.syncengine.SyncProcessor$$ExternalSyntheticLambda18.accept(Unknown Source:4)
at com.amplifyframework.datastore.appsync.AppSyncClient$$ExternalSyntheticLambda1.accept(Unknown Source:4)
at com.amplifyframework.api.aws.MultiAuthAppSyncGraphQLOperation$OkHttpCallback.onResponse(MultiAuthAppSyncGraphQLOperation.java:182)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:539)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
2024-03-06 11:11:14.803 10501-16409 amplify:aws-datastore I Orchestrator transitioning from SYNC_VIA_API to LOCAL_ONLY
2024-03-06 11:11:14.804 10501-16409 amplify:aws-datastore I Stopping subscription processor.
2024-03-06 11:11:14.806 10501-16409 amplify:aws-datastore I Stopped subscription processor.
2024-03-06 11:11:14.807 10501-16409 amplify:aws-datastore I Setting currentState to LOCAL_ONLY
amplifyconfiguration.json
{
"UserAgent": "aws-amplify-cli/2.0",
"Version": "1.0",
"api": {
"plugins": {
"awsAPIPlugin": {
"xxxx": {
"endpointType": "GraphQL",
"endpoint": "https://xxxx.appsync-api.eu-central-1.amazonaws.com/graphql",
"region": "eu-central-1",
"authorizationType": "AWS_IAM"
}
}
}
},
"auth": {
"plugins": {
"awsCognitoAuthPlugin": {
"UserAgent": "aws-amplify/cli",
"Version": "0.1.0",
"IdentityManager": {
"Default": {}
},
"CredentialsProvider": {
"CognitoIdentity": {
"Default": {
"PoolId": "eu-central-1:xxxx",
"Region": "eu-central-1"
}
}
},
"CognitoUserPool": {
"Default": {
"PoolId": "eu-central-1_xxxx",
"AppClientId": "xxxx",
"Region": "eu-central-1"
}
},
"Auth": {
"Default": {
"authenticationFlowType": "USER_SRP_AUTH",
"socialProviders": [],
"usernameAttributes": [
"EMAIL"
],
"signupAttributes": [
"EMAIL"
],
"passwordProtectionSettings": {
"passwordPolicyMinLength": 8,
"passwordPolicyCharacters": []
},
"mfaConfiguration": "OFF",
"mfaTypes": [
"SMS"
],
"verificationMechanisms": [
"EMAIL"
]
}
},
"AppSync": {
"Default": {
"ApiUrl": "https://xxxx.appsync-api.eu-central-1.amazonaws.com/graphql",
"Region": "eu-central-1",
"AuthMode": "AWS_IAM",
"ClientDatabasePrefix": "xxxx_AWS_IAM"
},
"xxxx_AMAZON_COGNITO_USER_POOLS": {
"ApiUrl": "https://xxxx.appsync-api.eu-central-1.amazonaws.com/graphql",
"Region": "eu-central-1",
"AuthMode": "AMAZON_COGNITO_USER_POOLS",
"ClientDatabasePrefix": "xxxx_AMAZON_COGNITO_USER_POOLS"
}
}
}
}
}
}
GraphQL Schema
// Put your schema below this line
Additional information and screenshots
No response
@tobias-feldmann Thank you for the report. I'll take a look and attempt to replicate your setup. Can you confirm what versions of Amplify you have tried this on? Is this a new implementation, or are you running into a regression after upgrading.
Hi @tylerjroach , thank you for your time. I started with 2.14.5 and now the current 2.14.11 version.
Its a new implementation on Android. We started with iOS, where this setup is already running productively. In the Android project I just pulled the existing Amplify setup.
Hi @tobias-feldmann ,
Thank you for providing the information.
We are continuing to look into this problem and will provide an update once we have a solution.
Hi @yuhengshs , Perfect, that sounds great. If you have a solution, we can test it directly.
Hi @tobias-feldmann ,
We've submitted a ticket to address the root issue causing the sync problem on our end. Meanwhile, we've identified a workaround and determined the reason why the synchronization was failing.
The failure you're experiencing during synchronization is because, as a signed-in user
, you're not authorized to access public information from Guest
. In this context, Guest
information is intended for public access only.
The workaround solution is to change your schema as follows:
type User
@model
@auth (rules: [ { allow: owner } ]) {
identityId: ID! @primaryKey
email: String!
}
type Guest
@model
@auth (rules: [ { allow: public, provider: iam },
{allow: private, operations: [read], provider: iam} ]) {
identityId: ID! @primaryKey
}
This adjustment will enable Signed In Users
to sync Guest's information while we sort out a permanent fix. Please let us know if you are comfortable using the provided schema and if it resolves the issue.
Hi @yuhengshs, Thank you for your workaround. But one reason why we chose to split in user and guest models was so that the signed in users don't have to sync all the guest data. This is now a large amount of data that users don't need to access. That's why I think it's better for us to wait for the permanent fix. Can you say roughly when we can expect this?
Is it possible to deactivate the synchronization of individual models for Android? For us it would be sufficient if only the user models are synchronized and the guest models only exist in the local on-device storage.
@tobias-feldmann
Tracking fix for issue here to allow behavior to match Swift: https://github.com/aws-amplify/amplify-android/issues/2760
"Is it possible to deactivate the synchronization of individual models for Android?"
Yes, it is. The model can be removed from the ModelProvider (Default in your project is AmplifyModelProvider).
However, I'm not sure how you would get the guest models to exist local only within DataStore. If you are referring to pulling and storing the guest models yourself, you could achieve this.
We are tracking a fix though to fix the root of the issue you are running into.
Thanks for your answer @tylerjroach Great, then we will wait for the fix.
Hi @tobias-feldmann ,
Amplify Android version 2.16.1 has been released with the fix for this issue.
Closing this issue, please feel free to open a new one if needed.
This issue is now closed. Comments on closed issues are hard for our team to see. If you need more assistance, please open a new issue that references this one.