Java com.google.appengine.api.datastore.DatastoreFailureException:意外故障

Java com.google.appengine.api.datastore.DatastoreFailureException:意外故障,java,google-app-engine,junit,jbehave,Java,Google App Engine,Junit,Jbehave,我在尝试使用google App Engine实现时遇到异常com.google.appengine.api.datastore.DatastoreFailureException:Unexpected failure。jBehave基本上是在junit之上运行的,所以我认为jBehave本身不是问题所在 在测试的每3次运行中,大约有1次会抛出此异常。我认为这可能是与LocalServiceTestHelper的一致性问题,因此我尝试以各种方式配置LocalServiceTestHelper,通

我在尝试使用google App Engine实现时遇到异常
com.google.appengine.api.datastore.DatastoreFailureException:Unexpected failure
。jBehave基本上是在junit之上运行的,所以我认为jBehave本身不是问题所在

在测试的每3次运行中,大约有1次会抛出此异常。我认为这可能是与LocalServiceTestHelper的一致性问题,因此我尝试以各种方式配置LocalServiceTestHelper,通过确保数据进入数据库并可以为测试目的而读回,从而简化测试

试试#1:

试试#2:

试试#3:

然而,所有这些尝试都导致了相同的问题,即大约每3次测试运行中就有1次出现DatastoreFailureException

以下是完整的堆栈跟踪:

Processing system properties {}
Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=false,ignoreFailureInView=false,verboseFailures=false,verboseFiltering=false,storyTimeoutInSecs=300,failOnStoryTimeout=false,threads=1]

(BeforeStories)

Running story com/uluvit/backend/acceptance/user_can_log_in_using_email.story
User can send assumption what its partner think
(com/uluvit/backend/acceptance/user_can_log_in_using_email.story)
Narrative:
As a user
I want to log in using my email account which was registered before
So that I can start playing
Scenario: 

(AfterStories)

Generating reports view to '/Users/mosofsky/Developer/UluvitServer/uluvit-backend-war/target/jbehave' using formats '[stats, console, txt]' and view properties '{navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, reports=ftl/jbehave-reports-with-totals.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl, decorated=ftl/jbehave-report-decorated.ftl, maps=ftl/jbehave-maps.ftl}'
Given A user John Test with email john@test.com and password test123 (FAILED)
(com.google.appengine.api.datastore.DatastoreFailureException: Unexpected failure)
Nov 11, 2014 3:38:08 AM com.google.appengine.api.datastore.dev.LocalDatastoreService init
INFO: Local Datastore initialized: 
    Type: Master/Slave
    Storage: In-memory
When I log in using email john@test.com and password test123 (NOT PERFORMED)
Then I should see main screen (NOT PERFORMED)


