Uploaded image for project: 'Artifactory Binary Repository'
  1. Artifactory Binary Repository
  2. RTFACT-19814

Replication is treating dot and underscore in repo name as the same

    Details

    • Type: Bug
    • Status: Open
    • Priority: High
    • Resolution: Unresolved
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: Config Manager, Replication
    • Labels:
      None

      Description

      Description:
      When setting replication or 2 repositories with the below changes, the replication will assign the same replication key to the repositories replication, which will make the config descriptor unusable until the deletion of the manual deletion of the replication entry from the config descriptor. 

      Steps to reproduce:

      1. Create 2 local repositories with the following names: 'dot.underscore-issues' and 'dot_underscore-issues' (the actual name is irrelevant just have it the same with the diff of '.' and '_')
      2. Create replication to those repositories.
      3. Once you hit save on the replication you will see the attached error (see pic 1).
      4. Although the error is shown, the configuration is saved and the <replicationKey> is the same.
      5. From that point on you can't do any configuration change until going to the config descriptor and manually delete at least one of the replication entries.
      <localReplication>
      <enabled>true</enabled>
      <cronExp>0 0/15 * 1/1 * ? *</cronExp>
      <syncDeletes>false</syncDeletes>
      <syncProperties>true</syncProperties>
      <repoKey>generic-local</repoKey>
      <enableEventReplication>false</enableEventReplication>
      <replicationKey>generic-local_http__719ccfd0e4</replicationKey>
      <checkBinaryExistenceInFilestore>false</checkBinaryExistenceInFilestore>
      <url>http://localhost:8081/artifactory/dot_underscore-issues</url>
      <socketTimeoutMillis>15000</socketTimeoutMillis>
      <username>admin</username>
      <password>AM.zG8ua.AES128.2h424SyaesXwq6Y9MMsuGHGhEBe9EGN5e59BHDs4s2An1FbF</password>
      <syncStatistics>false</syncStatistics>
      </localReplication>
      
      <localReplication>
      <enabled>true</enabled>
      <cronExp>0 0/15 * 1/1 * ? *</cronExp>
      <syncDeletes>false</syncDeletes>
      <syncProperties>true</syncProperties>
      <repoKey>generic-local</repoKey>
      <enableEventReplication>false</enableEventReplication>
      <replicationKey>generic-local_http__719ccfd0e4</replicationKey>
      <checkBinaryExistenceInFilestore>false</checkBinaryExistenceInFilestore>
      <url>http://localhost:8081/artifactory/dot.underscore-issues</url>
      <socketTimeoutMillis>15000</socketTimeoutMillis>
      <username>admin</username>
      <password>AM.zG8ua.AES128.2gNXYu8rHFzXYshhuq7JsidV6rjdG53KUWNMp15jEznPtSrE</password>
      <syncStatistics>false</syncStatistics>
      </localReplication>

      Stacktrace: 

      2019-08-04 09:04:20,717 [http-nio-8081-exec-10] [ERROR] (o.a.c.CentralConfigServiceImpl:642) - Failed to reload configuration: Duplicate key LocalReplication[generic-local|http://localhost:8081/artifactory/dot_underscore-issues|generic-local_http__719ccfd0e4]
      java.lang.IllegalStateException: Duplicate key LocalReplication[generic-local|http://localhost:8081/artifactory/dot_underscore-issues|generic-local_http__719ccfd0e4]
      at java.util.stream.Collectors.lambda$throwingMerger$115(Collectors.java:133)
      at java.util.HashMap.merge(HashMap.java:1245)
      at java.util.stream.Collectors.lambda$toMap$173(Collectors.java:1320)
      at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169)
      at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
      at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
      at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
      at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
      at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
      at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
      at org.jfrog.common.config.diff.DiffUtils.diffCollection(DiffUtils.java:75)
      at org.artifactory.descriptor.config.DiffFunctionsImpl.centralConfigDescriptorImpl(DiffFunctionsImpl.java:83)
      at org.artifactory.descriptor.config.DiffFunctionsImpl.lambda$new$7(DiffFunctionsImpl.java:225)
      at org.artifactory.descriptor.config.DiffFunctionsImpl.diffFor(DiffFunctionsImpl.java:16)
      at org.artifactory.config.CentralConfigServiceImpl.findDiff(CentralConfigServiceImpl.java:475)
      at sun.reflect.GeneratedMethodAccessor344.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:497)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)
      at com.sun.proxy.$Proxy142.findDiff(Unknown Source)
      at org.artifactory.spring.ArtifactoryApplicationContext.reload(ArtifactoryApplicationContext.java:383)
      at org.artifactory.config.CentralConfigServiceImpl.callReload(CentralConfigServiceImpl.java:540)
      at org.artifactory.config.CentralConfigServiceImpl.reloadConfiguration(CentralConfigServiceImpl.java:524)
      at org.artifactory.config.CentralConfigServiceImpl.saveDescriptor(CentralConfigServiceImpl.java:313)
      at org.artifactory.config.CentralConfigServiceImpl.saveAndReloadContext(CentralConfigServiceImpl.java:621)
      at org.artifactory.config.CentralConfigServiceImpl.lambda$saveAndReloadContextWithRetry$0(CentralConfigServiceImpl.java:575)
      at org.jfrog.common.ExecutionUtils.handleFunctionExecution(ExecutionUtils.java:57)
      at org.jfrog.common.ExecutionUtils.lambda$generateExecutionRunnable$0(ExecutionUtils.java:48)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
      at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:111)
      at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:58)
      at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:75)
      at com.google.common.util.concurrent.MoreExecutors$DirectExecutorService.execute(MoreExecutors.java:260)
      at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:112)
      at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:56)
      at com.google.common.util.concurrent.AbstractListeningExecutorService.submit(AbstractListeningExecutorService.java:36)
      at org.jfrog.common.ExecutionUtils.retry(ExecutionUtils.java:41)
      at org.artifactory.config.CentralConfigServiceImpl.saveAndReloadContextWithRetry(CentralConfigServiceImpl.java:574)
      at org.artifactory.config.CentralConfigServiceImpl.saveEditedDescriptorAndReload(CentralConfigServiceImpl.java:516)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:497)
      at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
      at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:201)
      at com.sun.proxy.$Proxy142.saveEditedDescriptorAndReload(Unknown Source)
      at org.artifactory.ui.rest.service.admin.configuration.repositories.util.UpdateRepoConfigHelper.handleLocal(UpdateRepoConfigHelper.java:103)
      at org.artifactory.ui.rest.model.admin.configuration.repository.local.LocalRepositoryConfigModel.updateRepo(LocalRepositoryConfigModel.java:142)
      at org.artifactory.ui.rest.service.admin.configuration.repositories.UpdateRepositoryConfigService.execute(UpdateRepositoryConfigService.java:66)
      at org.artifactory.rest.common.service.ServiceExecutor.process(ServiceExecutor.java:38)
      at org.artifactory.rest.common.resource.BaseResource.runService(BaseResource.java:92)
      at org.artifactory.ui.rest.resource.admin.configuration.repositories.RepoConfigResource.updateRepositoryConfig(RepoConfigResource.java:64)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:497)
      at org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.lambda$static$0(ResourceMethodInvocationHandlerFactory.java:76)
      at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher$1.run(AbstractJavaResourceMethodDispatcher.java:148)
      at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.invoke(AbstractJavaResourceMethodDispatcher.java:191)
      at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:200)
      at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:103)
      at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:493)
      at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:415)
      at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:104)
      at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:277)
      at org.glassfish.jersey.internal.Errors$1.call(Errors.java:272)
      at org.glassfish.jersey.internal.Errors$1.call(Errors.java:268)
      at org.glassfish.jersey.internal.Errors.process(Errors.java:316)
      at org.glassfish.jersey.internal.Errors.process(Errors.java:298)
      at org.glassfish.jersey.internal.Errors.process(Errors.java:268)
      at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:289)
      at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:256)
      at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:703)
      at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:416)
      at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:370)
      at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:389)
      at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:342)
      at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:229)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.artifactory.webapp.servlet.RepoFilter.execute(RepoFilter.java:186)
      at org.artifactory.webapp.servlet.RepoFilter.doFilter(RepoFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.artifactory.webapp.servlet.AccessFilter.useAuthentication(AccessFilter.java:426)
      at org.artifactory.webapp.servlet.AccessFilter.doFilterInternal(AccessFilter.java:214)
      at org.artifactory.webapp.servlet.AccessFilter.doFilter(AccessFilter.java:167)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.artifactory.webapp.servlet.RequestFilter.doFilter(RequestFilter.java:77)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.artifactory.webapp.servlet.ArtifactoryCsrfFilter.doFilter(ArtifactoryCsrfFilter.java:85)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:164)
      at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
      at org.artifactory.webapp.servlet.SessionFilter.doFilter(SessionFilter.java:62)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.artifactory.webapp.servlet.ArtifactoryFilter.doFilter(ArtifactoryFilter.java:124)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
      at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
      at org.apache.catalina.valves.rewrite.RewriteValve.invoke(RewriteValve.java:279)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
      at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
      at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
      at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:800)
      at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1471)
      at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
      at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
      at java.lang.Thread.run(Thread.java:745)
      2019-08-04 09:04:20,719 [http-nio-8081-exec-10] [ERROR] (o.j.c.ExecutionUtils:89) - Last retry failed: code exception. Not trying again (Failed to reload configuration: Duplicate key LocalReplication[generic-local|http://localhost:8081/artifactory/dot_underscore-issues|generic-local_http__719ccfd0e4])

       

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              ariels Ariel Seftel
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated: