This is an automated email from the ASF dual-hosted git repository.
dpavlov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite-teamcity-bot.git
The following commit(s) were added to refs/heads/master by this push:
new b6036d6 Refactoring to separate build ref sync and TC ignited code
b6036d6 is described below
commit b6036d6a0e4e936817ed151243ce8242ae9aea16
Author: Dmitriy Pavlov <[email protected]>
AuthorDate: Thu Dec 6 23:59:26 2018 +0300
Refactoring to separate build ref sync and TC ignited code
---
.../ignite/ci/runners/RemoteClientTmpHelper.java | 2 +-
.../ci/teamcity/ignited/IgniteStringCompactor.java | 2 +
.../ci/teamcity/ignited/TeamcityIgnitedImpl.java | 96 ++++---------------
.../ci/teamcity/ignited/TeamcityIgnitedModule.java | 1 +
.../ignited/{ => buildref}/BuildRefDao.java | 4 +-
.../ci/teamcity/ignited/buildref/BuildRefSync.java | 102 ++++++++++++++++++++-
.../ignited/fatbuild/ProactiveFatBuildSync.java | 2 +-
.../ignited/runhist/RunHistCompactedDao.java | 6 +-
.../ci/teamcity/ignited/runhist/RunHistSync.java | 2 +-
.../ci/teamcity/ignited/BuildKeyUnitTest.java | 1 +
.../ignited/IgnitedTcInMemoryIntegrationTest.java | 1 +
11 files changed, 136 insertions(+), 83 deletions(-)
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
index d987067..e938158 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/runners/RemoteClientTmpHelper.java
@@ -34,7 +34,7 @@ import org.apache.ignite.ci.IgnitePersistentTeamcity;
import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.result.Build;
import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.BuildRefDao;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
import org.apache.ignite.ci.teamcity.ignited.IgniteStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
index bb4e101..015ac50 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/IgniteStringCompactor.java
@@ -32,6 +32,7 @@ import
org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
import org.apache.ignite.cache.query.QueryCursor;
import org.apache.ignite.cache.query.SqlQuery;
import org.apache.ignite.cache.query.annotations.QuerySqlField;
+import org.apache.ignite.ci.db.Persisted;
import org.apache.ignite.ci.di.AutoProfiling;
import org.apache.ignite.ci.di.cache.GuavaCached;
import org.apache.ignite.ci.util.ExceptionUtil;
@@ -63,6 +64,7 @@ public class IgniteStringCompactor implements
IStringCompactor {
/** Sequence. */
private IgniteAtomicSequence seq;
+ @Persisted
public static class CompactorEntity {
@QuerySqlField
String val;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
index f3125cb..1f1a41a 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedImpl.java
@@ -30,8 +30,9 @@ import org.apache.ignite.ci.di.scheduler.IScheduler;
import org.apache.ignite.ci.tcbot.trends.MasterTrendsService;
import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildCondition;
import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildConditionDao;
-import org.apache.ignite.ci.tcmodel.hist.BuildRef;
import org.apache.ignite.ci.tcmodel.result.Build;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefSync;
import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefDao;
import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeSync;
@@ -54,7 +55,6 @@ import javax.annotation.Nullable;
import javax.inject.Inject;
import java.util.*;
import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import static org.apache.ignite.ci.tcmodel.hist.BuildRef.STATUS_UNKNOWN;
@@ -69,12 +69,6 @@ public class TeamcityIgnitedImpl implements ITeamcityIgnited
{
/** Max build id diff to enforce reload during incremental refresh. */
public static final int MAX_ID_DIFF_TO_ENFORCE_CONTINUE_SCAN = 3000;
- /**
- * Max builds to check during incremental sync. If this value is reached
(50 pages) and some stuck builds still not
- * found, then iteration stops
- */
- public static final int MAX_INCREMENTAL_BUILDS_TO_CHECK = 5000;
-
/** Server id. */
private String srvNme;
@@ -87,13 +81,17 @@ public class TeamcityIgnitedImpl implements
ITeamcityIgnited {
/** Build reference DAO. */
@Inject private BuildRefDao buildRefDao;
+ /** Build reference (short version of build data) sync. */
+ @Inject private BuildRefSync buildRefSync;
+
/** Build condition DAO. */
@Inject private BuildConditionDao buildConditionDao;
/** Build DAO. */
@Inject private FatBuildDao fatBuildDao;
- @Inject private ProactiveFatBuildSync buildSync;
+ /** Build Sync. */
+ @Inject private ProactiveFatBuildSync fatBuildSync;
/** Changes DAO. */
@Inject private ChangeDao changesDao;
@@ -388,8 +386,10 @@ public class TeamcityIgnitedImpl implements
ITeamcityIgnited {
public void ensureActualizeRequested() {
scheduler.sheduleNamed(taskName("actualizeRecentBuildRefs"), () ->
actualizeRecentBuildRefs(srvNme), 2, TimeUnit.MINUTES);
+ buildRefSync.ensureActualizeRequested();
+
// schedule find missing later
- buildSync.ensureActualizationRequested(srvNme, conn);
+ fatBuildSync.ensureActualizationRequested(srvNme, conn);
runHistSync.invokeLaterFindMissingHistory(srvNme);
}
@@ -399,7 +399,7 @@ public class TeamcityIgnitedImpl implements
ITeamcityIgnited {
Build build = conn.triggerBuild(buildTypeId, branchName, cleanRebuild,
queueAtTop);
//todo may add additional parameter: load builds into DB in sync/async
fashion
- runActualizeBuildRefs(srvNme, false, Sets.newHashSet(build.getId()));
+ buildRefSync.runActualizeBuildRefs(srvNme, false,
Sets.newHashSet(build.getId()), conn);
return build;
}
@@ -424,6 +424,10 @@ public class TeamcityIgnitedImpl implements
ITeamcityIgnited {
@GuavaCached(maximumSize = 2000, cacheNullRval = false)
@AutoProfiling
@Nullable public Date getBuildStartDate(int buildId) {
+ final Long buildStartTime =
runHistCompactedDao.getBuildStartTime(srvIdMaskHigh, buildId);
+ if (buildStartTime != null)
+ return new Date(buildStartTime);
+
String msg = "Loading build [" + buildId + "] start date";
if (MasterTrendsService.DEBUG)
@@ -448,7 +452,7 @@ public class TeamcityIgnitedImpl implements
ITeamcityIgnited {
return existingBuild != null ? existingBuild : new
FatBuildCompacted().setFakeStub(true);
}
- FatBuildCompacted savedVer = buildSync.loadBuild(conn, buildId,
existingBuild, mode);
+ FatBuildCompacted savedVer = fatBuildSync.loadBuild(conn, buildId,
existingBuild, mode);
//build was modified, probably we need also to update reference
accordingly
if (savedVer == null)
@@ -517,14 +521,14 @@ public class TeamcityIgnitedImpl implements
ITeamcityIgnited {
int cntFreshBuilds = paginateUntil.size();
//schedule direct reload for Fat Builds for all queued too-old builds
- buildSync.scheduleBuildsLoad(conn, directUpload);
+ fatBuildSync.scheduleBuildsLoad(conn, directUpload);
- runActualizeBuildRefs(srvNme, false, paginateUntil);
+ buildRefSync.runActualizeBuildRefs(srvNme, false, paginateUntil, conn);
int freshButNotFoundByBuildsRefsScan = paginateUntil.size();
if (!paginateUntil.isEmpty()) {
//some builds may stuck in the queued or running, enforce loading
now
- buildSync.doLoadBuilds(-1, srvNme, conn, paginateUntil);
+ fatBuildSync.doLoadBuilds(-1, srvNme, conn, paginateUntil);
}
// schedule full resync later
@@ -546,68 +550,8 @@ public class TeamcityIgnitedImpl implements
ITeamcityIgnited {
*
*/
void fullReindex() {
- runActualizeBuildRefs(srvNme, true, null);
+ buildRefSync.runActualizeBuildRefs(srvNme, true, null, conn);
}
- /**
- * @param srvId Server id.
- * @param fullReindex Reindex all builds from TC history.
- * @param mandatoryToReload [in/out] Build ID should be found before end
of sync. Ignored if fullReindex mode.
- *
- */
- @SuppressWarnings({"WeakerAccess", "UnusedReturnValue"})
- @MonitoredTask(name = "Actualize BuildRefs(srv, full resync)",
nameExtArgsIndexes = {0, 1})
- @AutoProfiling
- protected String runActualizeBuildRefs(String srvId, boolean fullReindex,
- @Nullable Set<Integer>
mandatoryToReload) {
- AtomicReference<String> outLinkNext = new AtomicReference<>();
- List<BuildRef> tcDataFirstPage = conn.getBuildRefsPage(null,
outLinkNext);
-
- Set<Long> buildsUpdated = buildRefDao.saveChunk(srvIdMaskHigh,
tcDataFirstPage);
- int totalUpdated = buildsUpdated.size();
- buildSync.scheduleBuildsLoad(conn, cacheKeysToBuildIds(buildsUpdated));
-
- int totalChecked = tcDataFirstPage.size();
- int neededToFind = 0;
- if (mandatoryToReload != null) {
- neededToFind = mandatoryToReload.size();
-
-
tcDataFirstPage.stream().map(BuildRef::getId).forEach(mandatoryToReload::remove);
- }
-
- while (outLinkNext.get() != null) {
- String nextPageUrl = outLinkNext.get();
- outLinkNext.set(null);
- List<BuildRef> tcDataNextPage = conn.getBuildRefsPage(nextPageUrl,
outLinkNext);
- Set<Long> curChunkBuildsSaved =
buildRefDao.saveChunk(srvIdMaskHigh, tcDataNextPage);
- totalUpdated += curChunkBuildsSaved.size();
- buildSync.scheduleBuildsLoad(conn,
cacheKeysToBuildIds(curChunkBuildsSaved));
-
- int savedCurChunk = curChunkBuildsSaved.size();
-
- totalChecked += tcDataNextPage.size();
-
- if (!fullReindex) {
- if (mandatoryToReload != null && !mandatoryToReload.isEmpty())
-
tcDataNextPage.stream().map(BuildRef::getId).forEach(mandatoryToReload::remove);
-
- if (savedCurChunk == 0 &&
- (mandatoryToReload == null
- || mandatoryToReload.isEmpty()
- || totalChecked > MAX_INCREMENTAL_BUILDS_TO_CHECK)
- ) {
- // There are no modification at current page, hopefully no
modifications at all
- break;
- }
- }
- }
-
- int leftToFind = mandatoryToReload == null ? 0 :
mandatoryToReload.size();
- return "Entries saved " + totalUpdated + " Builds checked " +
totalChecked + " Needed to find " + neededToFind + " remained to find " +
leftToFind;
- }
-
- @NotNull private List<Integer> cacheKeysToBuildIds(Collection<Long>
cacheKeysUpdated) {
- return
cacheKeysUpdated.stream().map(BuildRefDao::cacheKeyToBuildId).collect(Collectors.toList());
- }
}
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
index b1d294f..e894afd 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/TeamcityIgnitedModule.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ci.teamcity.ignited;
import com.google.inject.AbstractModule;
import com.google.inject.internal.SingletonScope;
import org.apache.ignite.ci.teamcity.ignited.buildcondition.BuildConditionDao;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefSync;
import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefDao;
import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeSync;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefDao.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
similarity index 97%
rename from
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefDao.java
rename to
ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
index 19015ce..0d33822 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/BuildRefDao.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefDao.java
@@ -15,7 +15,7 @@
* limitations under the License.
*/
-package org.apache.ignite.ci.teamcity.ignited;
+package org.apache.ignite.ci.teamcity.ignited.buildref;
import java.util.*;
import java.util.stream.Collectors;
@@ -34,6 +34,8 @@ import org.apache.ignite.ci.db.TcHelperDb;
import org.apache.ignite.ci.di.AutoProfiling;
import org.apache.ignite.ci.di.cache.GuavaCached;
import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
+import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
import org.apache.ignite.configuration.CacheConfiguration;
import org.apache.ignite.internal.util.GridIntList;
import org.jetbrains.annotations.NotNull;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
index fce67c7..94a4d1a 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/buildref/BuildRefSync.java
@@ -16,8 +16,108 @@
*/
package org.apache.ignite.ci.teamcity.ignited.buildref;
+import org.apache.ignite.ci.di.AutoProfiling;
+import org.apache.ignite.ci.di.MonitoredTask;
+import org.apache.ignite.ci.tcmodel.hist.BuildRef;
+import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
+import org.apache.ignite.ci.teamcity.ignited.fatbuild.ProactiveFatBuildSync;
+import org.apache.ignite.ci.teamcity.pure.ITeamcityConn;
+import org.jetbrains.annotations.NotNull;
+
+import javax.annotation.Nullable;
+import javax.inject.Inject;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
/**
- *
+ * This class checks all builds ocurred on a TC server.
+ * All builds stored into build refs cache.
+ * Modified builds are sheduled to be reloaded in build sync.
*/
public class BuildRefSync {
+ /**
+ * Max builds to check during incremental sync. If this value is reached
(50 pages) and some stuck builds still not
+ * found, then iteration stops
+ */
+ public static final int MAX_INCREMENTAL_BUILDS_TO_CHECK = 5000;
+
+ /** Build reference DAO. */
+ @Inject private BuildRefDao buildRefDao;
+
+ /** Build Sync. */
+ @Inject private ProactiveFatBuildSync fatBuildSync;
+
+ /**
+ * List all builds (first pages or all available).
+ *
+ * @param srvId Server id.
+ * @param fullReindex Reindex all builds from TC history.
+ * @param mandatoryToReload [in/out] Build ID should be found before end
of sync. Ignored if fullReindex mode.
+ * @param conn Teamcity to check builds
+ */
+ @SuppressWarnings({"WeakerAccess", "UnusedReturnValue"})
+ @MonitoredTask(name = "Actualize BuildRefs(srv, full resync)",
nameExtArgsIndexes = {0, 1})
+ @AutoProfiling
+ public String runActualizeBuildRefs(String srvId, boolean fullReindex,
+ @Nullable Set<Integer>
mandatoryToReload, ITeamcityConn conn) {
+ AtomicReference<String> outLinkNext = new AtomicReference<>();
+ List<BuildRef> tcDataFirstPage = conn.getBuildRefsPage(null,
outLinkNext);
+
+ final int srvIdMaskHigh = ITeamcityIgnited.serverIdToInt(srvId);
+ Set<Long> buildsUpdated = buildRefDao.saveChunk(srvIdMaskHigh,
tcDataFirstPage);
+ int totalUpdated = buildsUpdated.size();
+ fatBuildSync.scheduleBuildsLoad(conn,
cacheKeysToBuildIds(buildsUpdated));
+
+ int totalChecked = tcDataFirstPage.size();
+ int neededToFind = 0;
+ if (mandatoryToReload != null) {
+ neededToFind = mandatoryToReload.size();
+
+
tcDataFirstPage.stream().map(BuildRef::getId).forEach(mandatoryToReload::remove);
+ }
+
+ while (outLinkNext.get() != null) {
+ String nextPageUrl = outLinkNext.get();
+ outLinkNext.set(null);
+ List<BuildRef> tcDataNextPage = conn.getBuildRefsPage(nextPageUrl,
outLinkNext);
+ Set<Long> curChunkBuildsSaved =
buildRefDao.saveChunk(srvIdMaskHigh, tcDataNextPage);
+ totalUpdated += curChunkBuildsSaved.size();
+ fatBuildSync.scheduleBuildsLoad(conn,
cacheKeysToBuildIds(curChunkBuildsSaved));
+
+ int savedCurChunk = curChunkBuildsSaved.size();
+
+ totalChecked += tcDataNextPage.size();
+
+ if (!fullReindex) {
+ if (mandatoryToReload != null && !mandatoryToReload.isEmpty())
+
tcDataNextPage.stream().map(BuildRef::getId).forEach(mandatoryToReload::remove);
+
+ if (savedCurChunk == 0 &&
+ (mandatoryToReload == null
+ || mandatoryToReload.isEmpty()
+ || totalChecked >
MAX_INCREMENTAL_BUILDS_TO_CHECK)
+ ) {
+ // There are no modification at current page, hopefully no
modifications at all
+ break;
+ }
+ }
+ }
+
+ int leftToFind = mandatoryToReload == null ? 0 :
mandatoryToReload.size();
+ return "Entries saved " + totalUpdated + " Builds checked " +
totalChecked + " Needed to find " + neededToFind + " remained to find " +
leftToFind;
+ }
+
+
+ @NotNull
+ private List<Integer> cacheKeysToBuildIds(Collection<Long>
cacheKeysUpdated) {
+ return
cacheKeysUpdated.stream().map(BuildRefDao::cacheKeyToBuildId).collect(Collectors.toList());
+ }
+
+
+ public void ensureActualizeRequested() {
+
+ }
}
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
index 5565c58..843d991 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/fatbuild/ProactiveFatBuildSync.java
@@ -28,7 +28,7 @@ import
org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
import org.apache.ignite.ci.teamcity.ignited.BuildRefCompacted;
-import org.apache.ignite.ci.teamcity.ignited.BuildRefDao;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
import org.apache.ignite.ci.teamcity.ignited.SyncMode;
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
index e5d86e3..8ab9815 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistCompactedDao.java
@@ -83,8 +83,6 @@ public class RunHistCompactedDao {
testHistCache = ignite.getOrCreateCache(cfg);
- buildStartTime =
ignite.getOrCreateCache(TcHelperDb.getCacheV2Config(BUILD_START_TIME_CACHE_NAME));
-
final CacheConfiguration<RunHistKey, RunHistCompacted> cfg2 =
TcHelperDb.getCache8PartsConfig(SUITE_HIST_CACHE_NAME);
cfg2.setQueryEntities(Collections.singletonList(new
QueryEntity(RunHistKey.class, RunHistCompacted.class)));
@@ -127,6 +125,10 @@ public class RunHistCompactedDao {
return buildStartTime.containsKey(buildIdToCacheKey(srvId, buildId));
}
+ @Nullable public Long getBuildStartTime(int srvId, int buildId) {
+ return buildStartTime.get(buildIdToCacheKey(srvId, buildId));
+ }
+
@AutoProfiling
public boolean setBuildProcessed(int srvId, int buildId, long ts) {
return buildStartTime.putIfAbsent(buildIdToCacheKey(srvId, buildId),
ts);
diff --git
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
index a74217c..0eb4e44 100644
---
a/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
+++
b/ignite-tc-helper-web/src/main/java/org/apache/ignite/ci/teamcity/ignited/runhist/RunHistSync.java
@@ -34,7 +34,7 @@ import org.apache.ignite.ci.ITeamcity;
import org.apache.ignite.ci.di.AutoProfiling;
import org.apache.ignite.ci.di.MonitoredTask;
import org.apache.ignite.ci.di.scheduler.IScheduler;
-import org.apache.ignite.ci.teamcity.ignited.BuildRefDao;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
import org.apache.ignite.ci.teamcity.ignited.IStringCompactor;
import org.apache.ignite.ci.teamcity.ignited.ITeamcityIgnited;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java
index 97df738..716051d 100644
---
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/BuildKeyUnitTest.java
@@ -17,6 +17,7 @@
package org.apache.ignite.ci.teamcity.ignited;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;
import org.junit.Test;
diff --git
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
index 27d8a11..371f6e7 100644
---
a/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
+++
b/ignite-tc-helper-web/src/test/java/org/apache/ignite/ci/teamcity/ignited/IgnitedTcInMemoryIntegrationTest.java
@@ -53,6 +53,7 @@ import
org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrence;
import org.apache.ignite.ci.tcmodel.result.problems.ProblemOccurrences;
import org.apache.ignite.ci.tcmodel.result.stat.Statistics;
import org.apache.ignite.ci.tcmodel.result.tests.TestOccurrencesFull;
+import org.apache.ignite.ci.teamcity.ignited.buildref.BuildRefDao;
import org.apache.ignite.ci.teamcity.ignited.buildtype.BuildTypeRefCompacted;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildCompacted;
import org.apache.ignite.ci.teamcity.ignited.fatbuild.FatBuildDao;