Manual sync not executed because of the last sync time

Closes #44552

Signed-off-by: Pedro Igor <pigor.craveiro@gmail.com>
This commit is contained in:
Pedro Igor
2025-11-28 15:45:17 -03:00
committed by GitHub
parent b35dd72392
commit 9abe18e86e
2 changed files with 51 additions and 15 deletions

View File

@@ -38,8 +38,18 @@ final class UserStorageSyncTask implements ScheduledTask {
@Override
public void run(KeycloakSession session) {
RealmModel realm = session.realms().getRealm(realmId);
session.getContext().setRealm(realm);
runWithResult(session);
UserStorageProviderModel provider = getStorageModel(session);
if (isSyncPeriod(provider)) {
runWithResult(session);
return;
}
logger.debugf("Ignored LDAP %s users-sync with storage provider %s due small time since last sync in realm %s", //
syncMode, provider.getName(), realmId);
}
@Override
@@ -49,19 +59,10 @@ final class UserStorageSyncTask implements ScheduledTask {
SynchronizationResult runWithResult(KeycloakSession session) {
try {
UserStorageProviderModel provider = getStorageModel(session);
if (isSyncPeriod(provider)) {
return switch (syncMode) {
case FULL -> runFullSync(session);
case CHANGED -> runIncrementalSync(session);
};
}
logger.debugf("Ignored LDAP %s users-sync with storage provider %s due small time since last sync in realm %s", //
syncMode, provider.getName(), realmId);
return SynchronizationResult.ignored();
return switch (syncMode) {
case FULL -> runFullSync(session);
case CHANGED -> runIncrementalSync(session);
};
} catch (Throwable t) {
logger.errorf(t, "Error occurred during %s users-sync in realm %s and user provider %s", syncMode, realmId, providerId);
}

View File

@@ -132,8 +132,43 @@ public class SyncFederationTest extends AbstractAuthTest {
});
}
@Test
public void testForceManualSync() {
// Enable timer for SyncDummyUserFederationProvider
testingClient.server().run(session -> {
RealmModel appRealm = session.realms().getRealmByName(AuthRealm.TEST);
UserStorageProviderModel model = new UserStorageProviderModel();
private static final UserStorageProviderModel findDummyProviderModel(RealmModel realm) {
model.setProviderId(DummyUserFederationProviderFactory.PROVIDER_NAME);
model.setPriority(1);
model.setName("test-sync-dummy");
model.setFullSyncPeriod(1);
model.setLastSync(0);
appRealm.addComponentModel(model);
});
testingClient.server().run(session -> {
RealmModel appRealm = session.realms().getRealmByName(AuthRealm.TEST);
UserStorageProviderModel dummyModel = findDummyProviderModel(appRealm);
KeycloakSessionFactory sessionFactory = session.getKeycloakSessionFactory();
sleep(dummyModel.getFullSyncPeriod() * 2L);
session.getContext().setRealm(appRealm);
SynchronizationResult result = UserStoragePrivateUtil.runFullSync(sessionFactory, dummyModel);
Assert.assertFalse(result.isIgnored());
});
// remove dummyProvider
testingClient.server().run(session -> {
RealmModel appRealm = session.realms().getRealmByName(AuthRealm.TEST);
session.getContext().setRealm(appRealm);
UserStorageProviderModel dummyModel = findDummyProviderModel(appRealm);
appRealm.removeComponent(dummyModel);
});
}
private static UserStorageProviderModel findDummyProviderModel(RealmModel realm) {
return realm.getComponentsStream()
.filter(component -> Objects.equals(component.getName(), "test-sync-dummy"))
.map(UserStorageProviderModel::new)