Skip to content
This repository was archived by the owner on Aug 4, 2022. It is now read-only.

Commit 2e8b79d

Browse files
tcondiemotus
authored andcommitted
[REEF-2024] Prepare existing artifacts for new bridge module. (#1467)
The new bridge needs access to create an EvaluatorDescriptor. This PR creates a factor and builder for EvaluatorDescriptor that can be injected via Tang. Default implementation creates an EvaluatorDescriptImpl. Pull Request: Closes #1467
1 parent 396fd82 commit 2e8b79d

File tree

5 files changed

+224
-18
lines changed

5 files changed

+224
-18
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.reef.runtime.common.driver.evaluator;
21+
22+
import org.apache.reef.driver.catalog.NodeDescriptor;
23+
import org.apache.reef.driver.evaluator.EvaluatorDescriptor;
24+
import org.apache.reef.driver.evaluator.EvaluatorProcess;
25+
26+
/**
27+
* A builder for evaluator descriptors.
28+
*/
29+
public interface EvaluatorDescriptorBuilder extends org.apache.reef.util.Builder<EvaluatorDescriptor> {
30+
31+
/**
32+
* Set the node descriptor for this evaluator.
33+
* @param nodeDescriptor for this evaluator
34+
* @return this
35+
*/
36+
EvaluatorDescriptorBuilder setNodeDescriptor(final NodeDescriptor nodeDescriptor);
37+
38+
/**
39+
* Amount of memory dedicated to this evaluator.
40+
* @param megaBytes of dedicated memory
41+
* @return this
42+
*/
43+
EvaluatorDescriptorBuilder setMemory(final int megaBytes);
44+
45+
/**
46+
* Set the number of cores.
47+
* @param numberOfCores dedicated for this evaluator
48+
* @return this
49+
*/
50+
EvaluatorDescriptorBuilder setNumberOfCores(final int numberOfCores);
51+
52+
/**
53+
* The process used to run this evaluator.
54+
* @param evaluatorProcess for this evaluator
55+
* @return this
56+
*/
57+
EvaluatorDescriptorBuilder setEvaluatorProcess(final EvaluatorProcess evaluatorProcess);
58+
59+
/**
60+
* The runtime name for this evaluator.
61+
* @param runtimeName for this evaluator
62+
* @return this
63+
*/
64+
EvaluatorDescriptorBuilder setRuntimeName(final String runtimeName);
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing,
13+
* software distributed under the License is distributed on an
14+
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
* KIND, either express or implied. See the License for the
16+
* specific language governing permissions and limitations
17+
* under the License.
18+
*/
19+
20+
package org.apache.reef.runtime.common.driver.evaluator;
21+
22+
import org.apache.reef.driver.evaluator.EvaluatorDescriptor;
23+
import org.apache.reef.tang.annotations.DefaultImplementation;
24+
25+
/**
26+
* Evaluator descriptor builder factory interface.
27+
*/
28+
@DefaultImplementation(EvaluatorDescriptorImpl.BuilderFactory.class)
29+
public interface EvaluatorDescriptorBuilderFactory {
30+
/**
31+
* Create a new evaluator descriptor builder.
32+
* @return new evaluator descriptor builder
33+
*/
34+
EvaluatorDescriptorBuilder newBuilder();
35+
36+
/**
37+
* Create an evaluator descriptor builder that is initialized to another copy.
38+
* @param copy to initialize builder
39+
* @return evaluator descriptor builder initialized to copy
40+
*/
41+
EvaluatorDescriptorBuilder newBuilder(final EvaluatorDescriptor copy);
42+
}

lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/EvaluatorDescriptorImpl.java

Lines changed: 88 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import org.apache.reef.driver.evaluator.EvaluatorDescriptor;
2525
import org.apache.reef.driver.evaluator.EvaluatorProcess;
2626

27+
import javax.inject.Inject;
28+
2729
/**
2830
* A simple all-data implementation of EvaluatorDescriptor.
2931
*/
@@ -37,11 +39,12 @@ final class EvaluatorDescriptorImpl implements EvaluatorDescriptor {
3739
private EvaluatorProcess process;
3840
private final String runtimeName;
3941

40-
EvaluatorDescriptorImpl(final NodeDescriptor nodeDescriptor,
41-
final int megaBytes,
42-
final int numberOfCores,
43-
final EvaluatorProcess process,
44-
final String runtimeName) {
42+
private EvaluatorDescriptorImpl(
43+
final NodeDescriptor nodeDescriptor,
44+
final int megaBytes,
45+
final int numberOfCores,
46+
final EvaluatorProcess process,
47+
final String runtimeName) {
4548
this.nodeDescriptor = nodeDescriptor;
4649
this.megaBytes = megaBytes;
4750
this.numberOfCores = numberOfCores;
@@ -80,4 +83,84 @@ public int getNumberOfCores() {
8083
public String getRuntimeName() {
8184
return this.runtimeName;
8285
}
86+
87+
/**
88+
* Evaluator descriptor builder factory that creates a new evaluator descriptor builder impl.
89+
*/
90+
static final class BuilderFactory implements EvaluatorDescriptorBuilderFactory {
91+
@Inject
92+
private BuilderFactory() {
93+
}
94+
95+
@Override
96+
public EvaluatorDescriptorBuilder newBuilder() {
97+
return new Builder();
98+
}
99+
100+
@Override
101+
public EvaluatorDescriptorBuilder newBuilder(final EvaluatorDescriptor copy) {
102+
return newBuilder()
103+
.setNodeDescriptor(copy.getNodeDescriptor())
104+
.setMemory(copy.getMemory())
105+
.setNumberOfCores(copy.getNumberOfCores())
106+
.setEvaluatorProcess(copy.getProcess())
107+
.setRuntimeName(copy.getRuntimeName());
108+
}
109+
}
110+
111+
/**
112+
* An builder for this evaluator descriptor implementation.
113+
*/
114+
private static final class Builder implements EvaluatorDescriptorBuilder {
115+
private NodeDescriptor nodeDescriptor = null;
116+
private int memory = 0;
117+
private int numberOfCores = 0;
118+
private EvaluatorProcess evaluatorProcess = null;
119+
private String runtimeName = null;
120+
121+
@Override
122+
public Builder setNodeDescriptor(final NodeDescriptor nodeDescriptor) {
123+
this.nodeDescriptor = nodeDescriptor;
124+
return this;
125+
}
126+
127+
@Override
128+
public Builder setMemory(final int megaBytes) {
129+
this.memory = megaBytes;
130+
return this;
131+
}
132+
133+
@Override
134+
public Builder setNumberOfCores(final int numberOfCores) {
135+
this.numberOfCores = numberOfCores;
136+
return this;
137+
}
138+
139+
@Override
140+
public Builder setEvaluatorProcess(final EvaluatorProcess evaluatorProcess) {
141+
this.evaluatorProcess = evaluatorProcess;
142+
return this;
143+
}
144+
145+
@Override
146+
public Builder setRuntimeName(final String runtimeName) {
147+
this.runtimeName = runtimeName;
148+
return this;
149+
}
150+
151+
@Override
152+
public EvaluatorDescriptor build() {
153+
if (this.memory == 0) {
154+
throw new IllegalArgumentException("memory not set");
155+
} else if (this.numberOfCores == 0) {
156+
throw new IllegalArgumentException("number of cores not set");
157+
}
158+
return new EvaluatorDescriptorImpl(
159+
this.nodeDescriptor,
160+
this.memory,
161+
this.numberOfCores,
162+
this.evaluatorProcess,
163+
this.runtimeName);
164+
}
165+
}
83166
}

lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/EvaluatorManager.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public final class EvaluatorManager implements Identifiable, AutoCloseable {
9191
private final ResourceReleaseHandler resourceReleaseHandler;
9292
private final ResourceLaunchHandler resourceLaunchHandler;
9393
private final String evaluatorId;
94-
private final EvaluatorDescriptorImpl evaluatorDescriptor;
94+
private final EvaluatorDescriptorBuilderFactory evaluatorDescriptorBuilderFactory;
9595
private final ContextRepresenters contextRepresenters;
9696
private final EvaluatorMessageDispatcher messageDispatcher;
9797
private final EvaluatorControlHandler evaluatorControlHandler;
@@ -107,14 +107,15 @@ public final class EvaluatorManager implements Identifiable, AutoCloseable {
107107
private final EvaluatorIdlenessThreadPool idlenessThreadPool;
108108

109109
// Mutable fields
110+
private EvaluatorDescriptor evaluatorDescriptor;
110111
private Optional<TaskRepresenter> task = Optional.empty();
111112
private boolean resourceNotReleased = true;
112113
private boolean allocationNotFired = true;
113114

114115
@Inject
115116
private EvaluatorManager(
116117
@Parameter(EvaluatorIdentifier.class) final String evaluatorId,
117-
@Parameter(EvaluatorDescriptorName.class) final EvaluatorDescriptorImpl evaluatorDescriptor,
118+
@Parameter(EvaluatorDescriptorName.class) final EvaluatorDescriptor evaluatorDescriptor,
118119
@Parameter(EvaluatorConfigurationProviders.class)
119120
final Set<ConfigurationProvider> evaluatorConfigurationProviders,
120121
final Clock clock,
@@ -131,12 +132,14 @@ private EvaluatorManager(
131132
final EventHandlerIdlenessSource idlenessSource,
132133
final LoggingScopeFactory loggingScopeFactory,
133134
final DriverRestartManager driverRestartManager,
134-
final EvaluatorIdlenessThreadPool idlenessThreadPool) {
135+
final EvaluatorIdlenessThreadPool idlenessThreadPool,
136+
final EvaluatorDescriptorBuilderFactory evaluatorDescriptorBuilderFactory) {
135137

136138
LOG.log(Level.FINEST, "Instantiating 'EvaluatorManager' for evaluator: {0}", evaluatorId);
137139

138140
this.evaluatorId = evaluatorId;
139141
this.evaluatorDescriptor = evaluatorDescriptor;
142+
this.evaluatorDescriptorBuilderFactory = evaluatorDescriptorBuilderFactory;
140143
this.evaluatorConfigurationProviders = evaluatorConfigurationProviders;
141144

142145
this.clock = clock;
@@ -209,7 +212,9 @@ public String getId() {
209212
}
210213

211214
public void setProcess(final EvaluatorProcess process) {
212-
this.evaluatorDescriptor.setProcess(process);
215+
this.evaluatorDescriptor = this.evaluatorDescriptorBuilderFactory.newBuilder(this.evaluatorDescriptor)
216+
.setEvaluatorProcess(process)
217+
.build();
213218
}
214219

215220
public EvaluatorDescriptor getEvaluatorDescriptor() {
@@ -708,6 +713,6 @@ public static final class EvaluatorIdentifier implements Name<String> {
708713
* The Evaluator Host.
709714
*/
710715
@NamedParameter(doc = "The Evaluator Host.")
711-
public static final class EvaluatorDescriptorName implements Name<EvaluatorDescriptorImpl> {
716+
public static final class EvaluatorDescriptorName implements Name<EvaluatorDescriptor> {
712717
}
713718
}

lang/java/reef-common/src/main/java/org/apache/reef/runtime/common/driver/evaluator/EvaluatorManagerFactory.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.apache.reef.annotations.audience.Private;
2424
import org.apache.reef.driver.catalog.NodeDescriptor;
2525
import org.apache.reef.driver.catalog.ResourceCatalog;
26+
import org.apache.reef.driver.evaluator.EvaluatorDescriptor;
2627
import org.apache.reef.driver.evaluator.EvaluatorProcessFactory;
2728
import org.apache.reef.runtime.common.driver.catalog.ResourceCatalogImpl;
2829
import org.apache.reef.runtime.common.driver.resourcemanager.*;
@@ -45,14 +46,17 @@ public final class EvaluatorManagerFactory {
4546
private final Injector injector;
4647
private final ResourceCatalog resourceCatalog;
4748
private final EvaluatorProcessFactory processFactory;
49+
private final EvaluatorDescriptorBuilderFactory evaluatorDescriptorBuilderFactory;
4850

4951
@Inject
5052
EvaluatorManagerFactory(final Injector injector,
5153
final ResourceCatalog resourceCatalog,
52-
final EvaluatorProcessFactory processFactory) {
54+
final EvaluatorProcessFactory processFactory,
55+
final EvaluatorDescriptorBuilderFactory evaluatorDescriptorBuilderFactory) {
5356
this.injector = injector;
5457
this.resourceCatalog = resourceCatalog;
5558
this.processFactory = processFactory;
59+
this.evaluatorDescriptorBuilderFactory = evaluatorDescriptorBuilderFactory;
5660
}
5761

5862
private EvaluatorManager getNewEvaluatorManagerInstanceForResource(
@@ -72,10 +76,13 @@ private EvaluatorManager getNewEvaluatorManagerInstanceForResource(
7276
((ResourceCatalogImpl) resourceCatalog).handle(nodeDescriptorEvent);
7377
nodeDescriptor = this.resourceCatalog.getNode(nodeId);
7478
}
75-
final EvaluatorDescriptorImpl evaluatorDescriptor = new EvaluatorDescriptorImpl(nodeDescriptor,
76-
resourceEvent.getResourceMemory(), resourceEvent.getVirtualCores().get(),
77-
processFactory.newEvaluatorProcess(), resourceEvent.getRuntimeName());
78-
79+
final EvaluatorDescriptor evaluatorDescriptor = evaluatorDescriptorBuilderFactory.newBuilder()
80+
.setNodeDescriptor(nodeDescriptor)
81+
.setMemory(resourceEvent.getResourceMemory())
82+
.setNumberOfCores(resourceEvent.getVirtualCores().get())
83+
.setEvaluatorProcess(processFactory.newEvaluatorProcess())
84+
.setRuntimeName(resourceEvent.getRuntimeName())
85+
.build();
7986
LOG.log(Level.FINEST, "Resource allocation: new evaluator id[{0}]", resourceEvent.getIdentifier());
8087
final EvaluatorManager evaluatorManager =
8188
getNewEvaluatorManagerInstance(resourceEvent.getIdentifier(), evaluatorDescriptor);
@@ -90,7 +97,7 @@ private EvaluatorManager getNewEvaluatorManagerInstanceForResource(
9097
* @param desc NodeDescriptor on which the Evaluator executes.
9198
* @return a new EvaluatorManager instance.
9299
*/
93-
private EvaluatorManager getNewEvaluatorManagerInstance(final String id, final EvaluatorDescriptorImpl desc) {
100+
private EvaluatorManager getNewEvaluatorManagerInstance(final String id, final EvaluatorDescriptor desc) {
94101
LOG.log(Level.FINEST, "Creating Evaluator Manager for Evaluator ID {0}", id);
95102
final Injector child = this.injector.forkInjector();
96103

@@ -134,8 +141,12 @@ public EvaluatorManager getNewEvaluatorManagerForNewEvaluator(
134141
public EvaluatorManager getNewEvaluatorManagerForEvaluatorFailedDuringDriverRestart(
135142
final ResourceStatusEvent resourceStatusEvent) {
136143
return getNewEvaluatorManagerInstance(resourceStatusEvent.getIdentifier(),
137-
new EvaluatorDescriptorImpl(null, 128, 1, processFactory.newEvaluatorProcess(),
138-
resourceStatusEvent.getRuntimeName()));
144+
this.evaluatorDescriptorBuilderFactory.newBuilder()
145+
.setMemory(128)
146+
.setNumberOfCores(1)
147+
.setEvaluatorProcess(processFactory.newEvaluatorProcess())
148+
.setRuntimeName(resourceStatusEvent.getRuntimeName())
149+
.build());
139150
}
140151

141152
/**

0 commit comments

Comments
 (0)