Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
7cf2a8f
Add max_actor_reconstructions in task spec
raulchen Oct 11, 2018
7a1863c
Add option in java annotation
raulchen Oct 11, 2018
4eb34dd
add remaining_reconstructions to ActorTableData
raulchen Oct 11, 2018
2850f4d
add max_reconstructions in ActorTableData
raulchen Oct 12, 2018
50ccf3f
Add ActorState
raulchen Oct 12, 2018
c715f6d
Update actor table when actor is dead or being reconstructed
raulchen Oct 12, 2018
eea9a48
fix SubmitTask
raulchen Oct 14, 2018
fea81b0
implement ReconstructActor
raulchen Oct 14, 2018
5ad03dc
fix
raulchen Oct 14, 2018
a60ec79
add some comments
raulchen Oct 15, 2018
9c7d2e7
add a test in java
raulchen Oct 15, 2018
63cab7b
trigger actor reconstruction by task
raulchen Oct 20, 2018
8f6cc0d
add comments
raulchen Oct 20, 2018
1a45469
format code
raulchen Oct 20, 2018
b7cab0d
add error_on_failure to AppendDataAt
raulchen Oct 20, 2018
50ebcc2
handle node failure
raulchen Oct 20, 2018
e94c0ad
fix format and minor updates
raulchen Oct 22, 2018
6d9eae3
minor fix
raulchen Oct 22, 2018
64139f4
Implement python frontend and add a python test
raulchen Oct 22, 2018
533f782
Add a test for node failure
raulchen Oct 22, 2018
69d595a
fix lint & fix test
raulchen Oct 23, 2018
0f207c7
address some comments
raulchen Oct 23, 2018
3be93f3
change ActorTable::UpdateDataAt
raulchen Oct 23, 2018
5022c69
immediately update actor state
raulchen Oct 23, 2018
99ac007
add a test for intentional exit
raulchen Oct 23, 2018
2c0a2ee
update comments
raulchen Oct 23, 2018
986d0f7
address comments
raulchen Oct 24, 2018
178a203
format
raulchen Oct 24, 2018
cbfd0a3
remove check and fix typos
raulchen Oct 24, 2018
0dcc401
consolidate tests
raulchen Oct 24, 2018
7273ebd
add actor creation dummy object id in java task
raulchen Oct 24, 2018
36fc45d
unskip some tests
raulchen Oct 25, 2018
1e3ec2f
fix lint
raulchen Oct 25, 2018
4a4ba7f
Merge branch 'master' into reconstruct_actor
stephanie-wang Oct 25, 2018
cbd6f95
Fix bug where reconstruction was getting triggered for initialized ac…
stephanie-wang Oct 26, 2018
077fb49
Fix actor tests and use cluster utils to test node failure
stephanie-wang Oct 26, 2018
73f4649
Add test for node failure before actor is initialized
stephanie-wang Oct 26, 2018
e40226d
Skip reconstruction if the actor is still alive
stephanie-wang Oct 27, 2018
13e3318
Test comments
stephanie-wang Oct 27, 2018
4b406ef
Merge branch 'master' into reconstruct_actor
stephanie-wang Oct 27, 2018
714f810
Minor changes
robertnishihara Oct 29, 2018
a46a674
Fix
robertnishihara Oct 29, 2018
1d7be13
Minor
robertnishihara Oct 29, 2018
f94d609
Merge branch 'master' into reconstruct_actor
stephanie-wang Oct 29, 2018
04afbb9
fixes
stephanie-wang Oct 29, 2018
0593f21
Merge branch 'reconstruct_actor' of github.com:ant-tech-alliance/ray …
stephanie-wang Oct 29, 2018
c523b13
Refactor bookkeeping for actor dummy objects
stephanie-wang Oct 31, 2018
dabc3f5
small fixes
raulchen Nov 5, 2018
539a5de
fix lint
raulchen Nov 5, 2018
3fc4b44
fix head_node_cluster
raulchen Nov 5, 2018
7793737
fix test_actor_reconstruction
raulchen Nov 5, 2018
f123c25
fix
raulchen Nov 5, 2018
a6b35a9
refine a log
raulchen Nov 5, 2018
54392fa
todo
stephanie-wang Nov 3, 2018
5484e8d
Put failed actor tasks back in the queue
stephanie-wang Nov 6, 2018
60cd255
Update logging message
stephanie-wang Nov 6, 2018
feaab8f
Merge branch 'master' into reconstruct_actor
stephanie-wang Nov 6, 2018
1090e5e
Merge branch 'master' into reconstruct_actor
Nov 7, 2018
6187f53
Merge branch 'master' into reconstruct_actor
stephanie-wang Nov 9, 2018
b7dea38
Add temporary timeout for travis testing
stephanie-wang Nov 9, 2018
c55e320
Merge branch 'reconstruct_actor' of github.com:ant-tech-alliance/ray …
stephanie-wang Nov 9, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ matrix:
- cd doc
- pip install -q -r requirements-doc.txt
- pip install yapf==0.23.0
- pip install pytest-timeout
- sphinx-build -W -b html -d _build/doctrees source _build/html
- cd ..
# Run Python linting, ignore dict vs {} (C408), others are defaults
Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
package org.ray.api.options;

