package org.krakenapps.logdb.query.command; import org.krakenapps.api.Primitive; import org.krakenapps.logdb.LogQueryCommand; import org.krakenapps.rpc.RpcClient; import org.krakenapps.rpc.RpcConnection; import org.krakenapps.rpc.RpcConnectionProperties; import org.krakenapps.rpc.RpcException; import org.krakenapps.rpc.RpcSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RpcTo extends LogQueryCommand { private final Logger logger = LoggerFactory.getLogger(RpcTo.class.getName()); private String agentGuid; private RpcConnection upstream; /** * mapreduce query guid */ private String guid; private RpcClient client; private RpcConnection datastream; private RpcSession datasession; public RpcTo(String agentGuid, RpcConnection upstream, String guid) { this.agentGuid = agentGuid; this.upstream = upstream; this.guid = guid; } @Override public void push(LogMap m) { if (datastream == null) { client = new RpcClient(agentGuid); RpcConnectionProperties props = new RpcConnectionProperties(upstream.getRemoteAddress()); props.setPassword((String) upstream.getProperty("password")); datastream = client.connect(props); try { datasession = datastream.createSession("logdb-mapreduce"); datasession.call("setLogStream", guid); } catch (RpcException e) { logger.error("kraken logdb: cannot set log stream", e); } catch (InterruptedException e) { logger.error("kraken logdb: cannot set log stream", e); } logger.info("kraken logdb: opened rpc data stream for query guid [{}]", guid); } datasession.post("push", m); if (logger.isDebugEnabled()) logger.debug("kraken logdb: rpc mapper [{}]", Primitive.stringify(m)); } @Override public boolean isReducer() { return false; } @Override public void eof() { this.status = Status.Finalizing; if (datasession != null) { try { datasession.call("eof", guid); } catch (Exception e) { logger.error("kraken logdb: eof fail for mapreduce query " + guid, e); } datasession.close(); datastream.close(); client.close(); client = null; datastream = null; datasession = null; } logger.info("kraken logdb: closed rpc mapper stream for query guid [{}]", guid); super.eof(); } @Override public String toString() { return "RPC Mapper [" + guid + "]"; } }