org.jbehave.core.failures.UUIDExceptionWrapper: Given A user John Test with email john@test.com and password test123
    at org.jbehave.core.steps.StepCreator$ParametrisedStep.perform(StepCreator.java:609)
    at org.jbehave.core.embedder.StoryRunner$FineSoFar.run(StoryRunner.java:535)
    at org.jbehave.core.embedder.StoryRunner.runStepsWhileKeepingState(StoryRunner.java:515)
    at org.jbehave.core.embedder.StoryRunner.runScenarioSteps(StoryRunner.java:479)
    at org.jbehave.core.embedder.StoryRunner.runStepsWithLifecycle(StoryRunner.java:445)
    at org.jbehave.core.embedder.StoryRunner.runCancellable(StoryRunner.java:305)
    at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:220)
    at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:181)
    at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:255)
    at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.appengine.api.datastore.DatastoreFailureException: Unexpected failure
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:74)
    at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32)
    at com.google.appengine.api.datastore.QueryResultsSourceImpl.peekQueryResultAndIfFirstRecordIndexList(QueryResultsSourceImpl.java:161)
    at com.google.appengine.api.datastore.QueryResultsSourceImpl.loadMoreEntities(QueryResultsSourceImpl.java:104)
    at com.google.appengine.api.datastore.QueryResultsSourceImpl.loadMoreEntities(QueryResultsSourceImpl.java:91)
    at com.google.appengine.api.datastore.QueryResultIteratorImpl.ensureLoaded(QueryResultIteratorImpl.java:142)
    at com.google.appengine.api.datastore.QueryResultIteratorImpl.hasNext(QueryResultIteratorImpl.java:62)
    at com.googlecode.objectify.impl.KeysOnlyIterator.hasNext(KeysOnlyIterator.java:29)
    at com.googlecode.objectify.impl.ChunkIterator.next(ChunkIterator.java:48)
    at com.googlecode.objectify.impl.ChunkIterator.next(ChunkIterator.java:20)
    at com.google.common.collect.Iterators$5.hasNext(Iterators.java:548)
    at com.google.common.collect.Iterators$PeekingImpl.hasNext(Iterators.java:1149)
    at com.googlecode.objectify.impl.ChunkingIterator.hasNext(ChunkingIterator.java:51)
    at com.google.common.collect.Iterators.addAll(Iterators.java:361)
    at com.google.common.collect.Lists.newArrayList(Lists.java:160)
    at com.google.common.collect.Lists.newArrayList(Lists.java:144)
    at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:21)
    at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:11)
    at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
    at com.googlecode.objectify.util.ResultProxy.invoke(ResultProxy.java:34)
    at com.sun.proxy.$Proxy37.size(Unknown Source)
    at com.uluvit.backend.domain.repository.GoogleStoreUserRepository.findByEmail(GoogleStoreUserRepository.java:59)
    at com.uluvit.backend.domain.repository.GoogleStoreUserRepository.persist(GoogleStoreUserRepository.java:25)
    at com.uluvit.backend.acceptance.UluvitSteps.givenAUserWithEmailAndPassword(UluvitSteps.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.jbehave.core.steps.StepCreator$ParametrisedStep.perform(StepCreator.java:595)
    ... 13 more
Caused by: java.lang.InterruptedException
    at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:400)
    at java.util.concurrent.FutureTask.get(FutureTask.java:187)
    at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction$1.get(ApiProxyLocalImpl.java:304)
    at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction$1.get(ApiProxyLocalImpl.java:271)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:86)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:86)
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:71)
    ... 42 more
Reports view generated with 0 stories (of which 0 pending) containing 0 scenarios (of which 0 pending)

从JBehave 3.9.4升级到3.9.5修复了此问题。它还解决了这个问题:

一个线索是本地数据存储的类型是Master/Slave,而不是高复制。请参阅堆栈跟踪中的行
Type:Master/Slave
。要切换到高复制,请参阅和。根据其他测试,我看到Try 1和Try 2使用主/从,而Try 3使用高复制。大概这三种情况下都发生了
DatastoreFailureException
private final LocalServiceTestHelper helper =
    new LocalServiceTestHelper((new LocalDatastoreServiceTestConfig())
        .setDefaultHighRepJobPolicyUnappliedJobPercentage(0));
private final LocalServiceTestHelper helper =
        new LocalServiceTestHelper((new LocalDatastoreServiceTestConfig())
.setApplyAllHighRepJobPolicy());
Processing system properties {}
Using controls EmbedderControls[batch=false,skip=false,generateViewAfterStories=true,ignoreFailureInStories=false,ignoreFailureInView=false,verboseFailures=false,verboseFiltering=false,storyTimeoutInSecs=300,failOnStoryTimeout=false,threads=1]

(BeforeStories)

Running story com/uluvit/backend/acceptance/user_can_log_in_using_email.story
User can send assumption what its partner think
(com/uluvit/backend/acceptance/user_can_log_in_using_email.story)
Narrative:
As a user
I want to log in using my email account which was registered before
So that I can start playing
Scenario: 

(AfterStories)

Generating reports view to '/Users/mosofsky/Developer/UluvitServer/uluvit-backend-war/target/jbehave' using formats '[stats, console, txt]' and view properties '{navigator=ftl/jbehave-navigator.ftl, views=ftl/jbehave-views.ftl, reports=ftl/jbehave-reports-with-totals.ftl, nonDecorated=ftl/jbehave-report-non-decorated.ftl, decorated=ftl/jbehave-report-decorated.ftl, maps=ftl/jbehave-maps.ftl}'
Given A user John Test with email john@test.com and password test123 (FAILED)
(com.google.appengine.api.datastore.DatastoreFailureException: Unexpected failure)
Nov 11, 2014 3:38:08 AM com.google.appengine.api.datastore.dev.LocalDatastoreService init
INFO: Local Datastore initialized: 
    Type: Master/Slave
    Storage: In-memory
