package org.weiboad.ragnar.server.storage;
import org.rocksdb.RocksDBException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.weiboad.ragnar.server.config.FieryConfig;
import org.weiboad.ragnar.server.util.DateTimeHelper;
import org.weiboad.ragnar.server.util.FileUtil;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Scope("singleton")
public class DBManage {
private ConcurrentHashMap<Long, DBSharder> dbSharderList;
private Logger log;
@Autowired
FieryConfig fieryConfig;
public DBManage() {
log = LoggerFactory.getLogger(DBManage.class);
dbSharderList = new ConcurrentHashMap<>();
log.info("DB Manger init...");
}
public DBSharder getDB(Long timestamp) {
try {
Long timeshard = DateTimeHelper.getTimesMorning(timestamp);
//log.info("timestamp:" + timestamp + " shard:" + timeshard + " befor:" + DateTimeHelper.getBeforeDay(fieryConfig.getKeepdataday()));
if (timeshard > DateTimeHelper.getBeforeDay(fieryConfig.getKeepdataday())
&& timeshard <= DateTimeHelper.getCurrentTime()) {
if (dbSharderList.containsKey(timeshard)) {
return dbSharderList.get(timeshard);
}
dbSharderList.put(timeshard, new DBSharder(fieryConfig.getDbpath(), timeshard));
return dbSharderList.get(timeshard);
} else {
return null;
}
} catch (RocksDBException e) {
e.printStackTrace();
log.error(e.getMessage());
return null;
}
}
public Map<String, String> getDbList() {
Map<String, String> result = new LinkedHashMap<>();
for (Map.Entry<Long, DBSharder> e : dbSharderList.entrySet()) {
String dbname = e.getKey() + "";
DBSharder dbSharder = e.getValue();
result.put(dbname, "");
}
return result;
}
//remove the old db
@Scheduled(fixedRate = 5000)
public void Refresh() {
for (Map.Entry<Long, DBSharder> e : dbSharderList.entrySet()) {
//check if the ragnarlog is expire
if (e.getKey() < DateTimeHelper.getBeforeDay(fieryConfig.getKeepdataday())) {
log.info("Remove DB Name:" + e.getKey() + " expireday:" + fieryConfig.getKeepdataday() + " expiredate:" + DateTimeHelper
.getBeforeDay(fieryConfig.getKeepdataday()));
e.getValue().close();
FileUtil.deleteDir(fieryConfig.getDbpath() + "/" + e.getKey());
dbSharderList.remove(e.getKey());
}
}
}
}