You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@atlas.apache.org by ma...@apache.org on 2018/09/01 04:35:19 UTC
atlas git commit: ATLAS-2856: added utility methods to RequestContext,
to find number of active requests and earliest active request-time
Repository: atlas
Updated Branches:
refs/heads/branch-0.8 c5c4742b7 -> f2e714550
ATLAS-2856: added utility methods to RequestContext, to find number of active requests and earliest active request-time
Project: http://git-wip-us.apache.org/repos/asf/atlas/repo
Commit: http://git-wip-us.apache.org/repos/asf/atlas/commit/f2e71455
Tree: http://git-wip-us.apache.org/repos/asf/atlas/tree/f2e71455
Diff: http://git-wip-us.apache.org/repos/asf/atlas/diff/f2e71455
Branch: refs/heads/branch-0.8
Commit: f2e714550a1bb30f7a7b4fbea5688225b628a4bc
Parents: c5c4742
Author: Madhan Neethiraj <ma...@apache.org>
Authored: Fri Aug 31 16:04:14 2018 -0700
Committer: Madhan Neethiraj <ma...@apache.org>
Committed: Fri Aug 31 21:34:40 2018 -0700
----------------------------------------------------------------------
.../store/graph/v1/AtlasEntityStoreV1Test.java | 4 +
.../java/org/apache/atlas/RequestContext.java | 94 ++++++++++++--------
.../java/org/apache/atlas/RequestContextV1.java | 31 ++++++-
3 files changed, 91 insertions(+), 38 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/atlas/blob/f2e71455/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
----------------------------------------------------------------------
diff --git a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
index 35d1a74..089ff08 100644
--- a/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
+++ b/repository/src/test/java/org/apache/atlas/repository/store/graph/v1/AtlasEntityStoreV1Test.java
@@ -20,6 +20,7 @@ package org.apache.atlas.repository.store.graph.v1;
import com.google.common.collect.ImmutableSet;
import org.apache.atlas.AtlasErrorCode;
import org.apache.atlas.AtlasException;
+import org.apache.atlas.RequestContext;
import org.apache.atlas.TestModules;
import org.apache.atlas.RequestContextV1;
import org.apache.atlas.TestUtils;
@@ -147,6 +148,9 @@ public class AtlasEntityStoreV1Test {
entityStore = new AtlasEntityStoreV1(deleteHandler, typeRegistry, mockChangeNotifier, graphMapper);
RequestContextV1.clear();
RequestContextV1.get().setUser(TestUtilsV2.TEST_USER);
+
+ LOG.debug("RequestContextV1: activeCount={}, earliestActiveRequestTime={}", RequestContextV1.getActiveRequestsCount(), RequestContextV1.earliestActiveRequestTime());
+ LOG.debug("RequestContext: activeCount={}, earliestActiveRequestTime={}", RequestContext.getActiveRequestsCount(), RequestContext.earliestActiveRequestTime());
}
@Test
http://git-wip-us.apache.org/repos/asf/atlas/blob/f2e71455/server-api/src/main/java/org/apache/atlas/RequestContext.java
----------------------------------------------------------------------
diff --git a/server-api/src/main/java/org/apache/atlas/RequestContext.java b/server-api/src/main/java/org/apache/atlas/RequestContext.java
index 3b2b575..eb3995a 100644
--- a/server-api/src/main/java/org/apache/atlas/RequestContext.java
+++ b/server-api/src/main/java/org/apache/atlas/RequestContext.java
@@ -21,6 +21,7 @@ package org.apache.atlas;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
@@ -29,9 +30,6 @@ import java.util.Set;
import org.apache.atlas.metrics.Metrics;
import org.apache.atlas.model.instance.AtlasEntity.AtlasEntityWithExtInfo;
import org.apache.atlas.typesystem.ITypedReferenceableInstance;
-import org.apache.atlas.typesystem.persistence.Id;
-import org.apache.atlas.typesystem.types.ClassType;
-import org.apache.atlas.typesystem.types.TypeSystem;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -40,19 +38,18 @@ public class RequestContext {
private static final Logger LOG = LoggerFactory.getLogger(RequestContext.class);
private static final ThreadLocal<RequestContext> CURRENT_CONTEXT = new ThreadLocal<>();
+ private static final Set<RequestContext> ACTIVE_REQUESTS = new HashSet<>();
- private Set<String> createdEntityIds = new LinkedHashSet<>();
- private Set<String> updatedEntityIds = new LinkedHashSet<>();
- private Set<String> deletedEntityIds = new LinkedHashSet<>();
- private List<ITypedReferenceableInstance> deletedEntities = new ArrayList<>();
- private Map<String,ITypedReferenceableInstance> entityCacheV1 = new HashMap<>();
- private Map<String,AtlasEntityWithExtInfo> entityCacheV2 = new HashMap<>();
+ private final Set<String> createdEntityIds = new LinkedHashSet<>();
+ private final Set<String> updatedEntityIds = new LinkedHashSet<>();
+ private final Set<String> deletedEntityIds = new LinkedHashSet<>();
+ private final List<ITypedReferenceableInstance> deletedEntities = new ArrayList<>();
+ private final Map<String,ITypedReferenceableInstance> entityCacheV1 = new HashMap<>();
+ private final Map<String,AtlasEntityWithExtInfo> entityCacheV2 = new HashMap<>();
+ private final Metrics metrics = new Metrics();
+ private final long requestTime = System.currentTimeMillis();
private String user;
- private long requestTime;
-
- private TypeSystem typeSystem = TypeSystem.getInstance();
- private Metrics metrics = new Metrics();
private RequestContext() {
}
@@ -61,10 +58,12 @@ public class RequestContext {
//createContext called for every request in the filter
public static RequestContext get() {
if (CURRENT_CONTEXT.get() == null) {
- synchronized (RequestContext.class) {
- if (CURRENT_CONTEXT.get() == null) {
- createContext();
- }
+ RequestContext context = new RequestContext();
+
+ CURRENT_CONTEXT.set(context);
+
+ synchronized (ACTIVE_REQUESTS) {
+ ACTIVE_REQUESTS.add(context);
}
}
@@ -74,11 +73,48 @@ public class RequestContext {
return CURRENT_CONTEXT.get();
}
+ public static void clear() {
+ RequestContext instance = CURRENT_CONTEXT.get();
+
+ if (instance != null) {
+ if (instance.entityCacheV1 != null) {
+ instance.entityCacheV1.clear();
+ }
+
+ if (instance.entityCacheV2 != null) {
+ instance.entityCacheV2.clear();
+ }
+
+ synchronized (ACTIVE_REQUESTS) {
+ ACTIVE_REQUESTS.remove(instance);
+ }
+ }
+
+ CURRENT_CONTEXT.remove();
+ }
+
public static RequestContext createContext() {
- RequestContext context = new RequestContext();
- context.requestTime = System.currentTimeMillis();
- CURRENT_CONTEXT.set(context);
- return context;
+ clear();
+
+ return get();
+ }
+
+ public static int getActiveRequestsCount() {
+ return ACTIVE_REQUESTS.size();
+ }
+
+ public static long earliestActiveRequestTime() {
+ long ret = System.currentTimeMillis();
+
+ synchronized (ACTIVE_REQUESTS) {
+ for (RequestContext context : ACTIVE_REQUESTS) {
+ if (ret > context.getRequestTime()) {
+ ret = context.getRequestTime();
+ }
+ }
+ }
+
+ return ret;
}
/**
@@ -121,22 +157,6 @@ public class RequestContext {
return entityCacheV2.get(guid);
}
- public static void clear() {
- RequestContext instance = CURRENT_CONTEXT.get();
-
- if (instance != null) {
- if (instance.entityCacheV1 != null) {
- instance.entityCacheV1.clear();
- }
-
- if (instance.entityCacheV2 != null) {
- instance.entityCacheV2.clear();
- }
- }
-
- CURRENT_CONTEXT.remove();
- }
-
public String getUser() {
return user;
}
http://git-wip-us.apache.org/repos/asf/atlas/blob/f2e71455/server-api/src/main/java/org/apache/atlas/RequestContextV1.java
----------------------------------------------------------------------
diff --git a/server-api/src/main/java/org/apache/atlas/RequestContextV1.java b/server-api/src/main/java/org/apache/atlas/RequestContextV1.java
index 8506d18..a6d5820 100644
--- a/server-api/src/main/java/org/apache/atlas/RequestContextV1.java
+++ b/server-api/src/main/java/org/apache/atlas/RequestContextV1.java
@@ -26,19 +26,21 @@ import org.slf4j.LoggerFactory;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Set;
public class RequestContextV1 {
private static final Logger LOG = LoggerFactory.getLogger(RequestContextV1.class);
private static final ThreadLocal<RequestContextV1> CURRENT_CONTEXT = new ThreadLocal<>();
+ private static final Set<RequestContextV1> ACTIVE_REQUESTS = new HashSet<>();
private final Map<String, AtlasObjectId> updatedEntities = new HashMap<>();
private final Map<String, AtlasObjectId> deletedEntities = new HashMap<>();
private final Map<String, AtlasEntity> entityCacheV2 = new HashMap<>();
private final Metrics metrics = new Metrics();
private final long requestTime = System.currentTimeMillis();
- private boolean shouldUpdateModificationTimestamp = true;
private String user;
@@ -53,10 +55,15 @@ public class RequestContextV1 {
if (ret == null) {
ret = new RequestContextV1();
CURRENT_CONTEXT.set(ret);
+
+ synchronized (ACTIVE_REQUESTS) {
+ ACTIVE_REQUESTS.add(ret);
+ }
}
return ret;
}
+
public static void clear() {
RequestContextV1 instance = CURRENT_CONTEXT.get();
@@ -64,11 +71,33 @@ public class RequestContextV1 {
instance.updatedEntities.clear();
instance.deletedEntities.clear();
instance.entityCacheV2.clear();
+
+ synchronized (ACTIVE_REQUESTS) {
+ ACTIVE_REQUESTS.remove(instance);
+ }
}
CURRENT_CONTEXT.remove();
}
+ public static int getActiveRequestsCount() {
+ return ACTIVE_REQUESTS.size();
+ }
+
+ public static long earliestActiveRequestTime() {
+ long ret = System.currentTimeMillis();
+
+ synchronized (ACTIVE_REQUESTS) {
+ for (RequestContextV1 context : ACTIVE_REQUESTS) {
+ if (ret > context.getRequestTime()) {
+ ret = context.getRequestTime();
+ }
+ }
+ }
+
+ return ret;
+ }
+
public String getUser() {
return user;
}