You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "xifenghz (JIRA)" <ji...@apache.org> on 2018/07/11 11:18:00 UTC

[jira] [Comment Edited] (TINKERPOP-2003) After a long period (almost 5days)of parallel requests(almost 200 request per second),client.submit blocked

    [ https://issues.apache.org/jira/browse/TINKERPOP-2003?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16539908#comment-16539908 ] 

xifenghz edited comment on TINKERPOP-2003 at 7/11/18 11:17 AM:
---------------------------------------------------------------

Sorry for not show the context for my code in detail.In my code,the cluster and client is singleton in my application.I just use this client to submit gremlin request in parallel.

 

In a restful API based on SpringPVC,I call the submit method:

List<Result> results = Service.getInstance().submit(command);

 

Below is how the class Sevice defines.

 

_public class Service{_

_private static final Logger logger = LoggerFactory.getLogger(Service.class);_
 _private static final Service INSTANCE = new Service();_
 _private Cluster cluster;_
 _private Client client;_
 _private String configPath = "remote.yaml";_
 _private Service(){_
 _try {_
 _ClassLoader configClassLoader = this.getClass().getClassLoader();_
 _URL config = null;_
 _if (configClassLoader != null) {_
 _config = configClassLoader.getResource(configPath);_
 _}_
 _if (config == null) {_
 _logger.error("cannot find config file: " + configPath);_
 _return ;_
 _}_
 _cluster = Cluster.build(FileUtils.toFile(config)).create();_
 _logger.info("create Cluster success");_
 _client = cluster.connect();_
 _logger.info("create Client success");_
 _} catch (FileNotFoundException e) {_
 _logger.error("config file is not found: ", configPath);_
 _logger.error(ExceptionUtils.getStackTrace(e));_
 _}_
 _}_

_public static Service getInstance() {_
 _return INSTANCE;_
 _}_

_public List<Result> submit(final String gremlinScript) throws GremlinServiceException {_
 _if (!isConnected()) {_
 _throw new GremlinServiceException("ConfigFile remote.yaml not found", GraphErrorCode.GraphErr.GREMLIN_CONFIG_FILE_NOT_FOUND);_
 _}_
 _logger.debug("submit script to gremlin server: " + gremlinScript);_

_ResultSet resultSet = null;_
 _synchronized (Service.class)_
 _{_
 _resultSet = client.submit(gremlinScript);_
 _}_
 _CompletableFuture<List<Result>> future = null;_
 _List<Result> results = null;_
 _if (resultSet != null) {_
 _future = resultSet.all();_
 _}_
 _if (future != null) {_
 _try {_
 _results = future.get();_
 _} catch (InterruptedException e) {_
 _logger.error("interrupted from gremlin server error: " + gremlinScript);_
 _throw new GremlinServiceException(e.getMessage(), GraphErrorCode.GraphErr.GREMLIN_QUERY_EXECUTE_FAILED);_
 _} catch (ExecutionException e) {_
 _logger.error("execution from gremlin server error: " + gremlinScript);_
 _throw new GremlinServiceException(e.getMessage(), GraphErrorCode.GraphErr.GREMLIN_QUERY_EXECUTE_ERROR);_
 _}_
 _}_
 _return results;_
 _}_

_}_


was (Author: hz):
Sorry for not show the context for my code in detail.

In a restful API based on SpringPVC,I call the submit method:

List<Result> results = Service.getInstance().submit(command);

 

Below is how the class Sevice defines.

 

_public class Service{_

_private static final Logger logger = LoggerFactory.getLogger(Service.class);_
 _private static final Service INSTANCE = new Service();_
 _private Cluster cluster;_
 _private Client client;_
 _private String configPath = "remote.yaml";_
 _private Service(){_
 _try {_
 _ClassLoader configClassLoader = this.getClass().getClassLoader();_
 _URL config = null;_
 _if (configClassLoader != null) {_
 _config = configClassLoader.getResource(configPath);_
 _}_
 _if (config == null) {_
 _logger.error("cannot find config file: " + configPath);_
 _return ;_
 _}_
 _cluster = Cluster.build(FileUtils.toFile(config)).create();_
 _logger.info("create Cluster success");_
 _client = cluster.connect();_
 _logger.info("create Client success");_
 _} catch (FileNotFoundException e) {_
 _logger.error("config file is not found: ", configPath);_
 _logger.error(ExceptionUtils.getStackTrace(e));_
 _}_
 _}_

_public static Service getInstance() {_
 _return INSTANCE;_
 _}_
 
 _public List<Result> submit(final String gremlinScript) throws GremlinServiceException {_
 _if (!isConnected()) {_
 _throw new GremlinServiceException("ConfigFile remote.yaml not found", GraphErrorCode.GraphErr.GREMLIN_CONFIG_FILE_NOT_FOUND);_
 _}_
 _logger.debug("submit script to gremlin server: " + gremlinScript);_

_ResultSet resultSet = null;_
 _synchronized (Service.class)_
 _{_
 _resultSet = client.submit(gremlinScript);_
 _}_
 _CompletableFuture<List<Result>> future = null;_
 _List<Result> results = null;_
 _if (resultSet != null) {_
 _future = resultSet.all();_
 _}_
 _if (future != null) {_
 _try {_
 _results = future.get();_
 _} catch (InterruptedException e) {_
 _logger.error("interrupted from gremlin server error: " + gremlinScript);_
 _throw new GremlinServiceException(e.getMessage(), GraphErrorCode.GraphErr.GREMLIN_QUERY_EXECUTE_FAILED);_
 _} catch (ExecutionException e) {_
 _logger.error("execution from gremlin server error: " + gremlinScript);_
 _throw new GremlinServiceException(e.getMessage(), GraphErrorCode.GraphErr.GREMLIN_QUERY_EXECUTE_ERROR);_
 _}_
 _}_
 _return results;_
 _}_

_}_

> After a long period (almost 5days)of parallel requests(almost 200 request per second),client.submit blocked
> -----------------------------------------------------------------------------------------------------------
>
>                 Key: TINKERPOP-2003
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-2003
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: driver
>    Affects Versions: 3.3.0
>            Reporter: xifenghz
>            Priority: Major
>
> After a long period (almost 5days)of parallel requests(almost 200 request per second),client.submit blocked for scriptEvaluationTimeout configured,and return timeout.At the same time,many TCP connections in Gremlin Server are in CLOSE_WAIT state.
> Here is my usages:
> cluster = Cluster.build(FileUtils.toFile(config)).create();
>  client = cluster.connect();
>  ResultSet resultSet = null;
>  {color:#ff0000}synchronized (Service.class){color}
> { resultSet = client.submit(gremlinScript); }
> CompletableFuture<List<Result>> future = null;
>  List<Result> results = null;
>  future = resultSet.all();
>  results = future.get();
>  
> The code snippet above runs in a java web app based on SpringMVC.I found a PR related to my question.
> [https://github.com/apache/tinkerpop/pull/367/commits/58d8bade7425c7a7865382990eaaed2b7d90659c#diff-06d5dfb02d5d2c807c2387c3e9338709]
> In this PR,the author seems to say gremlin doer not support high concurrency。
> {color:#ff0000}Removed recommendations for submitting parallel requests on a session from docs.{color}
> {color:#333333}So,I submit the gremlin script in order(use synchronized keyword,just as my code snippet ).But in order to lift throughput,I do not lock the code for getting result from Gremlin Server。I want to know some details about how Gremlin Server receive and process requests,such as the receiver and executor threads are the same one?If so ,the Gremlin server can only process the requests one by one ? {color}
> {color:#333333}I wonder whether or not Gremlin supports high concurrency(such as 200 second per second,including simple vertex or edge queries and complex combinatorial queries).If so,please help to find out why the process time for a simple script such as query vertex exceed scriptEvaluationTimeout. If not,is there other ways to make Gremlin Server support  high concurrency,such as multi-gremlinserver。{color}
> Thank you sincerely for your help。
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)