import java.util.HashMap;
import java.util.Map;

/**
* The options for creating actor.
*/
public class ActorCreationOptions extends BaseTaskOptions {

public static final int NO_RECONSTRUCTION = 0;
public static final int INFINITE_RECONSTRUCTIONS = (int) Math.pow(2, 30);

public final int maxReconstructions;

public ActorCreationOptions() {
super();
this.maxReconstructions = NO_RECONSTRUCTION;
}

public ActorCreationOptions(Map<String, Double> resources) {
super(resources);
this.maxReconstructions = NO_RECONSTRUCTION;
}


public ActorCreationOptions(Map<String, Double> resources, int maxReconstructions) {
super(resources);
this.maxReconstructions = maxReconstructions;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ public <T> RayActor<T> createActor(RayFunc actorFactoryFunc,
TaskSpec spec = createTaskSpec(actorFactoryFunc, RayActorImpl.NIL,
args, true, options);
RayActorImpl<?> actor = new RayActorImpl(spec.returnIds[0]);
actor.setCreationDummyObjectId(spec.actorCreationId);
actor.increaseTaskCounter();
actor.setTaskCursor(spec.returnIds[0]);
rayletClient.submitTask(spec);
Expand Down Expand Up @@ -258,6 +259,11 @@ private TaskSpec createTaskSpec(RayFunc func, RayActorImpl actor, Object[] args,
actorCreationId = returnIds[0];
}

UniqueId actorCreationDummyObjectId = actor.getCreationDummyObjectId();
if (isActorCreationTask) {
actorCreationDummyObjectId = actorCreationId;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is confusing, but I think for actor creation tasks, the creation dummy object is actually set to nil.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it makes more sense to use the real dummy object id here. why set to nil?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should only be set for tasks that are going to execute on an actual actor, whereas the actor creation task actually executes on a normal worker that hasn't been assigned an actor ID yet.

}

Map<String, Double> resources;
if (null == taskOptions) {
resources = new HashMap<>();
Expand All @@ -270,13 +276,19 @@ private TaskSpec createTaskSpec(RayFunc func, RayActorImpl actor, Object[] args,
resources.put(ResourceUtil.CPU_LITERAL, 0.0);
}

int maxActorReconstruction = 0;
if (taskOptions instanceof ActorCreationOptions) {
maxActorReconstruction = ((ActorCreationOptions) taskOptions).maxReconstructions;
}
RayFunction rayFunction = functionManager.getFunction(current.driverId, func);
return new TaskSpec(
current.driverId,
taskId,
current.taskId,
-1,
actorCreationId,
actorCreationDummyObjectId,
maxActorReconstruction,
actor.getId(),
actor.getHandleId(),
actor.increaseTaskCounter(),
Expand Down
14 changes: 14 additions & 0 deletions java/runtime/src/main/java/org/ray/runtime/RayActorImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ public final class RayActorImpl<T> implements RayActor<T>, Externalizable {
* It's used to make sure ids of actor handles are unique.
*/
private int numForks;
/**
* Dummy object ID of the actor creation task.
*/
private UniqueId creationDummyObjectId;

public RayActorImpl() {
this(UniqueId.NIL, UniqueId.NIL);
Expand All @@ -43,6 +47,7 @@ public RayActorImpl(UniqueId id, UniqueId handleId) {
this.taskCounter = 0;
this.taskCursor = null;
numForks = 0;
creationDummyObjectId = UniqueId.NIL;
}

@Override
Expand All @@ -67,6 +72,13 @@ public int increaseTaskCounter() {
return taskCounter++;
}

public UniqueId getCreationDummyObjectId() {
return creationDummyObjectId;
}

public void setCreationDummyObjectId(UniqueId creationDummyObjectId) {
this.creationDummyObjectId = creationDummyObjectId;
}

private UniqueId computeNextActorHandleId() {
byte[] bytes = Sha1Digestor.digest(handleId.getBytes(), ++numForks);
Expand All @@ -78,12 +90,14 @@ public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(this.id);
out.writeObject(this.computeNextActorHandleId());
out.writeObject(this.taskCursor);
out.writeObject(this.creationDummyObjectId);
}

@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
this.id = (UniqueId) in.readObject();
this.handleId = (UniqueId) in.readObject();
this.taskCursor = (UniqueId) in.readObject();
this.creationDummyObjectId = (UniqueId) in.readObject();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ private TaskSpec createDummyTask(WorkerMode workerMode, UniqueId driverId) {
0,
UniqueId.NIL,
UniqueId.NIL,
0,
UniqueId.NIL,
UniqueId.NIL,
0,
null,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,31 +29,32 @@ public final class TaskInfo extends Table {
public String actorCreationDummyObjectId() { int o = __offset(14); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer actorCreationDummyObjectIdAsByteBuffer() { return __vector_as_bytebuffer(14, 1); }
public ByteBuffer actorCreationDummyObjectIdInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 14, 1); }
public String actorId() { int o = __offset(16); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer actorIdAsByteBuffer() { return __vector_as_bytebuffer(16, 1); }
public ByteBuffer actorIdInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 16, 1); }
public String actorHandleId() { int o = __offset(18); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer actorHandleIdAsByteBuffer() { return __vector_as_bytebuffer(18, 1); }
public ByteBuffer actorHandleIdInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 18, 1); }
public int actorCounter() { int o = __offset(20); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
public boolean isActorCheckpointMethod() { int o = __offset(22); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
public String functionId() { int o = __offset(24); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer functionIdAsByteBuffer() { return __vector_as_bytebuffer(24, 1); }
public ByteBuffer functionIdInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 24, 1); }
public int maxActorReconstructions() { int o = __offset(16); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
public String actorId() { int o = __offset(18); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer actorIdAsByteBuffer() { return __vector_as_bytebuffer(18, 1); }
public ByteBuffer actorIdInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 18, 1); }
public String actorHandleId() { int o = __offset(20); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer actorHandleIdAsByteBuffer() { return __vector_as_bytebuffer(20, 1); }
public ByteBuffer actorHandleIdInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 20, 1); }
public int actorCounter() { int o = __offset(22); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
public boolean isActorCheckpointMethod() { int o = __offset(24); return o != 0 ? 0!=bb.get(o + bb_pos) : false; }
public String functionId() { int o = __offset(26); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer functionIdAsByteBuffer() { return __vector_as_bytebuffer(26, 1); }
public ByteBuffer functionIdInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 26, 1); }
public Arg args(int j) { return args(new Arg(), j); }
public Arg args(Arg obj, int j) { int o = __offset(26); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
public int argsLength() { int o = __offset(26); return o != 0 ? __vector_len(o) : 0; }
public String returns(int j) { int o = __offset(28); return o != 0 ? __string(__vector(o) + j * 4) : null; }
public int returnsLength() { int o = __offset(28); return o != 0 ? __vector_len(o) : 0; }
public Arg args(Arg obj, int j) { int o = __offset(28); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
public int argsLength() { int o = __offset(28); return o != 0 ? __vector_len(o) : 0; }
public String returns(int j) { int o = __offset(30); return o != 0 ? __string(__vector(o) + j * 4) : null; }
public int returnsLength() { int o = __offset(30); return o != 0 ? __vector_len(o) : 0; }
public ResourcePair requiredResources(int j) { return requiredResources(new ResourcePair(), j); }
public ResourcePair requiredResources(ResourcePair obj, int j) { int o = __offset(30); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
public int requiredResourcesLength() { int o = __offset(30); return o != 0 ? __vector_len(o) : 0; }
public ResourcePair requiredResources(ResourcePair obj, int j) { int o = __offset(32); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
public int requiredResourcesLength() { int o = __offset(32); return o != 0 ? __vector_len(o) : 0; }
public ResourcePair requiredPlacementResources(int j) { return requiredPlacementResources(new ResourcePair(), j); }
public ResourcePair requiredPlacementResources(ResourcePair obj, int j) { int o = __offset(32); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
public int requiredPlacementResourcesLength() { int o = __offset(32); return o != 0 ? __vector_len(o) : 0; }
public int language() { int o = __offset(34); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
public String functionDescriptor(int j) { int o = __offset(36); return o != 0 ? __string(__vector(o) + j * 4) : null; }
public int functionDescriptorLength() { int o = __offset(36); return o != 0 ? __vector_len(o) : 0; }
public ResourcePair requiredPlacementResources(ResourcePair obj, int j) { int o = __offset(34); return o != 0 ? obj.__assign(__indirect(__vector(o) + j * 4), bb) : null; }
public int requiredPlacementResourcesLength() { int o = __offset(34); return o != 0 ? __vector_len(o) : 0; }
public int language() { int o = __offset(36); return o != 0 ? bb.getInt(o + bb_pos) : 0; }
public String functionDescriptor(int j) { int o = __offset(38); return o != 0 ? __string(__vector(o) + j * 4) : null; }
public int functionDescriptorLength() { int o = __offset(38); return o != 0 ? __vector_len(o) : 0; }

public static int createTaskInfo(FlatBufferBuilder builder,
int driver_idOffset,
Expand All @@ -62,6 +63,7 @@ public static int createTaskInfo(FlatBufferBuilder builder,
int parent_counter,
int actor_creation_idOffset,
int actor_creation_dummy_object_idOffset,
int max_actor_reconstructions,
int actor_idOffset,
int actor_handle_idOffset,
int actor_counter,
Expand All @@ -73,7 +75,7 @@ public static int createTaskInfo(FlatBufferBuilder builder,
int required_placement_resourcesOffset,
int language,
int function_descriptorOffset) {
builder.startObject(17);
builder.startObject(18);
TaskInfo.addFunctionDescriptor(builder, function_descriptorOffset);
TaskInfo.addLanguage(builder, language);
TaskInfo.addRequiredPlacementResources(builder, required_placement_resourcesOffset);
Expand All @@ -84,6 +86,7 @@ public static int createTaskInfo(FlatBufferBuilder builder,
TaskInfo.addActorCounter(builder, actor_counter);
TaskInfo.addActorHandleId(builder, actor_handle_idOffset);
TaskInfo.addActorId(builder, actor_idOffset);
TaskInfo.addMaxActorReconstructions(builder, max_actor_reconstructions);
TaskInfo.addActorCreationDummyObjectId(builder, actor_creation_dummy_object_idOffset);
TaskInfo.addActorCreationId(builder, actor_creation_idOffset);
TaskInfo.addParentCounter(builder, parent_counter);
Expand All @@ -94,32 +97,33 @@ public static int createTaskInfo(FlatBufferBuilder builder,
return TaskInfo.endTaskInfo(builder);
}

public static void startTaskInfo(FlatBufferBuilder builder) { builder.startObject(17); }
public static void startTaskInfo(FlatBufferBuilder builder) { builder.startObject(18); }
public static void addDriverId(FlatBufferBuilder builder, int driverIdOffset) { builder.addOffset(0, driverIdOffset, 0); }
public static void addTaskId(FlatBufferBuilder builder, int taskIdOffset) { builder.addOffset(1, taskIdOffset, 0); }
public static void addParentTaskId(FlatBufferBuilder builder, int parentTaskIdOffset) { builder.addOffset(2, parentTaskIdOffset, 0); }
public static void addParentCounter(FlatBufferBuilder builder, int parentCounter) { builder.addInt(3, parentCounter, 0); }
public static void addActorCreationId(FlatBufferBuilder builder, int actorCreationIdOffset) { builder.addOffset(4, actorCreationIdOffset, 0); }
public static void addActorCreationDummyObjectId(FlatBufferBuilder builder, int actorCreationDummyObjectIdOffset) { builder.addOffset(5, actorCreationDummyObjectIdOffset, 0); }
public static void addActorId(FlatBufferBuilder builder, int actorIdOffset) { builder.addOffset(6, actorIdOffset, 0); }
public static void addActorHandleId(FlatBufferBuilder builder, int actorHandleIdOffset) { builder.addOffset(7, actorHandleIdOffset, 0); }
public static void addActorCounter(FlatBufferBuilder builder, int actorCounter) { builder.addInt(8, actorCounter, 0); }
public static void addIsActorCheckpointMethod(FlatBufferBuilder builder, boolean isActorCheckpointMethod) { builder.addBoolean(9, isActorCheckpointMethod, false); }
public static void addFunctionId(FlatBufferBuilder builder, int functionIdOffset) { builder.addOffset(10, functionIdOffset, 0); }
public static void addArgs(FlatBufferBuilder builder, int argsOffset) { builder.addOffset(11, argsOffset, 0); }
public static void addMaxActorReconstructions(FlatBufferBuilder builder, int maxActorReconstructions) { builder.addInt(6, maxActorReconstructions, 0); }
public static void addActorId(FlatBufferBuilder builder, int actorIdOffset) { builder.addOffset(7, actorIdOffset, 0); }
public static void addActorHandleId(FlatBufferBuilder builder, int actorHandleIdOffset) { builder.addOffset(8, actorHandleIdOffset, 0); }
public static void addActorCounter(FlatBufferBuilder builder, int actorCounter) { builder.addInt(9, actorCounter, 0); }
public static void addIsActorCheckpointMethod(FlatBufferBuilder builder, boolean isActorCheckpointMethod) { builder.addBoolean(10, isActorCheckpointMethod, false); }
public static void addFunctionId(FlatBufferBuilder builder, int functionIdOffset) { builder.addOffset(11, functionIdOffset, 0); }
public static void addArgs(FlatBufferBuilder builder, int argsOffset) { builder.addOffset(12, argsOffset, 0); }
public static int createArgsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
public static void startArgsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
public static void addReturns(FlatBufferBuilder builder, int returnsOffset) { builder.addOffset(12, returnsOffset, 0); }
public static void addReturns(FlatBufferBuilder builder, int returnsOffset) { builder.addOffset(13, returnsOffset, 0); }
public static int createReturnsVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
public static void startReturnsVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
public static void addRequiredResources(FlatBufferBuilder builder, int requiredResourcesOffset) { builder.addOffset(13, requiredResourcesOffset, 0); }
public static void addRequiredResources(FlatBufferBuilder builder, int requiredResourcesOffset) { builder.addOffset(14, requiredResourcesOffset, 0); }
public static int createRequiredResourcesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
public static void startRequiredResourcesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
public static void addRequiredPlacementResources(FlatBufferBuilder builder, int requiredPlacementResourcesOffset) { builder.addOffset(14, requiredPlacementResourcesOffset, 0); }
public static void addRequiredPlacementResources(FlatBufferBuilder builder, int requiredPlacementResourcesOffset) { builder.addOffset(15, requiredPlacementResourcesOffset, 0); }
public static int createRequiredPlacementResourcesVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
public static void startRequiredPlacementResourcesVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
public static void addLanguage(FlatBufferBuilder builder, int language) { builder.addInt(15, language, 0); }
public static void addFunctionDescriptor(FlatBufferBuilder builder, int functionDescriptorOffset) { builder.addOffset(16, functionDescriptorOffset, 0); }
public static void addLanguage(FlatBufferBuilder builder, int language) { builder.addInt(16, language, 0); }
public static void addFunctionDescriptor(FlatBufferBuilder builder, int functionDescriptorOffset) { builder.addOffset(17, functionDescriptorOffset, 0); }
public static int createFunctionDescriptorVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); }
public static void startFunctionDescriptorVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); }
public static int endTaskInfo(FlatBufferBuilder builder) {
Expand All @@ -130,7 +134,7 @@ public static int endTaskInfo(FlatBufferBuilder builder) {
//this is manually added to avoid encoding/decoding cost as our object
//id is a byte array instead of a string
public ByteBuffer returnsAsByteBuffer(int j) {
int o = __offset(28);
int o = __offset(30);
if (o == 0) {
return null;
}
Expand Down
Loading