Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
atlas
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
dataplatform
atlas
Commits
dc9e2689
Commit
dc9e2689
authored
4 years ago
by
Ashutosh Mestry
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
ATLAS-4015: Add Re-indexing as JAVA_PATCH.
parent
b7c219a5
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
278 additions
and
5 deletions
+278
-5
AtlasGraphManagement.java
...apache/atlas/repository/graphdb/AtlasGraphManagement.java
+8
-0
AtlasJanusGraphManagement.java
...s/repository/graphdb/janus/AtlasJanusGraphManagement.java
+64
-0
AtlasConfiguration.java
intg/src/main/java/org/apache/atlas/AtlasConfiguration.java
+2
-1
AtlasPatchManager.java
...rg/apache/atlas/repository/patches/AtlasPatchManager.java
+2
-1
ConcurrentPatchProcessor.java
...he/atlas/repository/patches/ConcurrentPatchProcessor.java
+3
-3
ReIndexPatch.java
...ava/org/apache/atlas/repository/patches/ReIndexPatch.java
+199
-0
No files found.
graphdb/api/src/main/java/org/apache/atlas/repository/graphdb/AtlasGraphManagement.java
View file @
dc9e2689
...
@@ -172,4 +172,12 @@ public interface AtlasGraphManagement {
...
@@ -172,4 +172,12 @@ public interface AtlasGraphManagement {
* Set consistency to ConsistencyModifier.LOCK for all vertex and edge indexes.
* Set consistency to ConsistencyModifier.LOCK for all vertex and edge indexes.
*/
*/
void
updateUniqueIndexesForConsistencyLock
();
void
updateUniqueIndexesForConsistencyLock
();
/***
* Re-index elements.
* @param indexName: Name of the index that needs to be operated on.
* @param elements: Elements to be re-indexed.
* @throws Exception
*/
void
reindex
(
String
indexName
,
List
<
AtlasElement
>
elements
)
throws
Exception
;
}
}
This diff is collapsed.
Click to expand it.
graphdb/janus/src/main/java/org/apache/atlas/repository/graphdb/janus/AtlasJanusGraphManagement.java
View file @
dc9e2689
...
@@ -19,14 +19,22 @@ package org.apache.atlas.repository.graphdb.janus;
...
@@ -19,14 +19,22 @@ package org.apache.atlas.repository.graphdb.janus;
import
com.google.common.base.Preconditions
;
import
com.google.common.base.Preconditions
;
import
org.apache.atlas.AtlasConfiguration
;
import
org.apache.atlas.AtlasConfiguration
;
import
org.apache.atlas.exception.AtlasBaseException
;
import
org.apache.atlas.repository.graphdb.AtlasEdgeDirection
;
import
org.apache.atlas.repository.graphdb.AtlasEdgeDirection
;
import
org.apache.atlas.repository.graphdb.AtlasElement
;
import
org.apache.tinkerpop.gremlin.structure.Direction
;
import
org.apache.tinkerpop.gremlin.structure.Direction
;
import
org.apache.tinkerpop.gremlin.structure.Element
;
import
org.apache.tinkerpop.gremlin.structure.Element
;
import
org.janusgraph.core.Cardinality
;
import
org.janusgraph.core.Cardinality
;
import
org.janusgraph.core.EdgeLabel
;
import
org.janusgraph.core.EdgeLabel
;
import
org.janusgraph.core.JanusGraphElement
;
import
org.janusgraph.core.PropertyKey
;
import
org.janusgraph.core.PropertyKey
;
import
org.janusgraph.core.schema.*
;
import
org.janusgraph.core.schema.*
;
import
org.janusgraph.core.schema.JanusGraphManagement.IndexBuilder
;
import
org.janusgraph.core.schema.JanusGraphManagement.IndexBuilder
;
import
org.janusgraph.diskstorage.BackendTransaction
;
import
org.janusgraph.diskstorage.indexing.IndexEntry
;
import
org.janusgraph.graphdb.database.IndexSerializer
;
import
org.janusgraph.graphdb.database.StandardJanusGraph
;
import
org.janusgraph.graphdb.database.management.ManagementSystem
;
import
org.janusgraph.graphdb.internal.Token
;
import
org.janusgraph.graphdb.internal.Token
;
import
org.apache.atlas.repository.graphdb.AtlasCardinality
;
import
org.apache.atlas.repository.graphdb.AtlasCardinality
;
import
org.apache.atlas.repository.graphdb.AtlasEdgeLabel
;
import
org.apache.atlas.repository.graphdb.AtlasEdgeLabel
;
...
@@ -36,11 +44,16 @@ import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
...
@@ -36,11 +44,16 @@ import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.tinkerpop.gremlin.structure.Edge
;
import
org.apache.tinkerpop.gremlin.structure.Edge
;
import
org.apache.tinkerpop.gremlin.structure.Vertex
;
import
org.apache.tinkerpop.gremlin.structure.Vertex
;
import
org.janusgraph.graphdb.transaction.StandardJanusGraphTx
;
import
org.janusgraph.graphdb.types.IndexType
;
import
org.janusgraph.graphdb.types.MixedIndexType
;
import
org.slf4j.Logger
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.slf4j.LoggerFactory
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.Set
;
/**
/**
...
@@ -308,4 +321,55 @@ public class AtlasJanusGraphManagement implements AtlasGraphManagement {
...
@@ -308,4 +321,55 @@ public class AtlasJanusGraphManagement implements AtlasGraphManagement {
LOG
.
info
(
"setConsistency: {}: {}: Done!"
,
elementType
.
getSimpleName
(),
count
);
LOG
.
info
(
"setConsistency: {}: {}: Done!"
,
elementType
.
getSimpleName
(),
count
);
}
}
}
}
@Override
public
void
reindex
(
String
indexName
,
List
<
AtlasElement
>
elements
)
throws
Exception
{
try
{
JanusGraphIndex
index
=
management
.
getGraphIndex
(
indexName
);
if
(
index
==
null
||
!(
management
instanceof
ManagementSystem
)
||
!(
graph
.
getGraph
()
instanceof
StandardJanusGraph
))
{
LOG
.
error
(
"Could not retrieve index for name: {} "
,
indexName
);
return
;
}
ManagementSystem
managementSystem
=
(
ManagementSystem
)
management
;
IndexType
indexType
=
managementSystem
.
getSchemaVertex
(
index
).
asIndexType
();
if
(!(
indexType
instanceof
MixedIndexType
))
{
LOG
.
warn
(
"Index: {}: Not of MixedIndexType "
,
indexName
);
return
;
}
IndexSerializer
indexSerializer
=
((
StandardJanusGraph
)
graph
.
getGraph
()).
getIndexSerializer
();
reindexElement
(
managementSystem
,
indexSerializer
,
(
MixedIndexType
)
indexType
,
elements
);
}
catch
(
Exception
exception
)
{
throw
exception
;
}
finally
{
management
.
commit
();
}
}
private
void
reindexElement
(
ManagementSystem
managementSystem
,
IndexSerializer
indexSerializer
,
MixedIndexType
indexType
,
List
<
AtlasElement
>
elements
)
throws
Exception
{
Map
<
String
,
Map
<
String
,
List
<
IndexEntry
>>>
documentsPerStore
=
new
HashMap
<>();
StandardJanusGraphTx
tx
=
managementSystem
.
getWrappedTx
();
BackendTransaction
txHandle
=
tx
.
getTxHandle
();
try
{
JanusGraphElement
janusGraphElement
=
null
;
for
(
AtlasElement
element
:
elements
)
{
try
{
if
(
element
==
null
||
element
.
getWrappedElement
()
==
null
)
{
continue
;
}
janusGraphElement
=
element
.
getWrappedElement
();
indexSerializer
.
reindexElement
(
janusGraphElement
,
indexType
,
documentsPerStore
);
}
catch
(
Exception
e
)
{
LOG
.
warn
(
"{}: Exception: {}:{}"
,
indexType
.
getName
(),
e
.
getClass
().
getSimpleName
(),
e
.
getMessage
());
}
}
}
finally
{
if
(
txHandle
!=
null
)
{
txHandle
.
getIndexTransaction
(
indexType
.
getBackingIndexName
()).
restore
(
documentsPerStore
);
}
}
}
}
}
This diff is collapsed.
Click to expand it.
intg/src/main/java/org/apache/atlas/AtlasConfiguration.java
View file @
dc9e2689
...
@@ -73,7 +73,8 @@ public enum AtlasConfiguration {
...
@@ -73,7 +73,8 @@ public enum AtlasConfiguration {
LINEAGE_USING_GREMLIN
(
"atlas.lineage.query.use.gremlin"
,
false
),
LINEAGE_USING_GREMLIN
(
"atlas.lineage.query.use.gremlin"
,
false
),
HTTP_HEADER_SERVER_VALUE
(
"atlas.http.header.server.value"
,
"Apache Atlas"
),
HTTP_HEADER_SERVER_VALUE
(
"atlas.http.header.server.value"
,
"Apache Atlas"
),
STORAGE_CONSISTENCY_LOCK_ENABLED
(
"atlas.graph.storage.consistency-lock.enabled"
,
true
);
STORAGE_CONSISTENCY_LOCK_ENABLED
(
"atlas.graph.storage.consistency-lock.enabled"
,
true
),
REINDEX_PATCH_ENABLED
(
"atlas.patch.reindex.enabled"
,
false
);
private
static
final
Configuration
APPLICATION_PROPERTIES
;
private
static
final
Configuration
APPLICATION_PROPERTIES
;
...
...
This diff is collapsed.
Click to expand it.
repository/src/main/java/org/apache/atlas/repository/patches/AtlasPatchManager.java
View file @
dc9e2689
...
@@ -54,7 +54,8 @@ public class AtlasPatchManager {
...
@@ -54,7 +54,8 @@ public class AtlasPatchManager {
new
ClassificationTextPatch
(
context
),
new
ClassificationTextPatch
(
context
),
new
FreeTextRequestHandlerPatch
(
context
),
new
FreeTextRequestHandlerPatch
(
context
),
new
SuggestionsRequestHandlerPatch
(
context
),
new
SuggestionsRequestHandlerPatch
(
context
),
new
IndexConsistencyPatch
(
context
)
new
IndexConsistencyPatch
(
context
),
new
ReIndexPatch
(
context
)
};
};
try
{
try
{
...
...
This diff is collapsed.
Click to expand it.
repository/src/main/java/org/apache/atlas/repository/patches/ConcurrentPatchProcessor.java
View file @
dc9e2689
...
@@ -43,8 +43,8 @@ public abstract class ConcurrentPatchProcessor {
...
@@ -43,8 +43,8 @@ public abstract class ConcurrentPatchProcessor {
private
static
final
String
BATCH_SIZE_PROPERTY
=
"atlas.patch.batchSize"
;
private
static
final
String
BATCH_SIZE_PROPERTY
=
"atlas.patch.batchSize"
;
private
static
final
String
ATLAS_SOLR_SHARDS
=
"ATLAS_SOLR_SHARDS"
;
private
static
final
String
ATLAS_SOLR_SHARDS
=
"ATLAS_SOLR_SHARDS"
;
private
static
final
String
WORKER_NAME_PREFIX
=
"patchWorkItem"
;
private
static
final
String
WORKER_NAME_PREFIX
=
"patchWorkItem"
;
p
rivate
static
final
int
NUM_WORKERS
;
p
ublic
static
final
int
NUM_WORKERS
;
p
rivate
static
final
int
BATCH_SIZE
;
p
ublic
static
final
int
BATCH_SIZE
;
private
final
EntityGraphMapper
entityGraphMapper
;
private
final
EntityGraphMapper
entityGraphMapper
;
private
final
AtlasGraph
graph
;
private
final
AtlasGraph
graph
;
...
@@ -61,7 +61,7 @@ public abstract class ConcurrentPatchProcessor {
...
@@ -61,7 +61,7 @@ public abstract class ConcurrentPatchProcessor {
numWorkers
=
config
.
getInt
(
NUM_WORKERS_PROPERTY
,
config
.
getInt
(
ATLAS_SOLR_SHARDS
,
1
)
*
3
);
numWorkers
=
config
.
getInt
(
NUM_WORKERS_PROPERTY
,
config
.
getInt
(
ATLAS_SOLR_SHARDS
,
1
)
*
3
);
batchSize
=
config
.
getInt
(
BATCH_SIZE_PROPERTY
,
300
);
batchSize
=
config
.
getInt
(
BATCH_SIZE_PROPERTY
,
300
);
LOG
.
info
(
"
UniqueAttributePatch
: {}={}, {}={}"
,
NUM_WORKERS_PROPERTY
,
numWorkers
,
BATCH_SIZE_PROPERTY
,
batchSize
);
LOG
.
info
(
"
ConcurrentPatchProcessor
: {}={}, {}={}"
,
NUM_WORKERS_PROPERTY
,
numWorkers
,
BATCH_SIZE_PROPERTY
,
batchSize
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
LOG
.
error
(
"Error retrieving configuration."
,
e
);
LOG
.
error
(
"Error retrieving configuration."
,
e
);
}
}
...
...
This diff is collapsed.
Click to expand it.
repository/src/main/java/org/apache/atlas/repository/patches/ReIndexPatch.java
0 → 100644
View file @
dc9e2689
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
apache
.
atlas
.
repository
.
patches
;
import
org.apache.atlas.AtlasConfiguration
;
import
org.apache.atlas.exception.AtlasBaseException
;
import
org.apache.atlas.pc.WorkItemBuilder
;
import
org.apache.atlas.pc.WorkItemConsumer
;
import
org.apache.atlas.pc.WorkItemManager
;
import
org.apache.atlas.repository.Constants
;
import
org.apache.atlas.repository.graphdb.AtlasElement
;
import
org.apache.atlas.repository.graphdb.AtlasGraph
;
import
org.apache.atlas.repository.graphdb.AtlasVertex
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.ArrayList
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.concurrent.BlockingQueue
;
import
java.util.concurrent.atomic.AtomicLong
;
import
java.util.function.BiConsumer
;
import
static
org
.
apache
.
atlas
.
model
.
patches
.
AtlasPatch
.
PatchStatus
.
UNKNOWN
;
public
class
ReIndexPatch
extends
AtlasPatchHandler
{
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
ReIndexPatch
.
class
);
private
static
final
String
PATCH_ID
=
"JAVA_PATCH_0000_006"
;
private
static
final
String
PATCH_DESCRIPTION
=
"Performs reindex on all the indexes."
;
private
final
PatchContext
context
;
public
ReIndexPatch
(
PatchContext
context
)
{
super
(
context
.
getPatchRegistry
(),
PATCH_ID
,
PATCH_DESCRIPTION
);
this
.
context
=
context
;
}
@Override
public
void
apply
()
throws
AtlasBaseException
{
if
(
AtlasConfiguration
.
REINDEX_PATCH_ENABLED
.
getBoolean
()
==
false
)
{
return
;
}
try
{
LOG
.
info
(
"ReIndexPatch: Starting..."
);
ReindexPatchProcessor
reindexPatchProcessor
=
new
ReindexPatchProcessor
(
context
);
reindexPatchProcessor
.
repairVertices
();
reindexPatchProcessor
.
repairEdges
();
}
catch
(
Exception
exception
)
{
LOG
.
error
(
"Error while reindexing."
,
exception
);
}
finally
{
LOG
.
info
(
"ReIndexPatch: Done!"
);
}
setStatus
(
UNKNOWN
);
LOG
.
info
(
"ReIndexPatch.apply(): patchId={}, status={}"
,
getPatchId
(),
getStatus
());
}
public
static
class
ReindexPatchProcessor
{
private
static
String
[]
vertexIndexNames
=
new
String
[]{
Constants
.
VERTEX_INDEX
,
Constants
.
FULLTEXT_INDEX
};
private
static
String
[]
edgeIndexNames
=
new
String
[]{
Constants
.
EDGE_INDEX
};
private
static
String
WORKER_PREFIX
=
"reindex"
;
private
PatchContext
context
;
public
ReindexPatchProcessor
(
PatchContext
context
)
{
this
.
context
=
context
;
}
public
void
repairVertices
()
{
repairElements
(
ReindexPatchProcessor:
:
vertices
,
vertexIndexNames
);
}
public
void
repairEdges
()
{
repairElements
(
ReindexPatchProcessor:
:
edges
,
edgeIndexNames
);
}
private
void
repairElements
(
BiConsumer
<
WorkItemManager
,
AtlasGraph
>
action
,
String
[]
indexNames
)
{
WorkItemManager
manager
=
new
WorkItemManager
(
new
ReindexConsumerBuilder
(
context
.
getGraph
(),
indexNames
),
WORKER_PREFIX
,
ConcurrentPatchProcessor
.
BATCH_SIZE
,
ConcurrentPatchProcessor
.
NUM_WORKERS
,
false
);
try
{
LOG
.
info
(
"repairElements.execute(): {}: Starting..."
,
indexNames
);
action
.
accept
(
manager
,
context
.
getGraph
());
manager
.
drain
();
}
finally
{
try
{
manager
.
shutdown
();
}
catch
(
InterruptedException
e
)
{
LOG
.
error
(
"repairEdges.execute(): interrupted during WorkItemManager shutdown."
,
e
);
}
LOG
.
info
(
"repairElements.execute(): {}: Done!"
,
indexNames
);
}
}
private
static
void
edges
(
WorkItemManager
manager
,
AtlasGraph
graph
)
{
Iterable
<
Object
>
iterable
=
graph
.
getEdges
();
for
(
Iterator
<
Object
>
iter
=
iterable
.
iterator
();
iter
.
hasNext
();
)
{
manager
.
checkProduce
(
iter
.
next
());
}
}
private
static
void
vertices
(
WorkItemManager
manager
,
AtlasGraph
graph
)
{
Iterable
<
AtlasVertex
>
iterable
=
graph
.
getVertices
();
for
(
Iterator
<
AtlasVertex
>
iter
=
iterable
.
iterator
();
iter
.
hasNext
();
)
{
AtlasVertex
vertex
=
iter
.
next
();
manager
.
checkProduce
(
vertex
);
}
}
}
private
static
class
ReindexConsumerBuilder
implements
WorkItemBuilder
<
ReindexConsumer
,
AtlasElement
>
{
private
AtlasGraph
graph
;
private
String
[]
indexNames
;
public
ReindexConsumerBuilder
(
AtlasGraph
graph
,
String
[]
indexNames
)
{
this
.
graph
=
graph
;
this
.
indexNames
=
indexNames
;
}
@Override
public
ReindexConsumer
build
(
BlockingQueue
queue
)
{
return
new
ReindexConsumer
(
queue
,
this
.
graph
,
this
.
indexNames
);
}
}
private
static
class
ReindexConsumer
extends
WorkItemConsumer
<
AtlasElement
>
{
private
List
<
AtlasElement
>
list
=
new
ArrayList
();
private
AtlasGraph
graph
;
private
String
[]
indexNames
;
private
final
AtomicLong
counter
;
public
ReindexConsumer
(
BlockingQueue
queue
,
AtlasGraph
graph
,
String
[]
indexNames
)
{
super
(
queue
);
this
.
graph
=
graph
;
this
.
indexNames
=
indexNames
;
this
.
counter
=
new
AtomicLong
(
0
);
}
@Override
protected
void
doCommit
()
{
if
(
list
.
size
()
>=
ConcurrentPatchProcessor
.
BATCH_SIZE
)
{
attemptCommit
();
}
}
@Override
protected
void
commitDirty
()
{
attemptCommit
();
LOG
.
info
(
"Total: Commit: {}"
,
counter
.
get
());
super
.
commitDirty
();
}
private
void
attemptCommit
()
{
for
(
String
indexName
:
indexNames
)
{
try
{
this
.
graph
.
getManagementSystem
().
reindex
(
indexName
,
list
);
}
catch
(
IllegalStateException
e
)
{
LOG
.
error
(
"IllegalStateException: Exception"
,
e
);
return
;
}
catch
(
Exception
exception
)
{
LOG
.
error
(
"Exception: {}"
,
indexName
,
exception
);
}
}
list
.
clear
();
LOG
.
info
(
"Processed: {}"
,
counter
.
get
());
}
@Override
protected
void
processItem
(
AtlasElement
item
)
{
counter
.
incrementAndGet
();
list
.
add
(
item
);
commit
();
}
}
}
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment