ignite-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jason <fqy...@outlook.com>
Subject How to use the logger in the BackupFilter?
Date Thu, 21 Jul 2016 10:43:56 GMT
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.

Mime
View raw message