When I log in using email john@test.com and password test123 (NOT PERFORMED)
Then I should see main screen (NOT PERFORMED)


org.jbehave.core.failures.UUIDExceptionWrapper: Given A user John Test with email john@test.com and password test123
    at org.jbehave.core.steps.StepCreator$ParametrisedStep.perform(StepCreator.java:609)
    at org.jbehave.core.embedder.StoryRunner$FineSoFar.run(StoryRunner.java:535)
    at org.jbehave.core.embedder.StoryRunner.runStepsWhileKeepingState(StoryRunner.java:515)
    at org.jbehave.core.embedder.StoryRunner.runScenarioSteps(StoryRunner.java:479)
    at org.jbehave.core.embedder.StoryRunner.runStepsWithLifecycle(StoryRunner.java:445)
    at org.jbehave.core.embedder.StoryRunner.runCancellable(StoryRunner.java:305)
    at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:220)
    at org.jbehave.core.embedder.StoryRunner.run(StoryRunner.java:181)
    at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:255)
    at org.jbehave.core.embedder.StoryManager$EnqueuedStory.call(StoryManager.java:222)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.google.appengine.api.datastore.DatastoreFailureException: Unexpected failure
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:74)
    at com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32)
    at com.google.appengine.api.datastore.QueryResultsSourceImpl.peekQueryResultAndIfFirstRecordIndexList(QueryResultsSourceImpl.java:161)
    at com.google.appengine.api.datastore.QueryResultsSourceImpl.loadMoreEntities(QueryResultsSourceImpl.java:104)
    at com.google.appengine.api.datastore.QueryResultsSourceImpl.loadMoreEntities(QueryResultsSourceImpl.java:91)
    at com.google.appengine.api.datastore.QueryResultIteratorImpl.ensureLoaded(QueryResultIteratorImpl.java:142)
    at com.google.appengine.api.datastore.QueryResultIteratorImpl.hasNext(QueryResultIteratorImpl.java:62)
    at com.googlecode.objectify.impl.KeysOnlyIterator.hasNext(KeysOnlyIterator.java:29)
    at com.googlecode.objectify.impl.ChunkIterator.next(ChunkIterator.java:48)
    at com.googlecode.objectify.impl.ChunkIterator.next(ChunkIterator.java:20)
    at com.google.common.collect.Iterators$5.hasNext(Iterators.java:548)
    at com.google.common.collect.Iterators$PeekingImpl.hasNext(Iterators.java:1149)
    at com.googlecode.objectify.impl.ChunkingIterator.hasNext(ChunkingIterator.java:51)
    at com.google.common.collect.Iterators.addAll(Iterators.java:361)
    at com.google.common.collect.Lists.newArrayList(Lists.java:160)
    at com.google.common.collect.Lists.newArrayList(Lists.java:144)
    at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:21)
    at com.googlecode.objectify.util.MakeListResult.translate(MakeListResult.java:11)
    at com.googlecode.objectify.util.ResultTranslator.nowUncached(ResultTranslator.java:21)
    at com.googlecode.objectify.util.ResultCache.now(ResultCache.java:30)
    at com.googlecode.objectify.util.ResultProxy.invoke(ResultProxy.java:34)
    at com.sun.proxy.$Proxy37.size(Unknown Source)
    at com.uluvit.backend.domain.repository.GoogleStoreUserRepository.findByEmail(GoogleStoreUserRepository.java:59)
    at com.uluvit.backend.domain.repository.GoogleStoreUserRepository.persist(GoogleStoreUserRepository.java:25)
    at com.uluvit.backend.acceptance.UluvitSteps.givenAUserWithEmailAndPassword(UluvitSteps.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.jbehave.core.steps.StepCreator$ParametrisedStep.perform(StepCreator.java:595)
    ... 13 more
Caused by: java.lang.InterruptedException
    at java.util.concurrent.FutureTask.awaitDone(FutureTask.java:400)
    at java.util.concurrent.FutureTask.get(FutureTask.java:187)
    at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction$1.get(ApiProxyLocalImpl.java:304)
    at com.google.appengine.tools.development.ApiProxyLocalImpl$PrivilegedApiAction$1.get(ApiProxyLocalImpl.java:271)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:86)
    at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:86)
    at com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:71)
    ... 42 more
Reports view generated with 0 stories (of which 0 pending) containing 0 scenarios (of which 0 pending)