Почему хранилище данных выдает тайм-аут при получении URL-адреса?

В течение короткого времени мой код, работающий в гибкой среде, «совместимый» с использованием Google Cloud Datastore API, столкнулся с java.net.SocketTimeoutException: тайм-аут при извлечении URL-адреса при вставке элемента в хранилище данных в другом проекте GAE.

Кроме того, в это время Dataflow не удалось вставить элементы; почти наверняка та же проблема.

Это также происходит с простыми ключевыми запросами, поэтому это не проблема больших данных.

До и после этого многие другие данные вставлялись правильно; включая повторный запуск по этим же данным.

Поиск ошибки в Google предполагает, что она может быть вызвана простоем в облаке Google, но панель мониторинга состояния Google Cloud отображается зеленым цветом.

Что вызвало это? Как мы можем избежать этого в будущем?

com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities run: ERROR in CopyEntities(commerceDocs/RFQ) java.lang.RuntimeException: com.google.cloud.datastore.DatastoreException: I/O error at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.retryIfAllowed(GCloudApiDSBackup.java:963) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntities(GCloudApiDSBackup.java:857) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.retryIfAllowed(GCloudApiDSBackup.java:959) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntities(GCloudApiDSBackup.java:857) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntitiesByParts(GCloudApiDSBackup.java:991) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.run(GCloudApiDSBackup.java:801) at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at 
java.util.concurrent.FutureTask.run(FutureTask.java:266) at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at 
java.lang.Thread.run(Thread.java:745) Caused by: com.google.cloud.datastore.DatastoreException: I/O error at 
com.google.cloud.datastore.spi.DefaultDatastoreRpc.translate(DefaultDatastoreRpc.java:105) at 
com.google.cloud.datastore.spi.DefaultDatastoreRpc.commit(DefaultDatastoreRpc.java:133) at 
com.google.cloud.datastore.DatastoreImpl$4.call(DatastoreImpl.java:390) at 
com.google.cloud.datastore.DatastoreImpl$4.call(DatastoreImpl.java:387) at 
com.google.cloud.RetryHelper.doRetry(RetryHelper.java:179) at 
com.google.cloud.RetryHelper.runWithRetries(RetryHelper.java:244) at 
com.google.cloud.datastore.DatastoreImpl.commit(DatastoreImpl.java:386) at 
com.google.cloud.datastore.DatastoreImpl.commitMutation(DatastoreImpl.java:380) at 
com.google.cloud.datastore.DatastoreImpl.put(DatastoreImpl.java:340) at 
com.freightos.backup.datastore.gcloudapi.GCloudApiDSBackup$CopyEntities.putEntities(GCloudApiDSBackup.java:836) ... 9 more Caused by: com.google.datastore.v1.client.DatastoreException: I/O error, code=UNAVAILABLE at 
com.google.datastore.v1.client.RemoteRpc.makeException(RemoteRpc.java:126) at 
com.google.datastore.v1.client.RemoteRpc.call(RemoteRpc.java:95) at 
com.google.datastore.v1.client.Datastore.commit(Datastore.java:84) at 
com.google.cloud.datastore.spi.DefaultDatastoreRpc.commit(DefaultDatastoreRpc.java:131) ... 17 more Caused by: java.net.SocketTimeoutException: Timeout while fetching URL: https://datastore.googleapis.com/v1/projects/freightos-prod-backup2:commit at 
com.google.appengine.api.urlfetch.URLFetchServiceImpl.convertApplicationException(URLFetchServiceImpl.java:173) at 
com.google.appengine.api.urlfetch.URLFetchServiceImpl.fetch(URLFetchServiceImpl.java:45) at 
com.google.api.client.extensions.appengine.http.UrlFetchRequest.execute(UrlFetchRequest.java:74) at 
com.google.api.client.http.HttpRequest.execute(HttpRequest.java:981) at 
com.google.datastore.v1.client.RemoteRpc.call(RemoteRpc.java:87) ... 19 more

person Joshua Fox    schedule 27.11.2016    source источник


Ответы (1)


Похоже, что UrlFetchTransport используется, когда этого не должно быть.

Я зарегистрировал эту проблему, чтобы исправить библиотеку google-cloud-java.

Тем временем вы должны иметь возможность заставить его использовать NetHttpTransport при создании объекта DatastoreOptions:

import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.auth.http.HttpTransportFactory;

DatastoreOptions.newBuilder()
    .setHttpTransportFactory(new HttpTransportFactory() {
      @Override
      public HttpTransport create() {
        return new NetHttpTransport();
      }
    })
    ...
person Ed Davisson    schedule 21.12.2016
comment
Я использую ‹groupId›com.google.cloud‹/groupId› ‹artifactId›gcloud-java-datastore‹/artifactId› ‹version›0.2.8‹/version› Но, видимо, вместо этого необходимы эти две зависимости Maven. ‹dependency› ‹groupId›com.google.cloud‹/groupId› ‹artifactId›google-cloud‹/artifactId› ‹version›0.8.0‹/version› ‹/dependency› … и… ‹dependency› ‹ groupId›com.google.auth‹/groupId› ‹artifactId›google-auth-library-oauth2-http‹/artifactId› ‹version›0.6.0‹/version› ‹/dependency› Это правильно? - person Joshua Fox; 22.12.2016
comment
С этими библиотеками код компилируется. Я изменил устаревшие методы. (См. pastebin.com/eZNmYmWw для форматированного кода и трассировки стека.) Я получаю java.lang.NoSuchMethodError: com. google.datastore.v1.Entity.getPropertiesMap()Ljava/util/Map; в этом коде: QueryResults‹Entity› results = datastore.run(query); в то время как (результаты.hasNext()) {... - person Joshua Fox; 22.12.2016
comment
Возможно ли, что в пути к классам есть более старая версия datastore-v1-protos? Метод getPropertiesMap() был добавлен в 1.2.0 (поэтому его не будет в 1.0.0 или 1.0.1). - person Ed Davisson; 22.12.2016
comment
Хранилище данных используется. Перетасовка зависимостей во избежание этого конфликта приводит к этой ошибке, препятствующей использованию com.google.cloud.dataflow.sdk.transform.DoFn. Тип com.google.protobuf.GeneratedMessageV3$Builder не может быть разрешен. На него косвенно ссылаются необходимые файлы .class. - person Joshua Fox; 22.12.2016
comment
Кажется, старая версия одной из библиотек все еще оказывается в пути к классам. Возможно, вам придется попробовать раздел dependencyManagement, чтобы принудительно использовать com.google.protobuf:protobuf-java:jar:3.0.0. - person Ed Davisson; 28.12.2016
comment
Мне удалось реализовать ваш код setHttpTransportFactory. Давайте на данный момент предположим, что он останавливает исключения тайм-аута (конечно, учитывая, что исключения нерегулярны, нам просто нужно посмотреть, повторяются ли они со временем). - person Joshua Fox; 01.01.2017