/*
* Copyright (c) 2014 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.systemservices.impl.logsvc.stream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.emc.storageos.systemservices.impl.logsvc.LogACKCode;
import com.emc.storageos.systemservices.impl.logsvc.LogMessage;
import com.emc.storageos.systemservices.impl.logsvc.LogStatusInfo;
import com.emc.storageos.systemservices.impl.logsvc.util.LogUtil;
public class LogNetworkReader implements LogStream {
// Logger reference.
private static final Logger logger = LoggerFactory.getLogger(LogNetworkReader.class);
private DataInputStream dis;
private LogStatusInfo status;
private boolean isFinished; // record is the logs and status chucks are all finished
private String nodeId;
private String nodeName;
private int logMessageCount = 0;
public LogNetworkReader(String nodeId, String nodeName, InputStream inputStream, LogStatusInfo status) {
this.nodeId = nodeId;
this.nodeName = nodeName;
this.dis = new DataInputStream(inputStream);
this.status = status;
this.isFinished = false;
}
@Override
public LogMessage readNextLogMessage() {
try {
while (true) {
byte flag = (byte) dis.read();
if (flag == LogACKCode.ACK_FIN) {
logger.debug("received FIN");
logger.debug("logMessageCount_Reader={}", logMessageCount);
isFinished = true;
return null;
} else if (flag == LogACKCode.ACK_STATUS) {
status.readAndAppend(dis);
} else if (flag == LogACKCode.ACK_LOG_ENTRY) {
LogMessage log = LogMessage.read(dis);
logMessageCount++;
log.setNodeId(LogUtil.nodeIdToBytes(nodeId));
log.setNodeName(LogUtil.nodeNameToBytes(nodeName));
if (logMessageCount % 100000 == 0) {
logger.debug("processing the {}th log messages", logMessageCount);
}
return log;
} else {
logger.info("receive {} -- ERROR", flag);
}
}
} catch (IOException e) {
// TODO: generate a dynamic error log message
logger.error("IOException:", e);
return null;
}
}
public String getNodeId() {
return this.nodeId;
}
public String getNodeName() {
return this.nodeName;
}
public LogStatusInfo getStatus() {
return this.status;
}
public boolean isFinished() {
return this.isFinished;
}
}