@@ -40,6 +40,7 @@ import reactor.netty.DisposableServer
4040import reactor.netty.http.server.HttpServer
4141import reactor.netty.http.server.HttpServerRequest
4242import reactor.netty.http.server.HttpServerResponse
43+ import reactor.netty.resources.LoopResources
4344import java.net.InetSocketAddress
4445import java.net.URI
4546import java.util.function.BiFunction
@@ -158,8 +159,6 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
158159 lateinit var imageMapping: OciImageMappingImpl
159160 private var isStarted = false
160161 private val httpServers = mutableListOf<DisposableServer >()
161- private val loopResources = OciLoopResources .acquire()
162- private val imageMetadataRegistry = OciImageMetadataRegistry (OciRegistryApi (OciRegistryHttpClient .acquire()))
163162
164163 fun init (
165164 registries : NamedDomainObjectList <OciRegistry >,
@@ -177,27 +176,38 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
177176 }
178177 isStarted = true
179178 if (registries.isNotEmpty()) {
180- startRedirectServer(repositoryPort.get())
179+ val loopResources = OciLoopResources .acquire()
180+ startRedirectServer(repositoryPort.get(), loopResources)
181+ val imageMetadataRegistry = OciImageMetadataRegistry (OciRegistryApi (OciRegistryHttpClient .acquire()))
181182 val imageMappingData = imageMapping.getData()
182183 for (registry in registries) {
183- startRegistryServer(registry, imageMappingData)
184+ startRegistryServer(registry, loopResources, imageMetadataRegistry, imageMappingData)
184185 }
185186 }
186187 }
187188
188- private fun startRedirectServer (port : Int ) {
189+ private fun startRedirectServer (port : Int , loopResources : LoopResources ) {
189190 try {
190- startHttpServer(port) { request, response ->
191+ startHttpServer(port, loopResources ) { request, response ->
191192 val redirectPort = request.requestHeaders()[PORT_HTTP_HEADER_NAME ]
192193 response.sendRedirect(" http://localhost:" + redirectPort + request.uri())
193194 }
194195 } catch (_: ChannelBindException ) {
195196 }
196197 }
197198
198- private fun startRegistryServer (registry : OciRegistry , imageMappingData : OciImageMappingData ) {
199+ private fun startRegistryServer (
200+ registry : OciRegistry ,
201+ loopResources : LoopResources ,
202+ imageMetadataRegistry : OciImageMetadataRegistry ,
203+ imageMappingData : OciImageMappingData ,
204+ ) {
199205 val credentials = registry.credentials.orNull?.let { Credentials (it.username!! , it.password!! ) }
200- val port = startHttpServer(0 , OciRepositoryHandler (imageMetadataRegistry, imageMappingData, credentials)).port()
206+ val port = startHttpServer(
207+ 0 ,
208+ loopResources,
209+ OciRepositoryHandler (imageMetadataRegistry, imageMappingData, credentials),
210+ ).port()
201211 registry.repository.credentials(HttpHeaderCredentials ::class ) {
202212 name = PORT_HTTP_HEADER_NAME
203213 value = port.toString()
@@ -209,6 +219,7 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
209219
210220 private fun startHttpServer (
211221 port : Int ,
222+ loopResources : LoopResources ,
212223 handler : BiFunction <in HttpServerRequest , in HttpServerResponse , out Publisher <Void >>,
213224 ): DisposableServer {
214225 return try {
@@ -228,12 +239,14 @@ internal abstract class OciRegistriesService : BuildService<BuildServiceParamete
228239 }
229240
230241 final override fun close () {
231- for (httpServer in httpServers) {
232- httpServer.disposeNow()
242+ if (httpServers.isNotEmpty()) {
243+ for (httpServer in httpServers) {
244+ httpServer.disposeNow()
245+ }
246+ httpServers.clear()
247+ OciRegistryHttpClient .release()
248+ OciLoopResources .release()
233249 }
234- httpServers.clear()
235- OciRegistryHttpClient .release()
236- OciLoopResources .release()
237250 }
238251}
239252
0 commit comments