diff --git a/case/3B+/LPM_Case_3B+.stl b/case/3B+/LPM_Case_3B+.stl index 1ca76b4..26ef938 100644 Binary files a/case/3B+/LPM_Case_3B+.stl and b/case/3B+/LPM_Case_3B+.stl differ diff --git a/case/3B+/LPM_Case_Flange_3B+.blend b/case/3B+/LPM_Case_Flange_3B+.blend index a7f7bce..52360cd 100644 Binary files a/case/3B+/LPM_Case_Flange_3B+.blend and b/case/3B+/LPM_Case_Flange_3B+.blend differ diff --git a/case/3B+/LPM_Case_Flange_3B+.stl b/case/3B+/LPM_Case_Flange_3B+.stl index 1e6d5f3..bfd048a 100644 Binary files a/case/3B+/LPM_Case_Flange_3B+.stl and b/case/3B+/LPM_Case_Flange_3B+.stl differ diff --git a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/BackupMinutes.java b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/BackupMinutes.java index cc35958..7827b56 100644 --- a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/BackupMinutes.java +++ b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/BackupMinutes.java @@ -4,22 +4,31 @@ import com.lanternsoftware.datamodel.currentmonitor.Account; import com.lanternsoftware.datamodel.currentmonitor.HubPowerMinute; import com.lanternsoftware.util.DateUtils; import com.lanternsoftware.util.DebugTimer; +import com.lanternsoftware.util.concurrency.ConcurrencyUtils; import com.lanternsoftware.util.external.LanternFiles; import com.lanternsoftware.util.NullUtils; import com.lanternsoftware.util.dao.DaoQuery; import com.lanternsoftware.util.dao.DaoSort; import com.lanternsoftware.util.dao.mongo.MongoConfig; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.TimeZone; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; public class BackupMinutes { + + public static void main(String[] args) { - CurrentMonitorDao dao = new MongoCurrentMonitorDao(MongoConfig.fromDisk(LanternFiles.CONFIG_PATH + "mongo.cfg")); - CurrentMonitorDao backupDao = new MongoCurrentMonitorDao(MongoConfig.fromDisk(LanternFiles.BACKUP_DEST_PATH + "mongo.cfg")); - Date now = new Date(); - for (Account a : dao.getProxy().queryAll(Account.class)) { + CurrentMonitorDao sourceDao = new MongoCurrentMonitorDao(MongoConfig.fromDisk(LanternFiles.CONFIG_PATH + "mongo.cfg")); + CurrentMonitorDao destDao = new MongoCurrentMonitorDao(MongoConfig.fromDisk(LanternFiles.BACKUP_DEST_PATH + "mongo.cfg")); + ExecutorService ex = Executors.newFixedThreadPool(8); + List> tasks = new ArrayList<>(); + for (Account a : sourceDao.getProxy().queryAll(Account.class)) { if (a.getId() == 0) continue; DebugTimer t = new DebugTimer("Account " + a.getId()); @@ -27,28 +36,35 @@ public class BackupMinutes { a.setTimezone("America/Chicago"); } TimeZone tz = TimeZone.getTimeZone(a.getTimezone()); - HubPowerMinute minute = dao.getProxy().queryOne(HubPowerMinute.class, new DaoQuery("account_id", a.getId()), DaoSort.sort("minute")); - if (minute == null) + HubPowerMinute firstMinute = sourceDao.getProxy().queryOne(HubPowerMinute.class, new DaoQuery("account_id", a.getId()), DaoSort.sort("minute")); + if (firstMinute == null) continue; - HubPowerMinute lastBackup = backupDao.getProxy().queryOne(HubPowerMinute.class, new DaoQuery("account_id", a.getId()), DaoSort.sortDesc("minute")); - Date start = lastBackup == null ? DateUtils.getMidnightBefore(minute.getMinuteAsDate(), tz) : lastBackup.getMinuteAsDate(); -// Date start = DateUtils.date(10,16,2021,tz); + HubPowerMinute lastMinute = sourceDao.getProxy().queryOne(HubPowerMinute.class, new DaoQuery("account_id", a.getId()), DaoSort.sortDesc("minute")); + HubPowerMinute lastBackup = destDao.getProxy().queryOne(HubPowerMinute.class, new DaoQuery("account_id", a.getId()), DaoSort.sortDesc("minute")); + Date start = lastBackup == null ? DateUtils.getMidnightBefore(firstMinute.getMinuteAsDate(), tz) : lastBackup.getMinuteAsDate(); + Date lastMin = lastMinute.getMinuteAsDate(); Date end = DateUtils.addDays(start, 1, tz); - while (start.before(now)) { - DebugTimer t2 = new DebugTimer("Account Id: " + a.getId() + " Query Day " + DateUtils.format("MM/dd/yyyy", tz, start)); - List minutes = dao.getProxy().query(HubPowerMinute.class, new DaoQuery("account_id", a.getId()).andBetweenInclusiveExclusive("minute", (int) (start.getTime() / 60000), (int) (end.getTime() / 60000))); - t2.stop(); - if (!minutes.isEmpty()) { - DebugTimer t3 = new DebugTimer("Save Day"); - backupDao.getProxy().save(minutes); - t3.stop(); - } + while (start.before(lastMin)) { + final Date curStart = start; + final Date curEnd = end; + tasks.add(ex.submit(() -> { + DebugTimer t2 = new DebugTimer("Account Id: " + a.getId() + " Query Day " + DateUtils.format("MM/dd/yyyy", tz, curStart)); + List minutes = sourceDao.getProxy().query(HubPowerMinute.class, new DaoQuery("account_id", a.getId()).andBetweenInclusiveExclusive("minute", (int) (curStart.getTime() / 60000), (int) (curEnd.getTime() / 60000))); + t2.stop(); + if (!minutes.isEmpty()) { + DebugTimer t3 = new DebugTimer("Save Day"); + destDao.getProxy().save(minutes); + t3.stop(); + } + })); start = end; end = DateUtils.addDays(end, 1, tz); } t.stop(); } - dao.shutdown(); - backupDao.shutdown(); + ConcurrencyUtils.getAll(tasks); + ex.shutdown(); + sourceDao.shutdown(); + destDao.shutdown(); } } diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerConfig.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerConfig.java index 8748512..359277d 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerConfig.java +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerConfig.java @@ -203,7 +203,7 @@ public class BreakerConfig implements IIdentical { } public BillingCurrency getCurrency() { - return CollectionUtils.getFirst(CollectionUtils.transformToSet(billingRates, BillingRate::getCurrency)); + return CollectionUtils.getFirst(CollectionUtils.transformToSet(CollectionUtils.aggregate(billingPlans, BillingPlan::getRates), BillingRate::getCurrency)); } @Override diff --git a/currentmonitor/lantern-service-currentmonitor/pom.xml b/currentmonitor/lantern-service-currentmonitor/pom.xml index 682f1bb..5625b58 100644 --- a/currentmonitor/lantern-service-currentmonitor/pom.xml +++ b/currentmonitor/lantern-service-currentmonitor/pom.xml @@ -17,7 +17,7 @@ com.google.api-client google-api-client-bom - 1.32.1 + 1.33.2 pom import diff --git a/currentmonitor/lantern-service-currentmonitor/src/main/resources/logback.xml b/currentmonitor/lantern-service-currentmonitor/src/main/resources/logback.xml index 6f04b4c..294a003 100644 --- a/currentmonitor/lantern-service-currentmonitor/src/main/resources/logback.xml +++ b/currentmonitor/lantern-service-currentmonitor/src/main/resources/logback.xml @@ -3,7 +3,7 @@ - /opt/tomcat/logs/log.txt + /opt/tomcat/log/log.txt /opt/tomcat/log/log.%d{yyyy-MM-dd}.%i.txt 20MB diff --git a/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/MongoRulesDataAccess.java b/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/MongoRulesDataAccess.java index 7692e02..9f7caa1 100644 --- a/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/MongoRulesDataAccess.java +++ b/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/MongoRulesDataAccess.java @@ -64,6 +64,11 @@ public class MongoRulesDataAccess implements RulesDataAccess { proxy.save(_device); } + @Override + public void removeFcmDevice(String _id) { + proxy.delete(FcmDevice.class, new DaoQuery("_id", _id)); + } + @Override public List getFcmDevicesForAccount(int _accountId) { return proxy.query(FcmDevice.class, new DaoQuery("account_id", _accountId)); diff --git a/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/RulesDataAccess.java b/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/RulesDataAccess.java index 08535d4..0f89d7c 100644 --- a/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/RulesDataAccess.java +++ b/rules/lantern-dataaccess-rules/src/main/java/com/lanternsoftware/dataaccess/rules/RulesDataAccess.java @@ -17,5 +17,6 @@ public interface RulesDataAccess { Event getMostRecentEvent(int _accountId, EventType _type, String _sourceId); List getEvents(int _accountId, EventType _type, String _sourceId, Date _from, Date _to); void putFcmDevice(FcmDevice _device); + void removeFcmDevice(String _id); List getFcmDevicesForAccount(int _accountId); } diff --git a/rules/lantern-service-rules/src/main/java/com/lanternsoftware/rules/actions/AbstractAlertAction.java b/rules/lantern-service-rules/src/main/java/com/lanternsoftware/rules/actions/AbstractAlertAction.java index b0d70ce..60c6315 100644 --- a/rules/lantern-service-rules/src/main/java/com/lanternsoftware/rules/actions/AbstractAlertAction.java +++ b/rules/lantern-service-rules/src/main/java/com/lanternsoftware/rules/actions/AbstractAlertAction.java @@ -45,6 +45,9 @@ public abstract class AbstractAlertAction implements ActionImpl { try { messaging.send(msg); } catch (Exception _e) { + if (_e.getMessage().contains("not found")) { + RulesEngine.instance().dao().removeFcmDevice(device.getId()); + } logger.error("Failed to send message to account {}, device {}", _rule.getAccountId(), device.getName(), _e); } } diff --git a/util/lantern-util-dao-mongo/src/main/java/com/lanternsoftware/util/dao/mongo/MongoProxy.java b/util/lantern-util-dao-mongo/src/main/java/com/lanternsoftware/util/dao/mongo/MongoProxy.java index c499c28..19330da 100644 --- a/util/lantern-util-dao-mongo/src/main/java/com/lanternsoftware/util/dao/mongo/MongoProxy.java +++ b/util/lantern-util-dao-mongo/src/main/java/com/lanternsoftware/util/dao/mongo/MongoProxy.java @@ -379,7 +379,10 @@ public class MongoProxy extends AbstractDaoProxy { @Override public int count(String _tableName, DaoQuery _query) { - return (int) db().getCollection(_tableName).count(prepareQuery(_query)); + if (CollectionUtils.isEmpty(_query)) + return (int) db().getCollection(_tableName).countDocuments(); + else + return (int) db().getCollection(_tableName).countDocuments(prepareQuery(_query)); } public void ensureIndex(Class _class, DaoSort _indexOrder) {