gentics / gentics/mesh

Revoking/Granting Permissions in parallel leads to conflict errors

Open
#382 1 comment 0 reactions 0 assignees View on GitHub
bug f/elasticsearch minor stability
Dominant language
Java
Stars
593
Forks
123
Avg merge
2d 18h
Merged PRs (30d)
4

Description

## Gentics Mesh Version, operating system, or hardware.
- v0.14.1

## Operating System
- Linux

## Problem
When revoking/granting permissions in parallel on the same node for different roles, I got this error:
```
2018-03-19 13:08:43,694 [TVC Prod] ERROR [ElasticSearchProvider.java:372] - Updating object {840a08262c1243158a08262c12f3159f:default} to index failed. Duration 6[ms]
org.elasticsearch.index.engine.VersionConflictEngineException: [default][840a08262c1243158a08262c12f3159f]: version conflict, current [2], provided [1]
at org.elasticsearch.index.engine.InternalEngine.innerIndex(InternalEngine.java:514) ~[tvc-server.jar:na]
at org.elasticsearch.index.engine.InternalEngine.index(InternalEngine.java:454) ~[tvc-server.jar:na]
at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:605) ~[tvc-server.jar:na]
at org.elasticsearch.index.engine.Engine$Index.execute(Engine.java:836) ~[tvc-server.jar:na]
at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:236) ~[tvc-server.jar:na]
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:157) ~[tvc-server.jar:na]
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:66) ~[tvc-server.jar:na]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:657) ~[tvc-server.jar:na]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [tvc-server.jar:na]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:287) ~[tvc-server.jar:na]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279) ~[tvc-server.jar:na]
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:77) ~[tvc-server.jar:na]
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:378) ~[tvc-server.jar:na]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) [tvc-server.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_111-internal]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_111-internal]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111-internal]
2018-03-19 13:08:43,695 [TVC Prod] ERROR [SearchQueueBatchImpl.java:278] - Error while processing batch {null}
2018-03-19 13:08:43,702 [TVC Prod] ERROR [OrientDBDatabase.java:862] - Error handling transaction
org.elasticsearch.index.engine.VersionConflictEngineException: [default][840a08262c1243158a08262c12f3159f]: version conflict, current [2], provided [1]
at org.elasticsearch.index.engine.InternalEngine.innerIndex(InternalEngine.java:514) ~[tvc-server.jar:na]
at org.elasticsearch.index.engine.InternalEngine.index(InternalEngine.java:454) ~[tvc-server.jar:na]
at org.elasticsearch.index.shard.IndexShard.index(IndexShard.java:605) ~[tvc-server.jar:na]
at org.elasticsearch.index.engine.Engine$Index.execute(Engine.java:836) ~[tvc-server.jar:na]
at org.elasticsearch.action.index.TransportIndexAction.executeIndexRequestOnPrimary(TransportIndexAction.java:236) ~[tvc-server.jar:na]
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:157) ~[tvc-server.jar:na]
at org.elasticsearch.action.index.TransportIndexAction.shardOperationOnPrimary(TransportIndexAction.java:66) ~[tvc-server.jar:na]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryPhase.doRun(TransportReplicationAction.java:657) ~[tvc-server.jar:na]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[tvc-server.jar:na]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:287) ~[tvc-server.jar:na]
at org.elasticsearch.action.support.replication.TransportReplicationAction$PrimaryOperationTransportHandler.messageReceived(TransportReplicationAction.java:279) ~[tvc-server.jar:na]
at org.elasticsearch.transport.RequestHandlerRegistry.processMessageReceived(RequestHandlerRegistry.java:77) ~[tvc-server.jar:na]
at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:378) ~[tvc-server.jar:na]
at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37) ~[tvc-server.jar:na]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_111-internal]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_111-internal]
at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_111-internal]
```

## Reproducer
* Create a node
* Create about 100 Roles
* Write a script to grant all roles permissions to the node. Make sure the requests are run in parallel.

## Expected behaviour and actual behaviour
I expected all the roles to have permissions to the node. Instead I got the above conflict error message.

## Additional Info
I did not expect a conflict error on permission changes. This probably happens because the read permission is saved in the Elasticsearch document. One solution would be to use [scripted updates](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html) with the `retry_on_conflict` parameter.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.