[xlang] Cross language serialize ActorHandle (#7134)

This commit is contained in:
fyrestone
2020-02-17 20:44:56 +08:00
committed by GitHub
parent b079787c59
commit a6b8bd47b0
27 changed files with 498 additions and 197 deletions
@@ -29,14 +29,11 @@ public abstract class NativeRayActor implements RayActor, Externalizable {
*/
byte[] actorId;
private Language language;
NativeRayActor(long nativeCoreWorkerPointer, byte[] actorId, Language language) {
NativeRayActor(long nativeCoreWorkerPointer, byte[] actorId) {
Preconditions.checkState(nativeCoreWorkerPointer != 0);
Preconditions.checkState(!ActorId.fromBytes(actorId).isNil());
this.nativeCoreWorkerPointer = nativeCoreWorkerPointer;
this.actorId = actorId;
this.language = language;
}
/**
@@ -64,7 +61,7 @@ public abstract class NativeRayActor implements RayActor, Externalizable {
}
public Language getLanguage() {
return language;
return Language.forNumber(nativeGetLanguage(nativeCoreWorkerPointer, actorId));
}
public boolean isDirectCallActor() {
@@ -73,29 +70,55 @@ public abstract class NativeRayActor implements RayActor, Externalizable {
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(nativeSerialize(nativeCoreWorkerPointer, actorId));
out.writeObject(language);
out.writeObject(toBytes());
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
nativeCoreWorkerPointer = getNativeCoreWorkerPointer();
actorId = nativeDeserialize(nativeCoreWorkerPointer, (byte[]) in.readObject());
}
/**
* Serialize this actor handle to bytes.
*
* @return the bytes of the actor handle
*/
public byte[] toBytes() {
return nativeSerialize(nativeCoreWorkerPointer, actorId);
}
/**
* Deserialize an actor handle from bytes.
*
* @return the bytes of an actor handle
*/
public static NativeRayActor fromBytes(byte[] bytes) {
long nativeCoreWorkerPointer = getNativeCoreWorkerPointer();
byte[] actorId = nativeDeserialize(nativeCoreWorkerPointer, bytes);
Language language = Language.forNumber(nativeGetLanguage(nativeCoreWorkerPointer, actorId));
Preconditions.checkNotNull(language);
return create(nativeCoreWorkerPointer, actorId, language);
}
private static long getNativeCoreWorkerPointer() {
RayRuntime runtime = Ray.internal();
if (runtime instanceof RayMultiWorkerNativeRuntime) {
runtime = ((RayMultiWorkerNativeRuntime) runtime).getCurrentRuntime();
}
Preconditions.checkState(runtime instanceof RayNativeRuntime);
nativeCoreWorkerPointer = ((RayNativeRuntime) runtime).getNativeCoreWorkerPointer();
actorId = nativeDeserialize(nativeCoreWorkerPointer, (byte[]) in.readObject());
language = (Language) in.readObject();
return ((RayNativeRuntime) runtime).getNativeCoreWorkerPointer();
}
@Override
protected void finalize() {
// TODO(zhijunfu): do we need to free the ActorHandle in core worker?
}
private static native int nativeGetLanguage(
long nativeCoreWorkerPointer, byte[] actorId);
private static native boolean nativeIsDirectCallActor(
long nativeCoreWorkerPointer, byte[] actorId);
@@ -11,7 +11,7 @@ import org.ray.runtime.generated.Common.Language;
public class NativeRayJavaActor extends NativeRayActor {
NativeRayJavaActor(long nativeCoreWorkerPointer, byte[] actorId) {
super(nativeCoreWorkerPointer, actorId, Language.JAVA);
super(nativeCoreWorkerPointer, actorId);
}
/**
@@ -12,7 +12,7 @@ import org.ray.runtime.generated.Common.Language;
public class NativeRayPyActor extends NativeRayActor implements RayPyActor {
NativeRayPyActor(long nativeCoreWorkerPointer, byte[] actorId) {
super(nativeCoreWorkerPointer, actorId, Language.PYTHON);
super(nativeCoreWorkerPointer, actorId);
}
/**