diff options
author | jmisinco | 2013-10-10 22:18:21 +0000 |
---|---|---|
committer | jmisinco | 2013-10-11 15:27:34 +0000 |
commit | a354996adcfa05bbbd2ea3d546a8d2529d8fe5d4 (patch) | |
tree | 486368321b69d42e5cb013db3fbeaea4a8f36b40 | |
parent | 20278478dd02ff2933285c30bbc0ae5dfb7063ef (diff) | |
download | org.eclipse.osee-a354996adcfa05bbbd2ea3d546a8d2529d8fe5d4.tar.gz org.eclipse.osee-a354996adcfa05bbbd2ea3d546a8d2529d8fe5d4.tar.xz org.eclipse.osee-a354996adcfa05bbbd2ea3d546a8d2529d8fe5d4.zip |
bug[ats_H5NS7]: Rate limit branch cache refresh requests0.14.0.v201310112226_REL0.14.0.v201310111939_RC
Change-Id: I747c69a7c0d1810a6679ea2ecb17bd6f4f0a731e
5 files changed, 98 insertions, 55 deletions
diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java index 5ed5625f2d8..a806b526fb1 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/artifact/BranchManager.java @@ -44,6 +44,7 @@ import org.eclipse.osee.framework.core.operation.IOperation; import org.eclipse.osee.framework.core.operation.OperationBuilder; import org.eclipse.osee.framework.core.operation.Operations; import org.eclipse.osee.framework.core.util.Conditions; +import org.eclipse.osee.framework.database.core.OseeInfo; import org.eclipse.osee.framework.database.core.SQL3DataType; import org.eclipse.osee.framework.jdk.core.util.GUID; import org.eclipse.osee.framework.jdk.core.util.Strings; @@ -119,7 +120,18 @@ public class BranchManager { } public static void refreshBranches() throws OseeCoreException { - getCache().reloadCache(); + String refreshWindow = OseeInfo.getCachedValue("cache.reload.throttle.millis"); + boolean reload = true; + if (Strings.isNumeric(refreshWindow)) { + long timeInMillis = Long.parseLong(refreshWindow); + long diff = System.currentTimeMillis() - getCache().getLastLoaded(); + if (diff < timeInMillis) { + reload = false; + } + } + if (reload) { + getCache().reloadCache(); + } } public static Branch getBranch(DefaultBasicGuidArtifact guidArt) throws OseeCoreException { @@ -153,14 +165,24 @@ public class BranchManager { } } - public static Branch getBranchByGuid(String guid) throws OseeCoreException { - BranchCache cache = getCache(); - Branch branch = cache.getByGuid(guid); - if (branch == null) { - if (cache.reloadCache()) { - branch = cache.getByGuid(guid); - } + /** + * Do not call this method unless absolutely neccessary due to performance impacts. + */ + public static synchronized void checkAndReload(String guid) throws OseeCoreException { + if (!branchExists(guid)) { + refreshBranches(); } + } + + public static synchronized void checkAndReload(int id) throws OseeCoreException { + if (!branchExists(id)) { + refreshBranches(); + } + } + + public static Branch getBranchByGuid(String guid) throws OseeCoreException { + // checkAndReload(guid); + Branch branch = getCache().getByGuid(guid); if (branch == null) { throw new BranchDoesNotExist("Branch with guid [%s] does not exist", guid); } @@ -175,6 +197,10 @@ public class BranchManager { return getCache().getByGuid(branchGuid) != null; } + public static boolean branchExists(int id) throws OseeCoreException { + return getCache().getById(id) != null; + } + /** * returns the merge branch for this source destination pair from the cache or null if not found */ @@ -222,15 +248,8 @@ public class BranchManager { throw new BranchDoesNotExist("Branch Id is null"); } - BranchCache cache = getCache(); - // If someone else made a branch on another machine, we may not know about it - // so refresh the cache. - Branch branch = cache.getById(branchId); - if (branch == null) { - if (cache.reloadCache()) { - branch = cache.getById(branchId); - } - } + checkAndReload(branchId); + Branch branch = getCache().getById(branchId); if (branch == null) { throw new BranchDoesNotExist("Branch could not be acquired for branch id %d", branchId); } diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventType.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventType.java index 7b743459753..743d48ddeba 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventType.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/event/model/BranchEventType.java @@ -17,14 +17,14 @@ public enum BranchEventType { // Local and Remote events Purging(EventType.LocalAndRemote, "ATPHeMoAFyL543vrAyQA", false), - Purged(EventType.LocalAndRemote, "AAn_QG7jRGZAqPE0UewA", true), + Purged(EventType.LocalAndRemote, "AAn_QG7jRGZAqPE0UewA", false), Deleting(EventType.LocalAndRemote, "ATPHeNujxAkPZEkWUtQA", false), - Deleted(EventType.LocalAndRemote, "AAn_QHBDvwtT5jjKaHgA", true), + Deleted(EventType.LocalAndRemote, "AAn_QHBDvwtT5jjKaHgA", false), Added(EventType.LocalAndRemote, "AAn_QHDohywDoSTxwcQA", true), Renamed(EventType.LocalAndRemote, "AAn_QHGLIUsH2BdX2gwA", true), Committing(EventType.LocalAndRemote, "ATPHeN1du2GAbS3SQsAA", false), CommitFailed(EventType.LocalAndRemote, "ATPHeN3RaBnDmpoYXkQA", false), - Committed(EventType.LocalAndRemote, "AAn_QHIu0mGZytQ11QwA", true), + Committed(EventType.LocalAndRemote, "AAn_QHIu0mGZytQ11QwA", false), TypeUpdated(EventType.LocalAndRemote, "AAn_QHLW4DKKbUkEZggA", true), StateUpdated(EventType.LocalAndRemote, "AAn_QHQdKhxNLtWPchAA", true), ArchiveStateUpdated(EventType.LocalAndRemote, "AAn_QHS7Zhr6OLhKl3gA", true), @@ -66,4 +66,13 @@ public enum BranchEventType { return justifiesCacheRefresh; } + public boolean matches(BranchEventType... branchEventTypes) { + for (BranchEventType branchEventType : branchEventTypes) { + if (this == branchEventType) { + return true; + } + } + return false; + } + } diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/ArtifactRemoteEventHandler.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/ArtifactRemoteEventHandler.java index a2cd09fc4e8..33a3d92a71f 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/ArtifactRemoteEventHandler.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/ArtifactRemoteEventHandler.java @@ -57,31 +57,34 @@ public class ArtifactRemoteEventHandler implements EventHandlerRemote<RemotePers transport.send(sender, transEvent); } - private void updateArtifacts(Sender sender, Collection<EventBasicGuidArtifact> artifacts, int transactionId) { + private void updateArtifacts(Sender sender, Collection<EventBasicGuidArtifact> artifacts, int transactionId) throws OseeCoreException { // Don't crash on any one artifact update problem (no update method throughs exceptions) for (EventBasicGuidArtifact guidArt : artifacts) { EventUtil.eventLog(String.format("REM: updateArtifact -> [%s]", guidArt)); EventModType eventModType = guidArt.getModType(); - switch (eventModType) { - case Added: - // Handle Added Artifacts - // Nothing to do for added cause they're not in cache yet. Apps will load if they need them. - // do nothing cause not in cache - break; - case Modified: - updateModifiedArtifact((EventModifiedBasicGuidArtifact) guidArt, transactionId); - break; - case ChangeType: - ChangeArtifactType.handleRemoteChangeType((EventChangeTypeBasicGuidArtifact) guidArt); - break; - case Deleted: - case Purged: - updateDeletedArtifact(guidArt); - break; - default: - // Unknown mod type - EventUtil.eventLog(String.format("REM: updateArtifacts - Unhandled mod type [%s]", guidArt.getModType())); - break; + if (BranchManager.branchExists(guidArt.getBranchGuid())) { + switch (eventModType) { + case Added: + // Handle Added Artifacts + // Nothing to do for added cause they're not in cache yet. Apps will load if they need them. + // do nothing cause not in cache + break; + case Modified: + updateModifiedArtifact((EventModifiedBasicGuidArtifact) guidArt, transactionId); + break; + case ChangeType: + ChangeArtifactType.handleRemoteChangeType((EventChangeTypeBasicGuidArtifact) guidArt); + break; + case Deleted: + case Purged: + updateDeletedArtifact(guidArt); + break; + default: + // Unknown mod type + EventUtil.eventLog(String.format("REM: updateArtifacts - Unhandled mod type [%s]", + guidArt.getModType())); + break; + } } } } diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchEventHandler.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchEventHandler.java index 8835fad942f..e3f49fc8171 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchEventHandler.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchEventHandler.java @@ -12,6 +12,8 @@ package org.eclipse.osee.framework.skynet.core.internal.event.handlers; import java.util.List; import org.eclipse.osee.framework.core.exception.OseeCoreException; +import org.eclipse.osee.framework.skynet.core.artifact.BranchManager; +import org.eclipse.osee.framework.skynet.core.event.EventUtil; import org.eclipse.osee.framework.skynet.core.event.FrameworkEventUtil; import org.eclipse.osee.framework.skynet.core.event.filter.IEventFilter; import org.eclipse.osee.framework.skynet.core.event.listener.IBranchEventListener; @@ -37,6 +39,13 @@ public class BranchEventHandler implements EventHandlerLocal<IBranchEventListene } } } + if (event.getEventType() == BranchEventType.Added) { + try { + BranchManager.checkAndReload(event.getBranchGuid()); + } catch (OseeCoreException ex) { + EventUtil.eventLog("IEM: updateBranches", ex); + } + } // Call listener if we matched all of the filters listener.handleBranchEvent(sender, event); } diff --git a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchRemoteEventHandler.java b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchRemoteEventHandler.java index a0454c12449..93e38d3188a 100644 --- a/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchRemoteEventHandler.java +++ b/plugins/org.eclipse.osee.framework.skynet.core/src/org/eclipse/osee/framework/skynet/core/internal/event/handlers/BranchRemoteEventHandler.java @@ -42,33 +42,36 @@ public class BranchRemoteEventHandler implements EventHandlerRemote<RemoteBranch private void updateBranches(Sender sender, BranchEvent branchEvent) { BranchEventType eventType = branchEvent.getEventType(); + String branchGuid = branchEvent.getBranchGuid(); try { - if (eventType == Committed) { - Branch branch = BranchManager.getBranchByGuid(branchEvent.getBranchGuid()); - Artifact artifact = BranchManager.getAssociatedArtifact(branch); - TransactionManager.clearCommitArtifactCacheForAssociatedArtifact(artifact); - } else if (eventType == Purged) { - handleBranchRemoval(BranchState.PURGED, branchEvent.getBranchGuid()); - } else if (eventType == Deleted) { - handleBranchRemoval(BranchState.DELETED, branchEvent.getBranchGuid()); + if (BranchManager.branchExists(branchGuid)) { + Branch branch = BranchManager.getBranchByGuid(branchGuid); + if (eventType == Committed) { + Artifact artifact = BranchManager.getAssociatedArtifact(branch); + TransactionManager.clearCommitArtifactCacheForAssociatedArtifact(artifact); + updateBranchState(BranchState.COMMITTED, branch); + } else if (eventType == Purged) { + updateBranchState(BranchState.PURGED, branch); + } else if (eventType == Deleted) { + updateBranchState(BranchState.DELETED, branch); + } } if (eventType.justifiesCacheRefresh()) { - BranchManager.invalidateBranches(); + BranchManager.refreshBranches(); } } catch (Exception ex) { EventUtil.eventLog("REM: updateBranches", ex); } } - private void handleBranchRemoval(BranchState state, String guid) throws OseeCoreException { - if (BranchManager.branchExists(guid)) { - Branch branch = BranchManager.getBranchByGuid(guid); - branch.setBranchState(state); + private void updateBranchState(BranchState state, Branch branch) throws OseeCoreException { + if (state.matches(BranchState.PURGED, BranchState.DELETED)) { branch.setArchived(true); - branch.clearDirty(); BranchManager.decache(branch); } + branch.setBranchState(state); + branch.clearDirty(); } } |