From dcf4b72501c16cf9138716a7643bf7d0b77fd2a2 Mon Sep 17 00:00:00 2001 From: bufferoverflowexception Date: Tue, 23 Apr 2019 13:25:38 +0800 Subject: [PATCH 1/2] distribute --- .../api/internal/distribute/agent/Agent.java | 10 ++++ .../distribute/agent/AgentClient.java | 11 +++++ .../distribute/agent/DefaultAgentClient.java | 15 ++++++ .../distribute/agent/LocalMonitor.java | 9 ++++ .../distribute/agent/Serverconfig.java | 8 ++++ .../distribute/compile/CompileDispatcher.java | 27 +++++++++++ .../distribute/compile/DispatchTask.java | 13 +++++ .../compile/DispatchTaskFactory.java | 14 ++++++ .../internal/distribute/compile/IFactory.java | 11 +++++ .../distribute/tasks/DistributeCompiler.java | 48 +++++++++++++++++++ .../incremental/JavaChangeProcessor.java | 1 + .../incremental/recomp/RecompilationSpec.java | 24 ++++++++++ 12 files changed, 191 insertions(+) create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Agent.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/AgentClient.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/DefaultAgentClient.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/LocalMonitor.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Serverconfig.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTask.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskFactory.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/IFactory.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/tasks/DistributeCompiler.java diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Agent.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Agent.java new file mode 100644 index 0000000000000..492cfd8b7b8dc --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Agent.java @@ -0,0 +1,10 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class Agent { + private String id; + private String ip; + private String name; +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/AgentClient.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/AgentClient.java new file mode 100644 index 0000000000000..2eba13a521024 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/AgentClient.java @@ -0,0 +1,11 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. + */ +public interface AgentClient { + + int getAliveAgentCount(); + + int getCanUseAgentCount(); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/DefaultAgentClient.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/DefaultAgentClient.java new file mode 100644 index 0000000000000..ed27152824c15 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/DefaultAgentClient.java @@ -0,0 +1,15 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DefaultAgentClient implements AgentClient { + + public int getAliveAgentCount() { + return 0; + } + + public int getCanUseAgentCount() { + return 0; + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/LocalMonitor.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/LocalMonitor.java new file mode 100644 index 0000000000000..2dba1e5549371 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/LocalMonitor.java @@ -0,0 +1,9 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. + * Nothing. + */ + public class LocalMonitor { + + } \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Serverconfig.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Serverconfig.java new file mode 100644 index 0000000000000..5ea8172eaa345 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/agent/Serverconfig.java @@ -0,0 +1,8 @@ +package org.gradle.api.internal.distribute.agent; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class ServerConfig { + +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java new file mode 100644 index 0000000000000..7379f09117914 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java @@ -0,0 +1,27 @@ + +package org.gradle.api.internal.distribute.compile; + +import java.util.Map; +import java.util.Set; + +import org.gradle.api.internal.distribute.agent.AgentClient; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class CompileDispatcher { + + private AgentClient agentClient; + private IFactory iFactory; + + public CompileDispatcher(AgentClient client, IFactory iFactory) { + this.agentClient = client; + this.iFactory = iFactory; + } + + public boolean dispatch(Map> recompileClass) { + int agentCount = agentClient.getCanUseAgentCount(); + + return true; + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTask.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTask.java new file mode 100644 index 0000000000000..20abbd7fbf786 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTask.java @@ -0,0 +1,13 @@ +package org.gradle.api.internal.distribute.compile; + +import java.util.Set; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DispatchTask { + + public DispatchTask(String file, Set classes) { + + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskFactory.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskFactory.java new file mode 100644 index 0000000000000..c2722da8c3885 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskFactory.java @@ -0,0 +1,14 @@ +package org.gradle.api.internal.distribute.compile; + +import java.util.Set; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DispatchTaskFactory implements IFactory { + + @Override + public DispatchTask create(String file, Set classes) { + return new DispatchTask(file, classes); + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/IFactory.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/IFactory.java new file mode 100644 index 0000000000000..c40b08df1887c --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/IFactory.java @@ -0,0 +1,11 @@ +package org.gradle.api.internal.distribute.compile; + +import java.util.Set; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public interface IFactory { + + DispatchTask create(String file, Set classes); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/tasks/DistributeCompiler.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/tasks/DistributeCompiler.java new file mode 100644 index 0000000000000..f94e0475ce515 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/tasks/DistributeCompiler.java @@ -0,0 +1,48 @@ + +package org.gradle.api.internal.distribute.tasks; + +import org.gradle.language.base.internal.compile.Compiler; +import org.gradle.api.internal.tasks.compile.JavaCompileSpec; +import org.gradle.api.internal.tasks.compile.incremental.jar.JarClasspathSnapshot; +import org.gradle.api.internal.tasks.compile.incremental.jar.PreviousCompilation; +import org.gradle.api.internal.tasks.compile.incremental.jar.JarClasspathSnapshotProvider; +import org.gradle.api.internal.tasks.compile.incremental.RecompilationSpecProvider; +import org.gradle.api.internal.tasks.compile.incremental.recomp.RecompilationSpec; +import org.gradle.api.tasks.incremental.IncrementalTaskInputs; +import org.gradle.api.tasks.WorkResult; +import org.gradle.internal.time.Time; +import org.gradle.internal.time.Timer; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DistributeCompiler implements Compiler { + + private final IncrementalTaskInputs inputs; + private final Compiler delegate; + private final PreviousCompilation previousCompilation; + private final RecompilationSpecProvider recompilationSpecProvider; + private final JarClasspathSnapshotProvider jarClasspathSnapshotProvider; + + public DistributeCompiler(IncrementalTaskInputs inputs, Compiler delegate, + PreviousCompilation previousCompilation, JarClasspathSnapshotProvider jarClasspathSnapshotProvider, + RecompilationSpecProvider recompilationSpecProvider) { + this.inputs = inputs; + this.delegate = delegate; + this.previousCompilation = previousCompilation; + this.recompilationSpecProvider = recompilationSpecProvider; + this.jarClasspathSnapshotProvider = jarClasspathSnapshotProvider; + } + + @Override + public WorkResult execute(JavaCompileSpec spec) { + Timer clock = Time.startTimer(); + JarClasspathSnapshot jarClasspathSnapshot = jarClasspathSnapshotProvider + .getJarClasspathSnapshot(spec.getCompileClasspath()); + RecompilationSpec recompilationSpec = recompilationSpecProvider.provideRecompilationSpec(inputs, + previousCompilation, jarClasspathSnapshot); + + return delegate.execute(spec); + } + +} diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java index 65be2bc1b0d5e..254c22f127dd6 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/JavaChangeProcessor.java @@ -41,5 +41,6 @@ public void processChange(InputFileDetails input, RecompilationSpec spec) { return; } spec.getClassNames().addAll(actualDependents.getDependentClasses()); + spec.addReCompileClass(className, actualDependents.getDependentClasses()); } } diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java index 72c9d38c5f252..c255c53f5f89d 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java @@ -23,6 +23,7 @@ public class RecompilationSpec { private final Collection classesToCompile = new NormalizingClassNamesSet(); + private final Map> classesToCompileGroup = new HashMap<>(); private String fullRebuildCause; public Collection getClassNames() { @@ -41,6 +42,29 @@ public void setFullRebuildCause(String description, File file) { fullRebuildCause = description != null? description : "'" + file.getName() + "' was changed"; } + public void addReCompileClass(String file, Set sets) { + LinkedHashSet classSet = classesToCompileGroup.get(file); + if (classSet == null) { + classSet = LinkedHashSet<>(); + classesToCompileGroup.put(file,classSet); + } + for (String cn : sets) { + classSet.add(NormalizingClassNames(cn)) + } + } + + public Map> getAllReCompileClass() { + return classesToCompileGroup; + } + + private String NormalizingClassNames(String className) { + int idx = className.indexOf('$'); + if (idx>0) { + className = className.substring(0, idx); + } + return className + } + private static class NormalizingClassNamesSet extends LinkedHashSet { @Override public boolean add(String className) { From 39aeee4afdbf32cb5d3a78a85392f5d498811152 Mon Sep 17 00:00:00 2001 From: bufferoverflowexception Date: Sun, 30 Jun 2019 18:39:21 +0800 Subject: [PATCH 2/2] update --- .vscode/settings.json | 2 ++ .../api/internal/distribute/IDispatcher.java | 8 ++++++++ .../distribute/compile/CompileDispatcher.java | 15 ++++++++++++++- .../distribute/compile/DispatchTaskTrack.java | 18 ++++++++++++++++++ .../distribute/protocol/AbsProtocol.java | 10 ++++++++++ .../distribute/protocol/IProtocol.java | 12 ++++++++++++ .../distribute/protocol/ProtocolHeader.java | 9 +++++++++ .../incremental/recomp/RecompilationSpec.java | 17 ++++++++++------- 8 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/IDispatcher.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskTrack.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/AbsProtocol.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/IProtocol.java create mode 100644 subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/ProtocolHeader.java diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000..7a73a41bfdf76 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/IDispatcher.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/IDispatcher.java new file mode 100644 index 0000000000000..762655e012b06 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/IDispatcher.java @@ -0,0 +1,8 @@ +package org.gradle.api.internal.distribute; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +interface IDispatcher { + +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java index 7379f09117914..812c87abbd578 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/CompileDispatcher.java @@ -1,6 +1,7 @@ package org.gradle.api.internal.distribute.compile; +import java.util.Iterator; import java.util.Map; import java.util.Set; @@ -13,6 +14,8 @@ public class CompileDispatcher { private AgentClient agentClient; private IFactory iFactory; + private DispatchTaskTrack taskTrack; + // private Map> public CompileDispatcher(AgentClient client, IFactory iFactory) { this.agentClient = client; @@ -21,7 +24,17 @@ public CompileDispatcher(AgentClient client, IFactory iFactory) { public boolean dispatch(Map> recompileClass) { int agentCount = agentClient.getCanUseAgentCount(); - + int count = 0; + Iterator>> it = recompileClass.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry> entry = it.next(); + DispatchTask task = iFactory.create(entry.getKey(), entry.getValue()); + taskTrack.runTask(task); + if (++count > agentCount) { + break; + } + it.remove(); + } return true; } } \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskTrack.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskTrack.java new file mode 100644 index 0000000000000..f09217ec5716d --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/compile/DispatchTaskTrack.java @@ -0,0 +1,18 @@ + +package org.gradle.api.internal.distribute.compile; + +import org.gradle.api.internal.distribute.agent.AgentClient; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class DispatchTaskTrack { + + public DispatchTaskTrack(AgentClient agent) { + + } + + public void runTask(DispatchTask task) { + + } +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/AbsProtocol.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/AbsProtocol.java new file mode 100644 index 0000000000000..998f9904d4293 --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/AbsProtocol.java @@ -0,0 +1,10 @@ +package org.gradle.api.internal.distribute.protocol; + +/** + * Created by nls on 2019/4/21. Nothing. + */ + +public abstract class AbsProtocol implements IProtocol { + + public abstract int getCommand(); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/IProtocol.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/IProtocol.java new file mode 100644 index 0000000000000..aaa43740cbd1d --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/IProtocol.java @@ -0,0 +1,12 @@ + +package org.gradle.api.internal.distribute.protocol; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public interface IProtocol { + + boolean decode(byte[] data); + + byte[] encode(); +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/ProtocolHeader.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/ProtocolHeader.java new file mode 100644 index 0000000000000..632cc2a400b8c --- /dev/null +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/distribute/protocol/ProtocolHeader.java @@ -0,0 +1,9 @@ + +package org.gradle.api.internal.distribute.protocol; + +/** + * Created by nls on 2019/4/21. Nothing. + */ +public class ProtocolHeader { + +} \ No newline at end of file diff --git a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java index c255c53f5f89d..d30bd29030475 100644 --- a/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java +++ b/subprojects/language-java/src/main/java/org/gradle/api/internal/tasks/compile/incremental/recomp/RecompilationSpec.java @@ -18,12 +18,15 @@ import java.io.File; import java.util.Collection; +import java.util.HashMap; import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; public class RecompilationSpec { private final Collection classesToCompile = new NormalizingClassNamesSet(); - private final Map> classesToCompileGroup = new HashMap<>(); + private final Map> classesToCompileGroup = new HashMap<>(); private String fullRebuildCause; public Collection getClassNames() { @@ -39,7 +42,7 @@ public String getFullRebuildCause() { } public void setFullRebuildCause(String description, File file) { - fullRebuildCause = description != null? description : "'" + file.getName() + "' was changed"; + fullRebuildCause = description != null ? description : "'" + file.getName() + "' was changed"; } public void addReCompileClass(String file, Set sets) { @@ -49,27 +52,27 @@ public void addReCompileClass(String file, Set sets) { classesToCompileGroup.put(file,classSet); } for (String cn : sets) { - classSet.add(NormalizingClassNames(cn)) + classSet.add(NormalizingClassNames(cn)); } } public Map> getAllReCompileClass() { return classesToCompileGroup; - } + } private String NormalizingClassNames(String className) { int idx = className.indexOf('$'); - if (idx>0) { + if (idx > 0) { className = className.substring(0, idx); } - return className + return className; } private static class NormalizingClassNamesSet extends LinkedHashSet { @Override public boolean add(String className) { int idx = className.indexOf('$'); - if (idx>0) { + if (idx > 0) { className = className.substring(0, idx); } return super.add(className);