micronaut-data: JdbcRespository methods Deadlock - Circular dependencies with Hazelcast getMap() in a repository setup.

MN 1.3.3 MN Data 1.0.1 Kotlin 1.3.50

Consider:

@JdbcRepository(dialect = Dialect.H2)
interface MapStoreRepository : CrudRepository<MapObjectEntity, UUID> {

    fun listKey(): List<UUID>
    fun deleteByKeyIn(key: List<UUID>)

}
@Singleton
class H2MapStore(
        private val persistenceRepository: MapStoreRepository
) : MapStore<UUID, HazelcastCrudableObject<UUID>> {

    init {
        println(persistenceRepository.count())
    }

...
    override fun loadAllKeys(): MutableIterable<UUID> {

        println(persistenceRepository.count())

        val keys =  persistenceRepository.listKey().toMutableList()

    }
...
}

If .count() is called in init{}then everything works when loadAllKeys() is called. If the init{} is not there, then when loadAllKeys() is called, it hangs on println(persistenceRepository.count()), where .count() never sees to returned / blocked thread?

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 17 (5 by maintainers)

Most upvoted comments

Might help using lazy (https://kotlinlang.org/docs/reference/delegated-properties.html) on

val mapService = jetService.jet.getMap<K, O>(mapName)

This appears to be being called in the constructor which is initializing parts of hazelcast that then have a circular dependency because it comes back into your H2MapStore:

	at formsmanager.respository.H2MapStore.loadAllKeys(MapPersistence.kt:83)
	at com.hazelcast.map.impl.MapStoreWrapper.loadAllKeys(MapStoreWrapper.java:156)
	at com.hazelcast.map.impl.mapstore.BasicMapStoreContext.loadAllKeys(BasicMapStoreContext.java:169)
	at com.hazelcast.map.impl.MapKeyLoader.sendKeysInBatches(MapKeyLoader.java:416)