Tamas, can I have a baked zip pls? I've hit this twice today, e.g. 12:12:48 [ERROR] Could not acquire write lock for 'artifact:net.bytebuddy:byte-buddy-agent:1.12.13' 12:12:48 java.lang.IllegalStateException: Could not acquire write lock for 'artifact:net.bytebuddy:byte-buddy-agent:1.12.13' 12:12:48 at org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter$AdaptedLockSyncContext.acquire (NamedLockFactoryAdapter.java:158) 12:12:48 at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:259) 12:12:48 at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies (DefaultRepositorySystem.java:352) 12:12:48 at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:182) 12:12:48 at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:233) 12:12:48 at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:145) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:369) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:327) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163) 12:12:48 at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160) 12:12:48 at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105) 12:12:48 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call (MultiThreadedBuilder.java:193) 12:12:48 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call (MultiThreadedBuilder.java:180) 12:12:48 at java.util.concurrent.FutureTask.run (FutureTask.java:264) 12:12:48 at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:515) 12:12:48 at java.util.concurrent.FutureTask.run (FutureTask.java:264) 12:12:48 at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128) 12:12:48 at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:628) 12:12:48 at java.lang.Thread.run (Thread.java:829) 12:12:48 [ERROR] java.lang.IllegalStateException: Could not acquire write lock for 'artifact:net.bytebuddy:byte-buddy-agent:1.12.13' 12:12:48 java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Could not acquire write lock for 'artifact:net.bytebuddy:byte-buddy-agent:1.12.13' 12:12:48 at java.util.concurrent.FutureTask.report (FutureTask.java:122) 12:12:48 at java.util.concurrent.FutureTask.get (FutureTask.java:191) 12:12:48 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder.multiThreadedProjectTaskSegmentBuild (MultiThreadedBuilder.java:140) 12:12:48 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder.build (MultiThreadedBuilder.java:101) 12:12:48 at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:118) 12:12:48 at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:261) 12:12:48 at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:173) 12:12:48 at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:101) 12:12:48 at org.apache.maven.cli.MavenCli.execute (MavenCli.java:827) 12:12:48 at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:272) 12:12:48 at org.apache.maven.cli.MavenCli.main (MavenCli.java:195) 12:12:48 at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) 12:12:48 at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 12:12:48 at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) 12:12:48 at java.lang.reflect.Method.invoke (Method.java:566) 12:12:48 at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) 12:12:48 at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) 12:12:48 at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) 12:12:48 at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347) 12:12:48 Caused by: java.lang.IllegalStateException: Could not acquire write lock for 'artifact:net.bytebuddy:byte-buddy-agent:1.12.13' 12:12:48 at org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter$AdaptedLockSyncContext.acquire (NamedLockFactoryAdapter.java:158) 12:12:48 at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:259) 12:12:48 at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies (DefaultRepositorySystem.java:352) 12:12:48 at org.apache.maven.project.DefaultProjectDependenciesResolver.resolve (DefaultProjectDependenciesResolver.java:182) 12:12:48 at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.getDependencies (LifecycleDependencyResolver.java:233) 12:12:48 at org.apache.maven.lifecycle.internal.LifecycleDependencyResolver.resolveProjectDependencies (LifecycleDependencyResolver.java:145) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.ensureDependenciesAreResolved (MojoExecutor.java:369) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.doExecute (MojoExecutor.java:327) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:213) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:175) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.access$000 (MojoExecutor.java:76) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor$1.run (MojoExecutor.java:163) 12:12:48 at org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute (DefaultMojosExecutionStrategy.java:39) 12:12:48 at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:160) 12:12:48 at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:105) 12:12:48 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call (MultiThreadedBuilder.java:193) 12:12:48 at org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call (MultiThreadedBuilder.java:180) 12:12:48 at java.util.concurrent.FutureTask.run (FutureTask.java:264) 12:12:48 at java.util.concurrent.Executors$RunnableAdapter.call (Executors.java:515) 12:12:48 at java.util.concurrent.FutureTask.run (FutureTask.java:264) 12:12:48 at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128) 12:12:48 at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:628) 12:12:48 at java.lang.Thread.run (Thread.java:829)
On Fri, 24 Mar 2023 at 00:26, Dan Tran <dant...@gmail.com> wrote: > It works on one of my smaller projects that facing the same issue. > > However, in order to test with a bigger project, I need an official > 3.9.2-SNAPSHOT deployed at apache (long story) > > Thank you for the quick fix > > -D > > On Thu, Mar 23, 2023 at 4:27 AM Tamás Cservenák <ta...@cservenak.net> > wrote: > > > You could try out this one, if you can: > > Resolver PR: > > https://github.com/apache/maven-resolver/pull/272 > > Then build Maven 3.9.x using built resolver (just modify the POM to use > > resolver 1.9.8-SNAPSHOT) > > https://github.com/apache/maven/tree/maven-3.9.x > > > > https://issues.apache.org/jira/browse/MRESOLVER-346 > > > > If you want "baked" ZIP, just ping. > > > > Thanks > > T > > > > On Thu, Mar 23, 2023 at 11:34 AM Tamás Cservenák <ta...@cservenak.net> > > wrote: > > > > > Dan, > > > > > > iI I provide you with a patched Maven ZIP, or, > > > if I point you to two PRs (one in resolver and one in maven-3.9.x) to > > > build patched Maven locally, > > > could you stick that patched Maven into your env just to try it out? > > > > > > Thanks > > > T > > > > > > On Thu, Mar 23, 2023 at 9:37 AM Tamás Cservenák <ta...@cservenak.net> > > > wrote: > > > > > >> Ok, > > >> > > >> this is def a timeout on lock: > > >> > > >> > > > https://github.com/apache/maven-resolver/blob/e439b343d8d94bdcc82965a3d4f2584c31c319c0/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/synccontext/named/NamedLockFactoryAdapter.java#L157-L158 > > >> > > >> Pls increase the timeout. > > >> > > >> T > > >> > > >> On Thu, Mar 23, 2023 at 9:32 AM Dan Tran <dant...@gmail.com> wrote: > > >> > > >>> this is not a single threaded buld > > >>> > > >>> stack trace: > > >>> > > >>> *9:35:34* [ERROR] Could not acquire write lock for > > >>> 'artifact:ch.qos.logback:logback-classic:1.2.10'*09:35:34* > > >>> java.lang.IllegalStateException: Could not acquire write lock for > > >>> 'artifact:ch.qos.logback:logback-classic:1.2.10'*09:35:34* at > > >>> > > >>> > > > org.eclipse.aether.internal.impl.synccontext.named.NamedLockFactoryAdapter$AdaptedLockSyncContext.acquire > > >>> (NamedLockFactoryAdapter.java:158)*09:35:34* at > > >>> > > org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts > > >>> (DefaultArtifactResolver.java:259)*09:35:34* at > > >>> > > >>> > > > org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveDependencies > > >>> (DefaultRepositorySystem.java:352)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolveInternal > > >>> (DefaultPluginDependenciesResolver.java:212)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve > > >>> (DefaultPluginDependenciesResolver.java:158)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.plugin.internal.DefaultMavenPluginManager.createPluginRealm > > >>> (DefaultMavenPluginManager.java:372)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.plugin.internal.DefaultMavenPluginManager.lambda$setupPluginRealm$1 > > >>> (DefaultMavenPluginManager.java:335)*09:35:34* at > > >>> org.apache.maven.plugin.DefaultPluginRealmCache.lambda$get$0 > > >>> (DefaultPluginRealmCache.java:156)*09:35:34* at > > >>> java.util.concurrent.ConcurrentHashMap.computeIfAbsent > > >>> (ConcurrentHashMap.java:1737)*09:35:34* at > > >>> org.apache.maven.plugin.DefaultPluginRealmCache.get > > >>> (DefaultPluginRealmCache.java:154)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.plugin.internal.DefaultMavenPluginManager.setupPluginRealm > > >>> (DefaultMavenPluginManager.java:334)*09:35:34* at > > >>> org.apache.maven.plugin.DefaultBuildPluginManager.getPluginRealm > > >>> (DefaultBuildPluginManager.java:205)*09:35:34* at > > >>> org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo > > >>> (DefaultBuildPluginManager.java:98)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.MojoExecutor.doExecute2 > > >>> (MojoExecutor.java:342)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.MojoExecutor.doExecute > > >>> (MojoExecutor.java:330)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.MojoExecutor.execute > > >>> (MojoExecutor.java:213)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.MojoExecutor.execute > > >>> (MojoExecutor.java:175)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.MojoExecutor.access$000 > > >>> (MojoExecutor.java:76)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.MojoExecutor$1.run > > >>> (MojoExecutor.java:163)*09:35:34* at > > >>> org.apache.maven.plugin.DefaultMojosExecutionStrategy.execute > > >>> (DefaultMojosExecutionStrategy.java:39)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.MojoExecutor.execute > > >>> (MojoExecutor.java:160)*09:35:34* at > > >>> > org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject > > >>> (LifecycleModuleBuilder.java:105)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call > > >>> (MultiThreadedBuilder.java:193)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder$1.call > > >>> (MultiThreadedBuilder.java:180)*09:35:34* at > > >>> java.util.concurrent.FutureTask.run (FutureTask.java:264)*09:35:34* > > >>> at java.util.concurrent.Executors$RunnableAdapter.call > > >>> (Executors.java:515)*09:35:34* at > > >>> java.util.concurrent.FutureTask.run (FutureTask.java:264)*09:35:34* > > >>> at java.util.concurrent.ThreadPoolExecutor.runWorker > > >>> (ThreadPoolExecutor.java:1128)*09:35:34* at > > >>> java.util.concurrent.ThreadPoolExecutor$Worker.run > > >>> (ThreadPoolExecutor.java:628)*09:35:34* at java.lang.Thread.run > > >>> (Thread.java:829)*09:35:34* [ERROR] java.lang.IllegalStateException: > > >>> Could not acquire write lock for > > >>> 'artifact:ch.qos.logback:logback-classic:1.2.10'*09:35:34* > > >>> java.util.concurrent.ExecutionException: > > >>> java.lang.IllegalStateException: Could not acquire write lock for > > >>> 'artifact:ch.qos.logback:logback-classic:1.2.10'*09:35:34* at > > >>> java.util.concurrent.FutureTask.report > (FutureTask.java:122)*09:35:34* > > >>> at java.util.concurrent.FutureTask.get > > >>> (FutureTask.java:191)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder.multiThreadedProjectTaskSegmentBuild > > >>> (MultiThreadedBuilder.java:140)*09:35:34* at > > >>> > > >>> > > > org.apache.maven.lifecycle.internal.builder.multithreaded.MultiThreadedBuilder.build > > >>> (MultiThreadedBuilder.java:101)*09:35:34* at > > >>> org.apache.maven.lifecycle.internal.LifecycleStarter.execute > > >>> (LifecycleStarter.java:118)*09:35:34* at > > >>> org.apache.maven.DefaultMaven.doExecute > > >>> (DefaultMaven.java:261)*09:35:34* at > > >>> org.apache.maven.DefaultMaven.doExecute > > >>> (DefaultMaven.java:173)*09:35:34* at > > >>> org.apache.maven.DefaultMaven.execute > > >>> (DefaultMaven.java:101)*09:35:34* at > > >>> org.apache.maven.cli.MavenCli.execute (MavenCli.java:827)*09:35:34* > > >>> at org.apache.maven.cli.MavenCli.doMain > > >>> (MavenCli.java:272)*09:35:34* at > > >>> org.apache.maven.cli.MavenCli.main (MavenCli.java:195)*09:35:34* > > >>> at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native > > >>> Method)*09:35:34* at > > >>> jdk.internal.reflect.NativeMethodAccessorImpl.invoke > > >>> (NativeMethodAccessorImpl.java:62)*09:35:34* at > > >>> jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke > > >>> (DelegatingMethodAccessorImpl.java:43)*09:35:34* at > > >>> java.lang.reflect.Method.invoke (Method.java:566)*09:35:34* at > > >>> org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced > > >>> (Launcher.java:282)*09:35:34* at > > >>> org.codehaus.plexus.classworlds.launcher.Launcher.launch > > >>> (Launcher.java:225)*09:35:34* at > > >>> org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode > > >>> (Launcher.java:406)*09:35:34* at > > >>> org.codehaus.plexus.classworlds.launcher.Launcher.main > > >>> (Launcher.java:347)*09:35:34* at > > >>> jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native > > >>> Method)*09:35:34* at > > >>> jdk.internal.reflect.NativeMethodAccessorImpl.invoke > > >>> (NativeMethodAccessorImpl.java:62)*09:35:34* at > > >>> jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke > > >>> (DelegatingMethodAccessorImpl.java:43)*09:35:34* at > > >>> java.lang.reflect.Method.invoke (Method.java:566)*09:35:34* at > > >>> org.apache.maven.wrapper.BootstrapMainStarter.start > > >>> (BootstrapMainStarter.java:52)*09:35:34* at > > >>> org.apache.maven.wrapper.WrapperExecutor.execute > > >>> (WrapperExecutor.java:161)*09:35:34* at > > >>> org.apache.maven.wrapper.MavenWrapperMain.main > > >>> (MavenWrapperMain.java:73) > > >>> > > >>> > > >>> thanks > > >>> > > >>> > > >>> -D > > >>> > > >>> > > >>> On Wed, Mar 22, 2023 at 3:23 PM Tamás Cservenák <ta...@cservenak.net > > > > >>> wrote: > > >>> > > >>> > Interesting. > > >>> > > > >>> > You did not provide any stack, so I just guessed "timeout". For > > >>> > increasing/decreasing "wait time" (def is 30 sec), see here: > > >>> > https://maven.apache.org/resolver/configuration.html > > >>> > Look for "aether.syncContext.named.time" and > > >>> > "aether.syncContext.named.time.unit". > > >>> > Also good to look at: > > >>> > > > >>> > > https://maven.apache.org/resolver/maven-resolver-named-locks/index.html > > >>> > > > >>> > And finally, there are redisson and hazelcast provided locks: > > >>> > > > >>> > > > >>> > > > https://maven.apache.org/resolver/maven-resolver-named-locks-redisson/index.html > > >>> > > > >>> > Also, "So I guess it is using the default file-lock?" -- Maven > 3.9.1 > > >>> does > > >>> > NOT use file locking by default, so unless the docker image you > use, > > or > > >>> > whatever sets it up.... > > >>> > It would be good to see some stack and what locking is in use. > > >>> > > > >>> > Note: if it turns out you don't use file locking, but the default > > >>> (Maven > > >>> > 3.9.1 by default uses in-jvm "rwlock-local" (backed by > > ReadWriteLock), > > >>> then > > >>> > really just increase time.... > > >>> > > > >>> > How about concurrency, I guess this is not a single threaded build? > > >>> > > > >>> > T > > >>> > > > >>> > PS: Is late here, my response to your response will probably come > in > > my > > >>> > morning > > >>> > > > >>> > On Wed, Mar 22, 2023 at 11:08 PM Dan Tran <dant...@gmail.com> > wrote: > > >>> > > > >>> > > Thanks for the quick response > > >>> > > > > >>> > > This is a simple switch from 3.8.7 to 3.9.1 ( did not see this > > issue > > >>> when > > >>> > > tested with 3.9.0). So I guess it is using the default > file-lock? > > >>> > > > > >>> > > The build runs inside a docker container on Jenkins agent with no > > >>> > antivirus > > >>> > > checker. The build always starts from scratch > > >>> > > > > >>> > > artifact:ch.qos.logback:logback-classic:1.2.10 is common > artifact > > >>> > > used by all components > > >>> > > > > >>> > > > > >>> > > How do I increase timeout? > > >>> > > > > >>> > > > > >>> > > Thanks > > >>> > > > > >>> > > > > >>> > > -D > > >>> > > > > >>> > > > > >>> > > On Wed, Mar 22, 2023 at 11:44 AM Tamás Cservenák < > > >>> ta...@cservenak.net> > > >>> > > wrote: > > >>> > > > > >>> > > > Howdy Dan, > > >>> > > > > > >>> > > > You did not mention what locking implementation you use, what > > >>> params > > >>> > etc? > > >>> > > > file-lock? redisson? something else? > > >>> > > > > > >>> > > > At the same time, it is rather strange that you mention "at the > > >>> same > > >>> > > > artifact" thing... from here and below I will assume you use > file > > >>> > locks: > > >>> > > > - can you do something like lsof on Linux? Meaning, can you > > ensure > > >>> > > nothing > > >>> > > > (some app, IDE or antivirus) is keeping the file open? > > >>> > > > - can you tell a bit more about that artifact? Is it installed > > one? > > >>> > Maybe > > >>> > > > from the current build? A dependency? In case of HUGE build and > > >>> COMMON > > >>> > > > artifact (ie. slf4j-api) that is used in almost all modules may > > be > > >>> > "hot", > > >>> > > > maybe try to increase lock timeout? Or even radically lessen > > (that > > >>> > should > > >>> > > > make problem occur more often perhaps) > > >>> > > > > > >>> > > > HTH > > >>> > > > Tamas > > >>> > > > > > >>> > > > On Wed, Mar 22, 2023 at 7:32 PM Dan Tran <dant...@gmail.com> > > >>> wrote: > > >>> > > > > > >>> > > > > Hi > > >>> > > > > > > >>> > > > > My large 400+ modules build facing the mentioned locking > issue > > >>> > > > consistently > > >>> > > > > at the same artifact > > >>> > > > > > > >>> > > > > artifact:ch.qos.logback:logback-classic:1.2.10 > > >>> > > > > > > >>> > > > > > > >>> > > > > any one see this issue at your build? > > >>> > > > > > > >>> > > > > > > >>> > > > > Thanks > > >>> > > > > > > >>> > > > > > > >>> > > > > -D > > >>> > > > > > > >>> > > > > > > >>> > > > > dont see same issue at smaller build > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > >>> > > >> > > >