package com.navercorp.pinpoint.web.dao.hbase;
import com.navercorp.pinpoint.common.hbase.HBaseAdminTemplate;
import com.navercorp.pinpoint.common.hbase.HBaseTables;
import com.navercorp.pinpoint.web.dao.TraceDao;
import org.apache.hadoop.hbase.TableName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
/**
* TraceDao Factory for compatibility
* @author Woonduk Kang(emeroad)
*/
@Repository
public class HbaseTraceDaoFactory implements FactoryBean<TraceDao> {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
@Qualifier("hbaseTraceDao")
private TraceDao v1;
@Autowired
@Qualifier("hbaseTraceDaoV2")
private TraceDao v2;
@Autowired
private HBaseAdminTemplate adminTemplate;
@Value("#{pinpointWebProps['web.span.format.compatibility.version'] ?: 'v2'}")
private String mode = "v2";
@Override
public TraceDao getObject() throws Exception {
logger.info("TraceDao Compatibility {}", mode);
final TableName v1TableName = HBaseTables.TRACES;
final TableName v2TableName = HBaseTables.TRACE_V2;
if (mode.equalsIgnoreCase("v2")) {
if (this.adminTemplate.tableExists(v2TableName)) {
return v2;
} else {
logger.error("TraceDao configured for v2, but {} table does not exist", v2TableName);
throw new IllegalStateException(v2TableName + " table does not exist");
}
}
else if (mode.equalsIgnoreCase("compatibilityMode")) {
boolean v1TableExists = this.adminTemplate.tableExists(v1TableName);
boolean v2TableExists = this.adminTemplate.tableExists(v2TableName);
if (v1TableExists && v2TableExists) {
return new HbaseTraceCompatibilityDao(v2, v1);
} else {
logger.error("TraceDao configured for compatibilityMode, but {} and {} tables do not exist", v1TableName, v2TableName);
throw new IllegalStateException(v1TableName + ", " + v2TableName + " tables do not exist");
}
}
else if (mode.equalsIgnoreCase("dualRead")) {
boolean v1TableExists = this.adminTemplate.tableExists(v1TableName);
boolean v2TableExists = this.adminTemplate.tableExists(v2TableName);
if (v1TableExists && v2TableExists) {
return new HbaseDualReadDao(v2, v1);
} else {
logger.error("TraceDao configured for dualRead, but {} and {} tables do not exist", v1TableName, v2TableName);
throw new IllegalStateException(v1TableName + ", " + v2TableName + " tables do not exist");
}
}
else {
throw new IllegalStateException("Unknown TraceDao configuration : " + mode);
}
}
@Override
public Class<?> getObjectType() {
return TraceDao.class;
}
@Override
public boolean isSingleton() {
return true;
}
}