You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ir...@apache.org on 2020/07/09 20:19:03 UTC
[ignite-teamcity-bot] 02/04: Increased the number of files to save
logs in 2 weeks #168
This is an automated email from the ASF dual-hosted git repository.
irakov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
commit b745f638c715d232b1c40c10647e285ec2f912e8
Author: sergeyuttsel <ut...@gmail.com>
AuthorDate: Thu Jul 9 23:13:47 2020 +0300
Increased the number of files to save logs in 2 weeks #168
Signed-off-by: Ivan Rakov <iv...@gmail.com>
---
.../org/apache/ignite/ci/db/Ignite2Configurer.java | 2 +-
.../apache/ignite/ci/tcbot/TcBotWebAppModule.java | 2 +
.../ignite/tcbot/engine/cleaner/Cleaner.java | 90 ++++++++++++++++------
.../ignite/tcbot/engine/defect/DefectsStorage.java | 9 ++-
.../ignite/tcbot/engine/issue/IssuesStorage.java | 9 ++-
.../apache/ignite/tcignited/build/FatBuildDao.java | 24 +++++-
6 files changed, 103 insertions(+), 33 deletions(-)
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java
index 6b0257c..69ddad8 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/db/Ignite2Configurer.java
@@ -56,7 +56,7 @@ public class Ignite2Configurer {
logFilePolicy.setContext(logCtx);
logFilePolicy.setParent(rollingFa);
logFilePolicy.setFileNamePattern(new File(logs, "logfile-%d{yyyy-MM-dd_HH}.log").getAbsolutePath());
- logFilePolicy.setMaxHistory(7);
+ logFilePolicy.setMaxHistory(24*7*2);
logFilePolicy.start();
final String activeFileName = logFilePolicy.getActiveFileName();
diff --git a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotWebAppModule.java b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotWebAppModule.java
index 969e6b6..29ef04b 100644
--- a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotWebAppModule.java
+++ b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/tcbot/TcBotWebAppModule.java
@@ -38,6 +38,7 @@ import org.apache.ignite.tcbot.common.conf.IDataSourcesConfigSupplier;
import org.apache.ignite.tcbot.common.exeption.ExceptionUtil;
import org.apache.ignite.tcbot.common.exeption.ServicesStartingException;
import org.apache.ignite.tcbot.engine.TcBotEngineModule;
+import org.apache.ignite.tcbot.engine.cleaner.Cleaner;
import org.apache.ignite.tcbot.engine.conf.ITcBotConfig;
import org.apache.ignite.tcbot.engine.pool.TcUpdatePool;
import org.apache.ignite.tcbot.notify.TcBotNotificationsModule;
@@ -78,6 +79,7 @@ public class TcBotWebAppModule extends AbstractModule {
bind(ObserverTask.class).in(new SingletonScope());
bind(BuildObserver.class).in(new SingletonScope());
bind(VisasHistoryStorage.class).in(new SingletonScope());
+ bind(Cleaner.class).in(new SingletonScope());
install(new TcBotPersistenceModule());
install(new TeamcityIgnitedModule());
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/cleaner/Cleaner.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/cleaner/Cleaner.java
index 4c5ac1f..6d14a26 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/cleaner/Cleaner.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/cleaner/Cleaner.java
@@ -18,12 +18,16 @@ package org.apache.ignite.tcbot.engine.cleaner;
import java.io.File;
import java.time.ZonedDateTime;
+import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
import javax.inject.Inject;
import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildConditionDao;
+import org.apache.ignite.lang.IgniteBiTuple;
import org.apache.ignite.tcbot.common.conf.TcBotWorkDir;
import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
import org.apache.ignite.tcbot.common.interceptor.MonitoredTask;
@@ -39,6 +43,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Cleaner {
+ private final AtomicBoolean init = new AtomicBoolean();
+
@Inject IIssuesStorage issuesStorage;
@Inject FatBuildDao fatBuildDao;
@Inject SuiteInvocationHistoryDao suiteInvocationHistoryDao;
@@ -55,41 +61,62 @@ public class Cleaner {
private ScheduledExecutorService executorService;
@AutoProfiling
- @MonitoredTask(name = "Clean ignite cache data and logs")
+ @MonitoredTask(name = "Clean old cache data and log files")
public void clean() {
- if (cfg.getCleanerConfig().enabled()) {
- try {
+ try {
+ if (cfg.getCleanerConfig().enabled()) {
long safeDays = cfg.getCleanerConfig().safeDays();
+
int numOfItemsToDel = cfg.getCleanerConfig().numOfItemsToDel();
- long thresholdDate = ZonedDateTime.now().minusDays(safeDays).toInstant().toEpochMilli();
- removeCacheEntries(thresholdDate, numOfItemsToDel);
- removeLogFiles(thresholdDate, numOfItemsToDel);
- }
- catch (Exception e) {
- e.printStackTrace();
+ ZonedDateTime thresholdDate = ZonedDateTime.now().minusDays(safeDays);
+
+ logger.info("Some data (numOfItemsToDel=" + numOfItemsToDel + ") older than " + thresholdDate + " will be removed.");
- logger.error("Periodic cache clean failed: " + e.getMessage(), e);
+ long thresholdEpochMilli = thresholdDate.toInstant().toEpochMilli();
+
+ removeCacheEntries(thresholdEpochMilli, numOfItemsToDel);
+
+ removeLogFiles(thresholdEpochMilli, numOfItemsToDel);
}
+ else
+ logger.info("Periodic cache clean disabled.");
+ }
+ catch (Throwable e) {
+ logger.error("Periodic cache clean failed: " + e.getMessage(), e);
+
+ e.printStackTrace();
}
- else
- logger.info("Periodic cache clean disabled.");
}
private void removeCacheEntries(long thresholdDate, int numOfItemsToDel) {
List<Long> oldBuildsKeys = fatBuildDao.getOldBuilds(thresholdDate, numOfItemsToDel);
+ List<String> strOldBuildsKeys = oldBuildsKeys.stream().map(compositeId -> {
+ IgniteBiTuple<Integer, Integer> idTuple = FatBuildDao.cacheKeyToSrvIdAndBuildId(compositeId);
+ return "TeamCity id: " + idTuple.get1() + " build id: " + idTuple.get2();
+ })
+ .collect(Collectors.toList());
+
+ logger.info("Builds will be removed (" + strOldBuildsKeys.size() + "): " + strOldBuildsKeys);
+
for (Long buildCacheKey : oldBuildsKeys) {
suiteInvocationHistoryDao.remove(buildCacheKey);
+
buildLogCheckResultDao.remove(buildCacheKey);
+
buildRefDao.remove(buildCacheKey);
+
buildStartTimeStorage.remove(buildCacheKey);
+
buildConditionDao.remove(buildCacheKey);
+
fatBuildDao.remove(buildCacheKey);
}
defectsStorage.removeOldDefects(thresholdDate, numOfItemsToDel);
+
issuesStorage.removeOldIssues(thresholdDate, numOfItemsToDel);
}
@@ -98,34 +125,47 @@ public class Cleaner {
for (String srvId : cfg.getServerIds()) {
File srvIdLogDir = new File(workDir, cfg.getTeamcityConfig(srvId).logsDirectory());
+
removeFiles(srvIdLogDir, thresholdDate, numOfItemsToDel);
}
File tcBotLogDir = new File(workDir, "tcbot_logs");
+
removeFiles(tcBotLogDir, thresholdDate, numOfItemsToDel);
}
private void removeFiles(File dir, long thresholdDate, int numOfItemsToDel) {
File[] logFiles = dir.listFiles();
+
+ List<File> filesToRmv = new ArrayList<>(numOfItemsToDel);
+
if (logFiles != null)
- for (File file : logFiles) {
+ for (File file : logFiles)
if (file.lastModified() < thresholdDate && numOfItemsToDel-- > 0)
- file.delete();
- }
+ filesToRmv.add(file);
+
+ logger.info("In the directory " + dir + " files will be removed (" +
+ filesToRmv.size() + "): " + filesToRmv.stream().map(File::getName).collect(Collectors.toList())
+ );
+
+ for (File file : filesToRmv) {
+ file.delete();
+ }
+
}
public void startBackgroundClean() {
- suiteInvocationHistoryDao.init();
- buildLogCheckResultDao.init();
- buildRefDao.init();
- buildStartTimeStorage.init();
- buildConditionDao.init();
- fatBuildDao.init();
-
- executorService = Executors.newSingleThreadScheduledExecutor();
+ if (init.compareAndSet(false, true)) {
+ suiteInvocationHistoryDao.init();
+ buildLogCheckResultDao.init();
+ buildRefDao.init();
+ buildStartTimeStorage.init();
+ buildConditionDao.init();
+ fatBuildDao.init();
- executorService.scheduleAtFixedRate(this::clean, 30, 30, TimeUnit.MINUTES);
-// executorService.scheduleAtFixedRate(this::clean, 0, 10, TimeUnit.SECONDS);
+ executorService = Executors.newSingleThreadScheduledExecutor();
+ executorService.scheduleAtFixedRate(this::clean, 5, 30, TimeUnit.MINUTES);
+ }
}
}
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/defect/DefectsStorage.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/defect/DefectsStorage.java
index 23008bf..407925a 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/defect/DefectsStorage.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/defect/DefectsStorage.java
@@ -180,8 +180,13 @@ public class DefectsStorage {
ScanQuery<Integer, BinaryObject> scan =
new ScanQuery<>((key, defect) -> {
- long resolvedTs = defect.<Long>field("resolvedTs");
- return resolvedTs > 0 && resolvedTs < thresholdDate;
+ Long resolvedTs = 0L;
+
+ if (defect.hasField("resolvedTs"))
+ resolvedTs = defect.<Long>field("resolvedTs");
+
+ return (resolvedTs > 0 && resolvedTs < thresholdDate) ||
+ !defect.hasField("resolvedTs");
});
for (Cache.Entry<Integer, BinaryObject> entry : cacheWithBinary.query(scan)) {
diff --git a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/issue/IssuesStorage.java b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/issue/IssuesStorage.java
index 1e93c2b..554691f 100644
--- a/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/issue/IssuesStorage.java
+++ b/tcbot-engine/src/main/java/org/apache/ignite/tcbot/engine/issue/IssuesStorage.java
@@ -133,8 +133,13 @@ public class IssuesStorage implements IIssuesStorage {
ScanQuery<BinaryObject, BinaryObject> scan =
new ScanQuery<>((issueKey, issue) -> {
- Long detectedTs = issue.<Long>field("detectedTs");
- return detectedTs != null && detectedTs < thresholdDate && detectedTs > 0;
+ Long detectedTs = null;
+
+ if (issue.hasField("detectedTs"))
+ detectedTs = issue.<Long>field("detectedTs");
+
+ return (detectedTs != null && detectedTs < thresholdDate && detectedTs > 0) ||
+ !issue.hasField("detectedTs");
});
for (Cache.Entry<BinaryObject, BinaryObject> entry : cacheWithBinary.query(scan)) {
diff --git a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/build/FatBuildDao.java b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/build/FatBuildDao.java
index 889597e..425e31b 100644
--- a/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/build/FatBuildDao.java
+++ b/tcbot-teamcity-ignited/src/main/java/org/apache/ignite/tcignited/build/FatBuildDao.java
@@ -19,6 +19,7 @@ package org.apache.ignite.tcignited.build;
import com.google.common.base.Preconditions;
import com.google.common.collect.Iterables;
+import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
@@ -47,6 +48,7 @@ import org.apache.ignite.cache.affinity.Affinity;
import org.apache.ignite.cache.query.ScanQuery;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.lang.IgniteBiTuple;
import org.apache.ignite.tcbot.common.interceptor.AutoProfiling;
import org.apache.ignite.tcbot.persistence.CacheConfigs;
import org.apache.ignite.tcbot.persistence.IStringCompactor;
@@ -177,6 +179,17 @@ public class FatBuildDao {
}
/**
+ * @param cacheKey cache key.
+ */
+ public static IgniteBiTuple<Integer, Integer> cacheKeyToSrvIdAndBuildId(long cacheKey) {
+ IgniteBiTuple<Integer, Integer> srvIdAndBuildId = new IgniteBiTuple<>();
+
+ srvIdAndBuildId.set((int)(cacheKey >> 32), (int)cacheKey);
+
+ return srvIdAndBuildId;
+ }
+
+ /**
* @param srvIdMaskHigh Server id mask high.
* @param buildId Build id.
*/
@@ -410,12 +423,18 @@ public class FatBuildDao {
IgniteCache<Long, BinaryObject> cacheWithBinary = buildsCache.withKeepBinary();
ScanQuery<Long, BinaryObject> scan = new ScanQuery<>((key, fatBuild) -> {
- long startDate = fatBuild.<Long>field("startDate");
- return startDate > 0 && startDate < thresholdDate;
+ Long startDate = 0L;
+
+ if (fatBuild.hasField("startDate"))
+ startDate = fatBuild.<Long>field("startDate");
+
+ return (startDate > 0 && startDate < thresholdDate) ||
+ !fatBuild.hasField("startDate");
}
);
List<Long> oldBuildsKeys = new ArrayList<>(numOfItemsToDel);
+
for (Cache.Entry<Long, BinaryObject> entry : cacheWithBinary.query(scan)) {
if (numOfItemsToDel > 0) {
numOfItemsToDel--;
@@ -445,5 +464,4 @@ public class FatBuildDao {
return entry.getValue() == null ? BuildRefDao.cacheKeyToBuildId(key) : null;
}
}
-
}