[JavaWorker] Java code lint check and binding to CI (#2225)

* add java code lint check and fix the java code lint error

* add java doc lint check and fix the java doc lint error

* add java code and doc lint to the CI
This commit is contained in:
Yujie Liu
2018-06-10 07:26:54 +08:00
committed by Philipp Moritz
parent 5789a247f9
commit 3b5e700fd7
158 changed files with 3805 additions and 3325 deletions
+32 -32
View File
@@ -1,40 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.ray.parent</groupId>
<artifactId>ray-superpom</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>org.ray.parent</groupId>
<artifactId>ray-superpom</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.ray</groupId>
<artifactId>ray-common</artifactId>
<name>java common and util for ray</name>
<description>java common and util for ray</description>
<url></url>
<groupId>org.ray</groupId>
<artifactId>ray-common</artifactId>
<name>java common and util for ray</name>
<description>java common and util for ray</description>
<url></url>
<packaging>jar</packaging>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.ini4j</groupId>
<artifactId>ini4j</artifactId>
<version>0.5.2</version>
</dependency>
</dependencies>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>quartz</groupId>
<artifactId>quartz</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.ini4j</groupId>
<artifactId>ini4j</artifactId>
<version>0.5.2</version>
</dependency>
</dependencies>
</project>
@@ -3,14 +3,14 @@ package org.ray.util;
import java.util.Random;
/**
* Common utilities
* Common utilities.
*/
public class CommonUtil {
private static final Random seed = new Random();
/**
* Get random number between 0 and (max-1)
* Get random number between 0 and (max-1).
*/
public static int getRandom(int max) {
return Math.abs(seed.nextInt() % max);
@@ -53,10 +53,8 @@ public class NetworkUtil {
ds.setReuseAddress(true);
return true;
} catch (IOException ignored) {
/* should not be thrown */
return false;
}
/* should not be thrown */
return false;
}
}
@@ -7,7 +7,8 @@ public class ObjectUtil {
public static <T> T newObject(Class<T> cls) {
try {
return cls.getConstructor().newInstance();
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
} catch (InstantiationException | IllegalAccessException | NoSuchMethodException
| InvocationTargetException e) {
e.printStackTrace();
return null;
}
@@ -6,29 +6,15 @@ import java.util.Vector;
public class StringUtil {
// Holds the start of an element and which brace started it.
private static class Start {
// The brace number from the braces string in use.
final int brace;
// The position in the string it was seen.
final int pos;
// Constructor.
public Start(int brace, int pos) {
this.brace = brace;
this.pos = pos;
}
}
/**
* @param s input string
* split.
* @param s input string
* @param splitters common splitters
* @param open open braces
* @param close close braces
* @param open open braces
* @param close close braces
* @return output array list
*/
public static Vector<String> Split(String s, String splitters, String open, String close) {
public static Vector<String> split(String s, String splitters, String open, String close) {
// The splits.
Vector<String> split = new Vector<>();
// The stack.
@@ -130,5 +116,20 @@ public class StringUtil {
}
return objs.length == 0 ? "" : sb.substring(0, sb.length() - concatenator.length());
}
// Holds the start of an element and which brace started it.
private static class Start {
// The brace number from the braces string in use.
final int brace;
// The position in the string it was seen.
final int pos;
// Constructor.
public Start(int brace, int pos) {
this.brace = brace;
this.pos = pos;
}
}
}
@@ -6,10 +6,13 @@ import java.util.concurrent.locks.ReentrantLock;
import org.ray.util.logger.RayLog;
/**
* some utilities for system process
* some utilities for system process.
*/
public class SystemUtil {
static final ReentrantLock pidlock = new ReentrantLock();
static Integer pid;
public static String userHome() {
return System.getProperty("user.home");
}
@@ -36,9 +39,6 @@ public class SystemUtil {
}
}
static Integer pid;
static final ReentrantLock pidlock = new ReentrantLock();
public static int pid() {
if (pid == null) {
pidlock.lock();
@@ -13,24 +13,24 @@ import java.lang.annotation.Target;
public @interface AConfig {
/**
* comments for this configuration field
* comments for this configuration field.
*/
String comment();
/**
* when the config is an array list, a splitter set is specified, e.g., " \t" to use ' ' and '\t'
* as possible splits
* as possible splits.
*/
String splitters() default ", \t";
/**
* indirect with value as the new section name, the field name remains the same
* indirect with value as the new section name, the field name remains the same.
*/
String defaultIndirectSectionName() default "";
/**
* see ConfigReader.getIndirectStringArray this config tells which is the default
* indirectSectionName in that function
* indirectSectionName in that function.
*/
String defaultArrayIndirectSectionName() default "";
}
@@ -43,10 +43,6 @@ public class ConfigReader {
}
public String filePath() {
return file;
}
private void loadConfigFile(String filePath) throws Exception {
this.currentUseConfig.filePath = filePath;
@@ -106,46 +102,16 @@ public class ConfigReader {
}
}
public String filePath() {
return file;
}
public CurrentUseConfig getCurrentUseConfig() {
return currentUseConfig;
}
private synchronized <T> String getOriValue(String sectionKey, String configKey, T defaultValue,
String deptr) {
if (null == deptr) {
throw new RuntimeException("desc must not be empty of the key:" + configKey);
}
Profile.Section section = ini.get(sectionKey);
String oriValue = null;
if (section != null && section.containsKey(configKey)) {
oriValue = section.get(configKey);
}
if (!currentUseConfig.sectionMap.containsKey(sectionKey)) {
ConfigSection configSection = new ConfigSection();
configSection.sectionKey = sectionKey;
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
currentUseConfig.sectionMap.put(sectionKey, configSection);
} else if (!currentUseConfig.sectionMap.get(sectionKey).itemMap.containsKey(configKey)) {
ConfigSection configSection = currentUseConfig.sectionMap.get(sectionKey);
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
}
return oriValue;
}
private <T> void updateConfigSection(ConfigSection configSection, String configKey,
T defaultValue, String deptr, String oriValue) {
ConfigItem<T> configItem = new ConfigItem<>();
configItem.defaultValue = defaultValue;
configItem.key = configKey;
configItem.oriValue = oriValue;
configItem.desc = deptr;
configSection.itemMap.put(configKey, configItem);
}
public String getStringValue(String sectionKey, String configKey, String defaultValue,
String dsptr) {
String dsptr) {
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
if (value != null) {
return value;
@@ -155,7 +121,7 @@ public class ConfigReader {
}
public boolean getBooleanValue(String sectionKey, String configKey, boolean defaultValue,
String dsptr) {
String dsptr) {
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
if (value != null) {
if (value.length() == 0) {
@@ -181,6 +147,39 @@ public class ConfigReader {
}
}
private synchronized <T> String getOriValue(String sectionKey, String configKey, T defaultValue,
String deptr) {
if (null == deptr) {
throw new RuntimeException("desc must not be empty of the key:" + configKey);
}
Profile.Section section = ini.get(sectionKey);
String oriValue = null;
if (section != null && section.containsKey(configKey)) {
oriValue = section.get(configKey);
}
if (!currentUseConfig.sectionMap.containsKey(sectionKey)) {
ConfigSection configSection = new ConfigSection();
configSection.sectionKey = sectionKey;
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
currentUseConfig.sectionMap.put(sectionKey, configSection);
} else if (!currentUseConfig.sectionMap.get(sectionKey).itemMap.containsKey(configKey)) {
ConfigSection configSection = currentUseConfig.sectionMap.get(sectionKey);
updateConfigSection(configSection, configKey, defaultValue, deptr, oriValue);
}
return oriValue;
}
private <T> void updateConfigSection(ConfigSection configSection, String configKey,
T defaultValue, String deptr, String oriValue) {
ConfigItem<T> configItem = new ConfigItem<>();
configItem.defaultValue = defaultValue;
configItem.key = configKey;
configItem.oriValue = oriValue;
configItem.desc = deptr;
configSection.itemMap.put(configKey, configItem);
}
public long getLongValue(String sectionKey, String configKey, long defaultValue, String dsptr) {
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
if (value != null) {
@@ -195,7 +194,7 @@ public class ConfigReader {
}
public double getDoubleValue(String sectionKey, String configKey, double defaultValue,
String dsptr) {
String dsptr) {
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
if (value != null) {
if (value.length() == 0) {
@@ -210,7 +209,7 @@ public class ConfigReader {
public int[] getIntegerArray(String sectionKey, String configKey, int[] defaultValue,
String dsptr) {
String dsptr) {
String value = getOriValue(sectionKey, configKey, defaultValue, dsptr);
int[] array = defaultValue;
if (value != null) {
@@ -226,24 +225,22 @@ public class ConfigReader {
/**
* get a string list from a whole section as keys e.g., [core] data_dirs = local.dirs # or
* cluster.dirs
*
* [local.dirs] /home/xxx/1 /home/yyy/2
*
* [cluster.dirs] ...
*
* @param sectionKey e.g., core
* @param configKey e.g., data_dirs
* @param sectionKey e.g., core
* @param configKey e.g., data_dirs
* @param indirectSectionName e.g., cluster.dirs
* @return string list
*/
public String[] getIndirectStringArray(String sectionKey, String configKey,
String indirectSectionName, String dsptr) {
String indirectSectionName, String dsptr) {
String s = getStringValue(sectionKey, configKey, indirectSectionName, dsptr);
Profile.Section section = ini.get(s);
if (section == null) {
return new String[]{};
return new String[] {};
} else {
return section.keySet().toArray(new String[]{});
return section.keySet().toArray(new String[] {});
}
}
@@ -326,8 +323,9 @@ public class ConfigReader {
String sv = getStringValue(section, fld.getName(), defaultFldValue.toString(), comment);
Object v;
try {
v = fld.getType().getConstructor(new Class<?>[]{String.class}).newInstance(sv);
} catch (NoSuchMethodException | SecurityException | InstantiationException | InvocationTargetException e) {
v = fld.getType().getConstructor(new Class<?>[] {String.class}).newInstance(sv);
} catch (NoSuchMethodException | SecurityException | InstantiationException
| InvocationTargetException e) {
System.err.println(
section + "." + fld.getName() + "'s format (" + sv + ") is invalid, default to "
+ defaultFldValue.toString());
@@ -340,7 +338,7 @@ public class ConfigReader {
if (null == ss) {
fld.set(obj, defaultFldValue);
} else {
Vector<String> ls = StringUtil.Split(ss, splitters, "", "");
Vector<String> ls = StringUtil.split(ss, splitters, "", "");
if (ccls.equals(boolean.class)) {
boolean[] v = ObjectUtil
.toBooleanArray(ls.stream().map(Boolean::parseBoolean).toArray());
@@ -357,7 +355,7 @@ public class ConfigReader {
} else if (ccls.equals(String.class)) {
String[] v;
if (StringUtil.isNullOrEmpty(defaultArrayIndirectSectionName)) {
v = ls.toArray(new String[]{});
v = ls.toArray(new String[] {});
} else {
v = this
.getIndirectStringArray(section, fld.getName(),
@@ -8,7 +8,6 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class ConfigSection {
public String sectionKey;
public final Map<String, ConfigItem<?>> itemMap = new ConcurrentHashMap<>();
public String sectionKey;
}
@@ -9,8 +9,7 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class CurrentUseConfig {
public final Map<String, ConfigSection> sectionMap = new ConcurrentHashMap<>();
public String filePath;
public final Map<String, ConfigSection> sectionMap = new ConcurrentHashMap<>();
}
@@ -9,20 +9,8 @@ import java.util.List;
*/
public class Composition {
public static class TR {
public final int Tcount;
public final int Rcount;
public TR(int tcount, int rcount) {
super();
Tcount = tcount;
Rcount = rcount;
}
}
public static List<TR> calculate(int maxT, int maxR) {
List<TR> ret = new ArrayList<>();
public static List<Tr> calculate(int maxT, int maxR) {
List<Tr> ret = new ArrayList<>();
for (int t = 0; t <= maxT; t++) {
// <= 0 for dynamic return count
@@ -30,9 +18,21 @@ public class Composition {
// -1 for call_n returns RayObject<>[N]
for (int r = -1; r <= maxR; r++) {
ret.add(new TR(t, r));
ret.add(new Tr(t, r));
}
}
return ret;
}
public static class Tr {
public final int tcount;
public final int rcount;
public Tr(int tcount, int rcount) {
super();
this.tcount = tcount;
this.rcount = rcount;
}
}
}
@@ -2,7 +2,7 @@ package org.ray.util.generator;
import java.io.IOException;
import org.ray.util.FileUtil;
import org.ray.util.generator.Composition.TR;
import org.ray.util.generator.Composition.Tr;
/**
* Generate all classes in org.ray.api.funcs
@@ -16,10 +16,10 @@ public class FuncsGenerator {
}
private static void generate(String rootdir) throws IOException {
for (TR tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
String str = build(tr.Tcount, tr.Rcount);
String file = rootdir + "/RayFunc_" + tr.Tcount + "_"
+ (tr.Rcount <= 0 ? (tr.Rcount == 0 ? "n" : "n_list") : tr.Rcount) + ".java";
for (Tr tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
String str = build(tr.tcount, tr.rcount);
String file = rootdir + "/RayFunc_" + tr.tcount + "_"
+ (tr.rcount <= 0 ? (tr.rcount == 0 ? "n" : "n_list") : tr.rcount) + ".java";
FileUtil.overrideFile(file, str);
System.err.println("override " + file);
}
@@ -34,20 +34,21 @@ public class FuncsGenerator {
*
* public static <R0> R0 execute(Object[] args) throws Throwable { String name =
* (String)args[args.length - 2]; assert (name.equals(RayFunc_0_1.class.getName())); byte[]
* funcBytes = (byte[])args[args.length - 1]; RayFunc_0_1<R0> f = (RayFunc_0_1<R0>)SerializationUtils.deserialize(funcBytes);
* funcBytes = (byte[])args[args.length - 1]; RayFunc_0_1<R0> f = (RayFunc_0_1<R0>)
* SerializationUtils.deserialize(funcBytes);
* return f.apply(); } }
*/
private static String build(int Tcount, int Rcount) {
private static String build(int tcount, int rcount) {
StringBuilder sb = new StringBuilder();
String tname =
"Ray" + "Func_" + Tcount + "_" + (Rcount <= 0 ? (Rcount == 0 ? "n" : "n_list") : Rcount);
String gname = tname + "<" + Share.buildClassDeclare(Tcount, Rcount) + ">";
"Ray" + "Func_" + tcount + "_" + (rcount <= 0 ? (rcount == 0 ? "n" : "n_list") : rcount);
final String gname = tname + "<" + Share.buildClassDeclare(tcount, rcount) + ">";
sb.append("package org.ray.api.funcs;").append("\n");
if (Rcount > 1) {
if (rcount > 1) {
sb.append("import org.ray.api.returns.*;").append("\n");
}
if (Rcount <= 0) {
if (rcount <= 0) {
sb.append("import java.util.Collection;").append("\n");
sb.append("import java.util.List;").append("\n");
sb.append("import java.util.Map;").append("\n");
@@ -60,14 +61,14 @@ public class FuncsGenerator {
sb.append("@FunctionalInterface").append("\n");
sb.append("public interface ").append(gname).append(" extends RayFunc {")
.append("\n");
sb.append("\t").append(Share.buildFuncReturn(Rcount)).append(" apply(")
.append(Rcount == 0 ? ("Collection<RID> returnids" + (Tcount > 0 ? ", " : "")) : "")
.append(Share.buildParameter(Tcount, "T", null)).append(") throws Throwable;")
sb.append("\t").append(Share.buildFuncReturn(rcount)).append(" apply(")
.append(rcount == 0 ? ("Collection<RID> returnids" + (tcount > 0 ? ", " : "")) : "")
.append(Share.buildParameter(tcount, "T", null)).append(") throws Throwable;")
.append("\n");
sb.append("\t\n");
sb.append("\tpublic static " + "<").append(Share.buildClassDeclare(Tcount, Rcount))
.append(">").append(" ").append(Share.buildFuncReturn(Rcount))
sb.append("\tpublic static " + "<").append(Share.buildClassDeclare(tcount, rcount))
.append(">").append(" ").append(Share.buildFuncReturn(rcount))
.append(" execute(Object[] args) throws Throwable {").append("\n");
sb.append("\t\tString name = (String)args[args.length - 2];").append("\n");
sb.append("\t\tassert (name.equals(").append(tname).append(".class.getName()));").append("\n");
@@ -75,8 +76,8 @@ public class FuncsGenerator {
sb.append("\t\t").append(gname).append(" f = SerializationUtils.deserialize(funcBytes);")
.append("\n");
sb.append("\t\treturn f.apply(")
.append(Rcount == 0 ? ("(Collection<RID>)args[0]" + (Tcount > 0 ? ", " : "")) : "")
.append(Share.buildParameterUse2(Tcount, Rcount == 0 ? 1 : 0, "T", "args[", "]"))
.append(rcount == 0 ? ("(Collection<RID>)args[0]" + (tcount > 0 ? ", " : "")) : "")
.append(Share.buildParameterUse2(tcount, rcount == 0 ? 1 : 0, "T", "args[", "]"))
.append(");").append("\n");
sb.append("\t}").append("\n");
sb.append("\t\n");
@@ -20,35 +20,25 @@ public class MultipleReturnGenerator {
}
/**
* package org.ray.api.returns;
*
* public class MultipleReturns2<R0, R1> extends MultipleReturns {
*
* public MultipleReturns2(R0 r0, R1 r1) { super(new Object[] { r0, r1 }); }
*
* public R0 get0() { return (R0) this.values[0]; }
*
* public R1 get1() { return (R1) this.values[1]; }
*
* }
* package org.ray.api.returns.
*/
private static String build(int Rcount) {
private static String build(int rcount) {
StringBuilder sb = new StringBuilder();
sb.append("package org.ray.api.returns;").append("\n");
sb.append("import org.ray.api.*;").append("\n");
sb.append("@SuppressWarnings(\"unchecked\")");
sb.append("public class MultipleReturns").append(Rcount).append("<")
.append(Share.buildClassDeclare(0, Rcount)).append("> extends MultipleReturns {")
sb.append("public class MultipleReturns").append(rcount).append("<")
.append(Share.buildClassDeclare(0, rcount)).append("> extends MultipleReturns {")
.append("\n");
sb.append("\tpublic MultipleReturns").append(Rcount).append("(")
.append(Share.buildParameter(Rcount, "R", null)).append(") {")
sb.append("\tpublic MultipleReturns").append(rcount).append("(")
.append(Share.buildParameter(rcount, "R", null)).append(") {")
.append("\n");
sb.append("\t\tsuper(new Object[] { ").append(Share.buildParameterUse(Rcount, "R"))
sb.append("\t\tsuper(new Object[] { ").append(Share.buildParameterUse(rcount, "R"))
.append(" });")
.append("\n");
sb.append("\t}").append("\n");
for (int k = 0; k < Rcount; k++) {
for (int k = 0; k < rcount; k++) {
sb.append(buildGetter(k));
}
@@ -35,23 +35,23 @@ public class RayObjectsGenerator {
*
* public RayObject<R1> r1() { return objs[1]; } }
*/
private static String build(int Rcount) {
private static String build(int rcount) {
StringBuilder sb = new StringBuilder();
sb.append("package org.ray.api.returns;\n");
sb.append("import org.ray.api.*;\n");
sb.append("import org.ray.spi.model.UniqueID;\n");
sb.append("@SuppressWarnings({\"rawtypes\", \"unchecked\"})");
sb.append("public class RayObjects").append(Rcount).append("<")
.append(Share.buildClassDeclare(0, Rcount)).append("> extends RayObjects {")
sb.append("public class RayObjects").append(rcount).append("<")
.append(Share.buildClassDeclare(0, rcount)).append("> extends RayObjects {")
.append("\n");
sb.append("\tpublic RayObjects").append(Rcount).append("(UniqueID[] ids) {").append("\n");
sb.append("\tpublic RayObjects").append(rcount).append("(UniqueID[] ids) {").append("\n");
sb.append("\t\tsuper(ids);").append("\n");
sb.append("\t}").append("\n");
sb.append("\tpublic RayObjects").append(Rcount).append("(RayObject objs[]) {").append("\n");
sb.append("\tpublic RayObjects").append(rcount).append("(RayObject objs[]) {").append("\n");
sb.append("\t\tsuper(objs);").append("\n");
sb.append("\t}").append("\n");
for (int k = 0; k < Rcount; k++) {
for (int k = 0; k < rcount; k++) {
sb.append(buildGetter(k));
}
@@ -59,9 +59,6 @@ public class RayObjectsGenerator {
return sb.toString();
}
/**
* public RayObject<R0> r0() { return objs[0]; }
*/
private static String buildGetter(int index) {
return "\tpublic RayObject<R" + index + "> r" + index + "() {\n"
+ "\t\treturn objs[" + index + "];\n"
@@ -4,7 +4,7 @@ import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.ray.util.FileUtil;
import org.ray.util.generator.Composition.TR;
import org.ray.util.generator.Composition.Tr;
/**
* Generate Rpc.java
@@ -29,90 +29,75 @@ public class RpcGenerator {
sb.append("@SuppressWarnings({\"rawtypes\", \"unchecked\"})\n");
sb.append("class Rpc {\n");
for (TR tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
buildCall(sb, tr.Tcount, tr.Rcount);
for (Tr tr : Composition.calculate(Share.MAX_T, Share.MAX_R)) {
buildCall(sb, tr.tcount, tr.rcount);
}
sb.append("}\n");
return sb.toString();
}
private static void buildCall(StringBuilder sb, int Tcount, int Rcount) {
for (Set<Integer> whichTisFuture : whichTisFutureComposition(Tcount)) {
sb.append(buildCall(Tcount, Rcount, whichTisFuture));
private static void buildCall(StringBuilder sb, int tcount, int rcount) {
for (Set<Integer> whichTisFuture : whichTisFutureComposition(tcount)) {
sb.append(buildCall(tcount, rcount, whichTisFuture));
}
}
/**
* public static <T0, R0> RayObject<R0> call(RayFunc_1_1<T0, R0> f, RayObject<T0> arg) { return
* Ray.runtime().rpc(() -> f.apply(null), arg).objs[0]; }
*/
private static String buildCall(int Tcount, int Rcount, Set<Integer> whichTisFuture) {
private static String buildCall(int tcount, int rcount, Set<Integer> whichTisFuture) {
StringBuilder sb = new StringBuilder();
String parameter = (Tcount == 0 ? ""
: ", " + Share.buildParameter(Tcount, "T", whichTisFuture));
sb.append("\tpublic static <").append(Share.buildClassDeclare(Tcount, Rcount)).append("> ")
.append(Share.buildRpcReturn(Rcount)).append(" call")
.append(Rcount == 1 ? "" : (Rcount <= 0 ? "_n" : ("_" + Rcount))).append("(RayFunc_")
.append(Tcount).append("_")
.append(Rcount <= 0 ? (Rcount == 0 ? "n" : "n_list") : Rcount).append("<")
.append(Share.buildClassDeclare(Tcount, Rcount)).append("> f").append(
Rcount <= 0 ? (Rcount == 0 ? ", Collection<RID> returnids" : ", Integer returnCount")
String parameter = (tcount == 0 ? ""
: ", " + Share.buildParameter(tcount, "T", whichTisFuture));
sb.append("\tpublic static <").append(Share.buildClassDeclare(tcount, rcount)).append("> ")
.append(Share.buildRpcReturn(rcount)).append(" call")
.append(rcount == 1 ? "" : (rcount <= 0 ? "_n" : ("_" + rcount))).append("(RayFunc_")
.append(tcount).append("_")
.append(rcount <= 0 ? (rcount == 0 ? "n" : "n_list") : rcount).append("<")
.append(Share.buildClassDeclare(tcount, rcount)).append("> f").append(
rcount <= 0 ? (rcount == 0 ? ", Collection<RID> returnids" : ", Integer returnCount")
: "").append(parameter).append(") {\n");
/*
* public static <R0> RayObject<R0> call(RayFunc_0_1<R0> f) {
if (Ray.Parameters().remoteLambda()) {
return Ray.internal().call(RayFunc_0_1.class, f, 1).objs[0];
}
else {
return Ray.internal().call(() -> f.apply(), 1).objs[0];
}
}
*/
String nulls = Share.buildRepeat("null",
Tcount + (Rcount == 0 ? 1/*for first arg map*/ : 0));
String parameterUse = (Tcount == 0 ? "" : (", " + Share.buildParameterUse(Tcount, "T")));
tcount + (rcount == 0 ? 1/*for first arg map*/ : 0));
String parameterUse = (tcount == 0 ? "" : (", " + Share.buildParameterUse(tcount, "T")));
String labmdaUse = "RayFunc_"
+ Tcount + "_" + (Rcount <= 0 ? (Rcount == 0 ? "n" : "n_list") : Rcount)
+ tcount + "_" + (rcount <= 0 ? (rcount == 0 ? "n" : "n_list") : rcount)
+ ".class, f";
sb.append("\t\tif (Ray.Parameters().remoteLambda()) {\n");
if (Rcount == 1) {
if (rcount == 1) {
sb.append("\t\t\treturn Ray.internal().call(null, ").append(labmdaUse).append(", 1")
.append(parameterUse).append(").objs[0];")
.append("\n");
} else if (Rcount == 0) {
} else if (rcount == 0) {
sb.append("\t\t\treturn Ray.internal().callWithReturnLabels(null, ")
.append(labmdaUse).append(", returnids").append(parameterUse).append(");")
.append("\n");
} else if (Rcount < 0) {
} else if (rcount < 0) {
sb.append("\t\t\treturn Ray.internal().callWithReturnIndices(null, ")
.append(labmdaUse).append(", returnCount").append(parameterUse).append(");")
.append("\n");
} else {
sb.append("\t\t\treturn new RayObjects").append(Rcount)
.append("(Ray.internal().call(null, ").append(labmdaUse).append(", ").append(Rcount)
sb.append("\t\t\treturn new RayObjects").append(rcount)
.append("(Ray.internal().call(null, ").append(labmdaUse).append(", ").append(rcount)
.append(parameterUse).append(").objs);")
.append("\n");
}
sb.append("\t\t} else {\n");
if (Rcount == 1) {
if (rcount == 1) {
sb.append("\t\t\treturn Ray.internal().call(null, () -> f.apply(").append(nulls)
.append("), 1").append(parameterUse).append(").objs[0];")
.append("\n");
} else if (Rcount == 0) {
} else if (rcount == 0) {
sb.append("\t\t\treturn Ray.internal().callWithReturnLabels(null, () -> f.apply(")
.append(nulls).append("), returnids").append(parameterUse).append(");")
.append("\n");
} else if (Rcount < 0) {
} else if (rcount < 0) {
sb.append("\t\t\treturn Ray.internal().callWithReturnIndices(null, () -> f.apply(")
.append(nulls).append("), returnCount").append(parameterUse).append(");")
.append("\n");
} else {
sb.append("\t\t\treturn new RayObjects").append(Rcount)
sb.append("\t\t\treturn new RayObjects").append(rcount)
.append("(Ray.internal().call(null, () -> f.apply(").append(nulls).append("), ")
.append(Rcount).append(parameterUse).append(").objs);")
.append(rcount).append(parameterUse).append(").objs);")
.append("\n");
}
sb.append("\t\t}\n");
@@ -120,34 +105,34 @@ public class RpcGenerator {
return sb.toString();
}
private static Set<Set<Integer>> whichTisFutureComposition(int Tcount) {
private static Set<Set<Integer>> whichTisFutureComposition(int tcount) {
Set<Set<Integer>> ret = new HashSet<>();
Set<Integer> N = new HashSet<>();
for (int k = 0; k < Tcount; k++) {
N.add(k);
Set<Integer> n = new HashSet<>();
for (int k = 0; k < tcount; k++) {
n.add(k);
}
for (int k = 0; k <= Tcount; k++) {
ret.addAll(CNn(N, k));
for (int k = 0; k <= tcount; k++) {
ret.addAll(cnn(n, k));
}
return ret;
}
//pick n numbers in N
private static Set<Set<Integer>> CNn(Set<Integer> N, int n) {
private static Set<Set<Integer>> cnn(Set<Integer> bigN, int n) {
C c = new C();
for (int k = 0; k < n; k++) {
c.mul(N);
c.mul(bigN);
}
return c.v;
return c.vc;
}
static class C {
Set<Set<Integer>> v;
Set<Set<Integer>> vc;
public C() {
v = new HashSet<>();
v.add(new HashSet<>());
vc = new HashSet<>();
vc.add(new HashSet<>());
}
void mul(Set<Integer> ns) {
@@ -155,12 +140,12 @@ public class RpcGenerator {
for (int n : ns) {
ret.addAll(mul(n));
}
this.v = ret;
this.vc = ret;
}
Set<Set<Integer>> mul(int n) {
Set<Set<Integer>> ret = new HashSet<>();
for (Set<Integer> s : v) {
for (Set<Integer> s : vc) {
if (s.contains(n)) {
continue;
}
@@ -3,7 +3,7 @@ package org.ray.util.generator;
import java.util.Set;
/**
* Share util for generators
* Share util for generators.
*/
public class Share {
@@ -11,20 +11,20 @@ public class Share {
public static final int MAX_R = 4;
/**
* T0, T1, T2, T3, R
* T0, T1, T2, T3, R.
*/
public static String buildClassDeclare(int Tcount, int Rcount) {
public static String buildClassDeclare(int tcount, int rcount) {
StringBuilder sb = new StringBuilder();
for (int k = 0; k < Tcount; k++) {
for (int k = 0; k < tcount; k++) {
sb.append("T").append(k).append(", ");
}
if (Rcount == 0) {
if (rcount == 0) {
sb.append("R, RID");
} else if (Rcount < 0) {
assert (Rcount == -1);
} else if (rcount < 0) {
assert (rcount == -1);
sb.append("R");
} else {
for (int k = 0; k < Rcount; k++) {
for (int k = 0; k < rcount; k++) {
sb.append("R").append(k).append(", ");
}
sb.deleteCharAt(sb.length() - 1);
@@ -34,16 +34,16 @@ public class Share {
}
/**
* T0 t0, T1 t1, T2 t2, T3 t3
* T0 t0, T1 t1, T2 t2, T3 t3.
*/
public static String buildParameter(int Tcount, String TR, Set<Integer> whichTisFuture) {
public static String buildParameter(int tcount, String tr, Set<Integer> whichTisFuture) {
StringBuilder sb = new StringBuilder();
for (int k = 0; k < Tcount; k++) {
for (int k = 0; k < tcount; k++) {
sb.append(whichTisFuture != null && whichTisFuture.contains(k)
? "RayObject<" + (TR + k) + ">" : (TR + k)).append(" ").append(TR.toLowerCase())
? "RayObject<" + (tr + k) + ">" : (tr + k)).append(" ").append(tr.toLowerCase())
.append(k).append(", ");
}
if (Tcount > 0) {
if (tcount > 0) {
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
}
@@ -51,77 +51,72 @@ public class Share {
}
/**
* t0, t1, t2
* t0, t1, t2.
*/
public static String buildParameterUse(int Tcount, String TR) {
public static String buildParameterUse(int tcount, String tr) {
StringBuilder sb = new StringBuilder();
for (int k = 0; k < Tcount; k++) {
sb.append(TR.toLowerCase()).append(k).append(", ");
for (int k = 0; k < tcount; k++) {
sb.append(tr.toLowerCase()).append(k).append(", ");
}
if (Tcount > 0) {
if (tcount > 0) {
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
public static String buildParameterUse2(int Tcount, int startIndex, String TR, String pre,
String post) {
public static String buildParameterUse2(int tcount, int startIndex, String tr, String pre,
String post) {
StringBuilder sb = new StringBuilder();
for (int k = 0; k < Tcount; k++) {
sb.append("(").append(TR).append(k).append(")").append(pre).append(k + startIndex)
for (int k = 0; k < tcount; k++) {
sb.append("(").append(tr).append(k).append(")").append(pre).append(k + startIndex)
.append(post).append(", ");
}
if (Tcount > 0) {
if (tcount > 0) {
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
/**
* MultipleReturns2<R0, R1> apply(); R0
*/
public static String buildFuncReturn(int Rcount) {
if (Rcount == 0) {
public static String buildFuncReturn(int rcount) {
if (rcount == 0) {
return "Map<RID, R>";
} else if (Rcount < 0) {
assert (-1 == Rcount);
} else if (rcount < 0) {
assert (-1 == rcount);
return "List<R>";
}
if (Rcount == 1) {
if (rcount == 1) {
return "R0";
}
StringBuilder sb = new StringBuilder();
for (int k = 0; k < Rcount; k++) {
for (int k = 0; k < rcount; k++) {
sb.append("R").append(k).append(", ");
}
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
return "MultipleReturns" + Rcount + "<" + sb.toString() + ">";
return "MultipleReturns" + rcount + "<" + sb.toString() + ">";
}
/**
*/
public static String buildRpcReturn(int Rcount) {
if (Rcount == 0) {
public static String buildRpcReturn(int rcount) {
if (rcount == 0) {
return "RayMap<RID, R>";
} else if (Rcount < 0) {
assert (Rcount == -1);
} else if (rcount < 0) {
assert (rcount == -1);
return "RayList<R>";
}
if (Rcount == 1) {
if (rcount == 1) {
return "RayObject<R0>";
}
StringBuilder sb = new StringBuilder();
for (int k = 0; k < Rcount; k++) {
for (int k = 0; k < rcount; k++) {
sb.append("R").append(k).append(", ");
}
sb.deleteCharAt(sb.length() - 1);
sb.deleteCharAt(sb.length() - 1);
return "RayObjects" + Rcount + "<" + sb.toString() + ">";
return "RayObjects" + rcount + "<" + sb.toString() + ">";
}
@@ -3,7 +3,7 @@ package org.ray.util.logger;
import org.apache.log4j.Logger;
/**
* A logger which prints output to console
* A logger which prints output to console.
*/
public class ConsoleLogger extends Logger {
@@ -14,21 +14,6 @@ public class ConsoleLogger extends Logger {
this.realLogger = realLogger;
}
@Override
public void info(Object log) {
realLogger.info("(" + this.getName() + ") " + log);
}
@Override
public void warn(Object log) {
realLogger.warn("(" + this.getName() + ") " + log);
}
@Override
public void warn(Object log, Throwable e) {
realLogger.warn("(" + this.getName() + ") " + log, e);
}
@Override
public void debug(Object log) {
realLogger.debug("(" + this.getName() + ") " + log);
@@ -43,4 +28,19 @@ public class ConsoleLogger extends Logger {
public void error(Object log, Throwable e) {
realLogger.error("(" + this.getName() + ") " + log, e);
}
@Override
public void info(Object log) {
realLogger.info("(" + this.getName() + ") " + log);
}
@Override
public void warn(Object log) {
realLogger.warn("(" + this.getName() + ") " + log);
}
@Override
public void warn(Object log, Throwable e) {
realLogger.warn("(" + this.getName() + ") " + log, e);
}
}
@@ -7,7 +7,7 @@ import org.apache.log4j.Logger;
import org.ray.util.CommonUtil;
/**
* Dynamic logger without properties configuration file
* Dynamic logger without properties configuration file.
*/
public class DynamicLog {
@@ -16,12 +16,11 @@ public class DynamicLog {
private static LogLevel logLevel = LogLevel.DEBUG;
private static Boolean logLevelSetFlag = false;
private static Map<String/*Samplekey*/, SampleStatis> sampleStatis = new ConcurrentHashMap<>();
private final String key;
/**
* set the context prefix for all logs
*/
public static void setContextPrefix(String prefix) {
PREFIX.set(prefix);
private DynamicLog(String key) {
this.key = key;
}
public static String getContextPrefix() {
@@ -29,7 +28,14 @@ public class DynamicLog {
}
/**
* set the level for all logs
* set the context prefix for all logs.
*/
public static void setContextPrefix(String prefix) {
PREFIX.set(prefix);
}
/**
* set the level for all logs.
*/
public static void setLogLevel(String level) {
if (logLevelSetFlag) { /* one shot, avoid the risk of multithreading */
@@ -39,13 +45,17 @@ public class DynamicLog {
logLevel = LogLevel.of(level);
}
private static LogLevel getenumLogLevel() {
return logLevel;
public static DynamicLog registerName(String name) {
return DynamicLogNameRegister.registerName(name);
}
public static Collection<DynamicLog> values() {
return DynamicLogNameRegister.names.values();
}
@Override
public String toString() {
return this.getKey();
public int hashCode() {
return this.toString().hashCode();
}
@Override
@@ -54,12 +64,31 @@ public class DynamicLog {
}
@Override
public int hashCode() {
return this.toString().hashCode();
public String toString() {
return this.getKey();
}
public String getKey() {
return this.key;
}
public void debug(String log) {
if (!getenumLogLevel().needLog(LogLevel.DEBUG)) {
return;
}
log = wrap("debug", log);
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.debug(log);
}
}
private static LogLevel getenumLogLevel() {
return logLevel;
}
private String wrap(String level, String log) {
StackTraceElement stes[] = Thread.currentThread().getStackTrace();
StackTraceElement[] stes = Thread.currentThread().getStackTrace();
String ret = "[" + level + "]" + "[" + stes[3].getFileName() + ":" + stes[3].getLineNumber()
+ "] - " + (log == null ? "" : log);
String prefix = PREFIX.get();
@@ -69,23 +98,12 @@ public class DynamicLog {
return ret;
}
public void debug(String log) {
if (!getenumLogLevel().needLog(LogLevel.DEBUG)) {
return;
}
log = wrap("debug", log);
Logger loggers[] = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.debug(log);
}
}
public void info(String log) {
if (!getenumLogLevel().needLog(LogLevel.INFO)) {
return;
}
log = wrap("info", log);
Logger loggers[] = DynamicLogManager.getLogs(this);
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.info(log);
}
@@ -96,7 +114,7 @@ public class DynamicLog {
return;
}
log = wrap("warn", log);
Logger loggers[] = DynamicLogManager.getLogs(this);
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.warn(log);
}
@@ -107,23 +125,12 @@ public class DynamicLog {
return;
}
log = wrap("warn", log);
Logger loggers[] = DynamicLogManager.getLogs(this);
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.warn(log, e);
}
}
public void error(String log) {
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
return;
}
log = wrap("error", log);
Logger loggers[] = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.error(log);
}
}
public void error(String log, Throwable e) {
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
return;
@@ -134,12 +141,23 @@ public class DynamicLog {
return;
}
Logger loggers[] = DynamicLogManager.getLogs(this);
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.error(log, e);
}
}
public void error(String log) {
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
return;
}
log = wrap("error", log);
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.error(log);
}
}
public void error(Throwable e) {
if (!getenumLogLevel().needLog(LogLevel.ERROR)) {
return;
@@ -149,12 +167,43 @@ public class DynamicLog {
error(log);
return;
}
Logger loggers[] = DynamicLogManager.getLogs(this);
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
logger.error(log, e);
}
}
/**
* Print sample error log.
*/
public boolean sampleError(Object sampleKeyO, String log, Throwable e) {
String sampleKey = sampleKeyO.toString();
try {
SampleStatis ss = sampleStatis.computeIfAbsent(sampleKey, k -> new SampleStatis());
if (ss.gamble()) {
Logger[] loggers = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
if (e != null) {
logger.error("[" + sampleKey + "] - " + log, e);
} else {
logger.error("[" + sampleKey + "] - " + log);
}
}
return true;
} else {
return false;
}
} finally {
if (sampleStatis.size() > 100000) {
sampleStatis = new ConcurrentHashMap<>();
}
}
}
public String getDefaultLogFileName() {
return this.key + ".log";
}
//statistic for sampling
private static class SampleStatis {
@@ -185,57 +234,6 @@ public class DynamicLog {
}
}
private static Map<String/*Samplekey*/, SampleStatis> sampleStatis = new ConcurrentHashMap<>();
/**
* Print sample error log
*/
public boolean sampleError(Object sampleKeyO, String log, Throwable e) {
String sampleKey = sampleKeyO.toString();
try {
SampleStatis ss = sampleStatis.computeIfAbsent(sampleKey, k -> new SampleStatis());
if (ss.gamble()) {
Logger loggers[] = DynamicLogManager.getLogs(this);
for (Logger logger : loggers) {
if (e != null) {
logger.error("[" + sampleKey + "] - " + log, e);
} else {
logger.error("[" + sampleKey + "] - " + log);
}
}
return true;
} else {
return false;
}
} finally {
if (sampleStatis.size() > 100000) {
sampleStatis = new ConcurrentHashMap<>();
}
}
}
private final String key;
private DynamicLog(String key) {
this.key = key;
}
public String getKey() {
return this.key;
}
public String getDefaultLogFileName() {
return this.key + ".log";
}
public static DynamicLog registerName(String name) {
return DynamicLogNameRegister.registerName(name);
}
public static Collection<DynamicLog> values() {
return DynamicLogNameRegister.names.values();
}
public static class DynamicLogNameRegister {
static final Map<String, DynamicLog> names = new ConcurrentHashMap<>();
@@ -11,27 +11,26 @@ import org.apache.log4j.RollingFileAppender;
import org.ray.util.SystemUtil;
/**
* Manager for dynamic loggers
* Manager for dynamic loggers.
*/
public class DynamicLogManager {
protected static final String DAY_DATE_PATTERN = "'.'yyyy-MM-dd";
private static final int LOG_CACHE_SIZE = 32 * 1024;
// private final static String HOUR_DATE_PATTERN = "'
// .'yyyy-MM-dd_HH";
// private final static String GBK = "GBK";
private static final String DAILY_APPENDER_NAME = "_DAILY_APPENDER_NAME";
// private final static String CONSOLE_APPENDER_NAME =
// "_CONSOLE_APPENDER_NAME";
private static final String LAYOUT_PATTERN = "%d [%t]%m%n";
private static final ConcurrentHashMap<DynamicLog, Logger> loggers = new ConcurrentHashMap<>();
//whether to print the log on std(ie. console)
public static boolean printOnStd = false;
//the root directory of log files
public static String logsDir;
public static String logsSuffix;
public static Level level = Level.DEBUG; //Level.INFO;
/** */
private static final int LOG_CACHE_SIZE = 32 * 1024;
protected final static String DAY_DATE_PATTERN = "'.'yyyy-MM-dd";
// private final static String HOUR_DATE_PATTERN = "'.'yyyy-MM-dd_HH";
// private final static String GBK = "GBK";
private final static String DAILY_APPENDER_NAME = "_DAILY_APPENDER_NAME";
// private final static String CONSOLE_APPENDER_NAME = "_CONSOLE_APPENDER_NAME";
private final static String LAYOUT_PATTERN = "%d [%t]%m%n";
private static final ConcurrentHashMap<DynamicLog, Logger> loggers = new ConcurrentHashMap<>();
private static int MAX_FILE_NUM = 10;
private static String MAX_FILE_SIZE = "500MB";
@@ -98,13 +97,13 @@ public class DynamicLogManager {
}
}
}
return new Logger[]{logger};
return new Logger[] {logger};
}
private static Logger initLogger(DynamicLog dynLog) {
if (printOnStd) {
Logger reallogger = Logger.getLogger(dynLog.getKey());
ConsoleLogger logger = new ConsoleLogger(dynLog.getKey(), reallogger);
final ConsoleLogger logger = new ConsoleLogger(dynLog.getKey(), reallogger);
PatternLayout layout = new PatternLayout(LAYOUT_PATTERN);
ConsoleAppender appender = new ConsoleAppender(layout, ConsoleAppender.SYSTEM_OUT);
reallogger.removeAllAppenders();
@@ -122,7 +121,7 @@ public class DynamicLogManager {
}
protected static Logger makeLogger(String loggerName, String filename) {
Logger logger = Logger.getLogger(loggerName);
final Logger logger = Logger.getLogger(loggerName);
PatternLayout layout = new PatternLayout(LAYOUT_PATTERN);
File dir = new File(logsDir);
if (!dir.exists()) {
@@ -1,17 +1,17 @@
package org.ray.util.logger;
/**
* Dynamic loggers in Ray
* Dynamic loggers in Ray.
*/
public class RayLog {
/**
* for ray itself
* for ray itself.
*/
public static final DynamicLog core = DynamicLog.registerName("core");
/**
* for ray's app's log
* for ray's app's log.
*/
public static DynamicLog rapp = core; //DynamicLog.registerName("rapp");
}
@@ -7,11 +7,15 @@ import org.apache.log4j.Layout;
import org.apache.log4j.RollingFileAppender;
/**
* Normal log appender
* Normal log appender.
*/
public class TimedFlushDailyRollingFileAppender extends RollingFileAppender {
private final static Set<TimedFlushDailyRollingFileAppender> all = new HashSet<>();
private static final Set<TimedFlushDailyRollingFileAppender> all = new HashSet<>();
static {
new TimedFlushLogThread().start();
}
public TimedFlushDailyRollingFileAppender() {
super();
@@ -27,10 +31,6 @@ public class TimedFlushDailyRollingFileAppender extends RollingFileAppender {
}
}
static {
new TimedFlushLogThread().start();
}
private void flush() {
try {
if (!checkEntryConditions()) {