Dhamo
Dhamo

Reputation: 1251

Karate - Multi threaded access requested - issue

I have 100+ tests being covered in 25+ feature files and I have the karate-config.js which has 3 "karate.callSingle" functions as below.

config.weatherParams = karate.callSingle(
    "file:src/test/java/utils/AvailableForecasts.feature",
    config
  );
  config.routingParams = karate.callSingle(
    "file:src/test/java/utils/CalculationInput.feature",
    config
  );

  config.vesselParams = karate.callSingle(
    "file:src/test/java/utils/VesselStatus.feature",
    config
  );

Same issue when I use classpath inside callSingle.

When I run all the tests at once with parallel (tried randomly 1-100 threads) enabled, I get the following error:

org.graalvm.polyglot.PolyglotException: Multi threaded access requested by thread Thread[pool-2-thread-8,5,main] but is not allowed for language(s) js.
- com.oracle.truffle.polyglot.PolyglotEngineException.illegalState(PolyglotEngineException.java:132)
- com.oracle.truffle.polyglot.PolyglotContextImpl.throwDeniedThreadAccess(PolyglotContextImpl.java:727)
- com.oracle.truffle.polyglot.PolyglotContextImpl.checkAllThreadAccesses(PolyglotContextImpl.java:627)
- com.oracle.truffle.polyglot.PolyglotContextImpl.enterThreadChanged(PolyglotContextImpl.java:526)
- com.oracle.truffle.polyglot.PolyglotEngineImpl.enter(PolyglotEngineImpl.java:1857)
- com.oracle.truffle.polyglot.HostToGuestRootNode.execute(HostToGuestRootNode.java:104)
- com.oracle.truffle.polyglot.PolyglotMap.entrySet(PolyglotMap.java:119)

After playing around with multiple combinations- surprisingly, when I have only 2 "callSingle" functions in karate.config (commenting VesselStatus.feature) then it works fine.

All these 3 "callSingle" things calling 3 different services and sets the variable for other tests to run, so these 3 are critical.

Is there a way, we can re-optimize / bring a different approach to avoid the above issue?

Upvotes: 2

Views: 2111

Answers (2)

saurabh gupta
saurabh gupta

Reputation: 21

I faced this issue in my karate implementation @peter-thomas. I just got an easy workaround for this issue since we know that graalVM js engine doesnt support multithreading of karate-config.js

work around is - we can wait for a certain milliseconds and that milliseconds has to be genrated randomly.

below code inside karate-config.js have a look please -

function fn(){

// karate-config essential coding

    var random_millis = Math.floor(Math.random() * 5000 - 1000 +1 )) + 1000;
    java.lang.Thread.sleep(random_millis);
    
    return something;
    
    }

with above piece of code i tried my 100+ feature files running with 20 parrellal threads with karate 1.2.0.RC1 and it worked fantastically fine.

How its working - all the 20 threads will jump altogether , reaching karate-config at the same time. but if we apply some delay that too random between 1 to 5 seconds (in millis) , all threads will wait for different time avoiding multithreading issue.

I also know that between 1 to 5000 millisends , still there are suppose 1% chances that we get same numbers but till we get concrete solution of this issue i guess we can use this workaround.

Thanks, Saurabh

Upvotes: 2

Peter Thomas
Peter Thomas

Reputation: 58058

This is a known issue that should be fixed in 1.1.0.RC2

Details here: https://github.com/intuit/karate/issues/1558

Would be good if you can confirm.

Upvotes: 1

Related Questions