hi Ignite team,
I want to implement a customized BackupFilter which is called in the
RendezvousAffinityFunction for my own cluster's feature, and I encountered a
problem: how to get the logger in ignite?
I've tried below ways, but all of them don't work, (NullPointerException).
1. Use the way just like below in RendezvousAffinityFunction, but seems that
the log cannot be automatically injected in my code, but it works in
RendezvousAffinityFunction. Any extra work for this?
/** Logger instance. */
@LoggerResource
private transient IgniteLogger log;
2. JavaLogger log = new JavaLogger();
3. U.warn(null, msg)
4. Try to pass the GridKernelContext to my class, then use IgniteLogger log
= ctx.log(myclass). It works when create my class, but do marshal/unmarshal,
it becomes null again.
BTW, I hard-code my BackupFilter in the RendezvousAffinityFunction as
default not by config. Because i use the .net version, it's a little
complicated to use config for this now.
Any suggestion on this?
My detailed class is as below:
public class ScaleUnitBackFilter implements IgniteBiPredicate<ClusterNode,
ClusterNode> {
/**
* It's used by the JdkMarshaller
*/
private static final long serialVersionUID = -5036727407264096908L;
private static final long ReloadCheckIntervalInMilliSecond = 300000;
/**
* delay the loading to the first read
*/
private long lastLoadTime = 0;
private static final String ScaleUnitFilePath =
"d:/data/machineinfo.csv";
private HashMap<String, MachineInfo> scaleUnitMap;
/** Logger instance. */
@LoggerResource
private transient IgniteLogger log;
public ScaleUnitBackFilter() {
scaleUnitMap = new HashMap<String, MachineInfo>();
}
@Override
public boolean apply(ClusterNode primaryNode, ClusterNode
backupNodeCandidate) {
long curTime = U.currentTimeMillis();
if (curTime - lastLoadTime >= ReloadCheckIntervalInMilliSecond)
{
loadScaleUnitMap();
}
A.ensure(primaryNode.hostNames().size() >= 1, "Primary Node
must have
hostname.");
A.ensure(backupNodeCandidate.hostNames().size() >= 1, "Backup
Node must
have hostname.");
// Remove the domain in the full hostname
String pn = primaryNode.hostNames().toArray(new
String[0])[0].split("\\.")[0];
String bnc = backupNodeCandidate.hostNames().toArray(new
String[0])[0].split("\\.")[0];
LT.info(log, "PN: " + pn + ", BNC: " + bnc, false);
if (scaleUnitMap == null || scaleUnitMap.isEmpty()) {
LT.warn(log, null, "The machineinfo.csv file may be
empty. !!!PAY MORE
ATTENTION!!!", false);
return true;
}
if (!scaleUnitMap.containsKey(primaryNode) ||
!scaleUnitMap.containsKey(backupNodeCandidate)) {
LT.warn(log, null, "One machine isn't in the
machineinfo.csv. !!!PAY MORE
ATTENTION!!!", false);
return true;
}
MachineInfo pnInfo = scaleUnitMap.get(primaryNode);
LT.info(log, printMachineInfo(pn, pnInfo), false);
MachineInfo bncInfo = scaleUnitMap.get(backupNodeCandidate);
LT.info(log, printMachineInfo(bnc, bncInfo), false);
// If in the same scale unit or backup node isn't in 'H'
status, don't
select it as the backup node
if (pnInfo.scaleUnit.equals(bncInfo.scaleUnit) ||
!"H".equals(bncInfo.status)) {
LT.info(log, "Backup Node Candidate is filtered!",
false);
return false;
}
LT.info(log, "PN: " + pn + ", BN: " + bnc + " is selected!",
false);
return true;
}
private String printMachineInfo(String machine, MachineInfo
machineInfo) {
return machine + "[" + machineInfo.scaleUnit + ", " +
machineInfo.status +
"]";
}
private synchronized void loadScaleUnitMap() {
// double check
long curTime = U.currentTimeMillis();
if (curTime - lastLoadTime >= ReloadCheckIntervalInMilliSecond)
{
return;
}
String line = null;
String csvSplitBy = ",";
BufferedReader br = null;
try {
br = new BufferedReader(new
FileReader(ScaleUnitFilePath));
while ((line = br.readLine()) != null) {
String[] fields = line.split(csvSplitBy);
// remove some comments
if (fields.length < 11) {
continue;
}
// remove header
if (fields[0].startsWith("#Fields")) {
continue;
}
String machine = fields[0];
String status = fields[10];
Integer scaleUnit = Integer.parseInt(fields[7]);
MachineInfo mi = new MachineInfo(scaleUnit,
status);
scaleUnitMap.put(machine, mi);
}
lastLoadTime = curTime;
} catch (FileNotFoundException e) {
LT.error(log, e, "MachinesInfo.csv doesn't exist!");
} catch (IOException e) {
LT.error(log, e, "Failed to operate the
MachinesInfo.csv!");
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
LT.error(log, e, "Failed to close the
MachinesInfo.csv!");
}
}
}
}
class MachineInfo implements Serializable {
/**
* It's used by the JdkMarshaller
*/
private static final long serialVersionUID =
-656959122464042938L;
private Integer scaleUnit;
private String status;
public MachineInfo(Integer su, String s) {
this.scaleUnit = su;
this.status = s;
}
public Integer getScaleUnit() {
return scaleUnit;
}
public void setScaleUnit(Integer scaleUnit) {
this.scaleUnit = scaleUnit;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
}
}
Thanks,
-Jason
--
View this message in context:
http://apache-ignite-users.70518.x6.nabble.com/How-to-use-the-logger-in-the-BackupFilter-tp6442.html
Sent from the Apache Ignite Users mailing list archive at Nabble.com.