App Engine - загрузка LocalDatastoreService - не удалось загрузить из резервного хранилища

Мы используем App Engine, Datastore и Java и безуспешно пытаемся скопировать наш производственный Google Datastore в локальную копию.

(Полный сценарий миграции, который я использую, подробно описан в отдельном вопросе Github)

Мы используем следующие для экспорта

gcloud datastore export --namespaces="(default)" gs://$GOOGLE_CLOUD_BUCKET

И затем импорт, который выглядит примерно так

'http://' + $LOCAL_DATASTORE_HOSTNAME + ':' + $LOCAL_DATASTORE_PORT + '/v1/projects/' + $PROJECT_ID + ':import'

При запуске сценария создается "local_db.bin", который кажется правильным, однако затем мы копируем его в требуемое место и запускаем, когда встречаем следующую ошибку.

com.google.appengine.api.datastore.dev.LocalDatastoreService init INFO: Инициализировано локальное хранилище данных: Тип: хранилище с высокой репликацией: \WEB-INF\appengine-генерируемый \local_db.bin com.google.appengine.api.datastore.dev. ИНФОРМАЦИЯ о загрузке LocalDatastoreService: Не удалось загрузить из резервного хранилища, \WEB-INF\appengine-генерируется \local_db.bin java.lang.ClassNotFoundException: com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub$FileProfile на java.net.URLClassLoader.findClass(URLClassLoader.java:382) в java.lang.ClassLoader.loadClass(ClassLoader.java:424)

Если мы затем сохраним новую запись, она уничтожит local_db.bin и создаст новую.

Кто-нибудь знает, где в процессе может быть эта проблема?

ОБНОВИТЬ:

Я следовал точному процессу, который @Chris Halcrow описывает в своем ответе, чтобы повторно импортировать данные. Данные теперь успешно импортируются непосредственно в local_db.bin, который должен видеть App Engine, однако я все еще вижу ошибку.

Мы подозреваем, что может быть проблема с разрешениями. Мы попытались изменить некоторые разрешения IAM для учетной записи, под которой работает AppEngine. В частности, мы попытались добавить роль IAM редактора проектов в учетную запись, которую мы используем для gcloud login, как описано в активации разрешений хранилища данных для App Engine.

Мы также рассмотрели следующее: какие детали требуют разрешений при использовании скрипта Powershell для экспорта / импорта, подробно описанного в нашем вопросе GitHub.

https://cloud.google.com/datastore/docs/export-import-entities

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

1 ответ

Не копируйте файл local_db.bin, так как это может привести к неправильным ссылкам / указателям на память. Вместо этого выполните следующую процедуру:

  1. Остановите свой локальный AppEngine (завершите работу в консоли или закройте Eclipse/IntelliJ или все, что у него работает)
  2. Остановите все, что запускает эмулятор хранилища данных (например, завершите процесс, если вы запускаете его через командную строку).
  3. Определите, где ваш работающий экземпляр AppEngine ищет файл local_db.bin (для приложения Java, которое вы запускаете в локальном экземпляре AppEngine, местоположение по умолчанию относится к каталогу, в котором содержится ваш файл WAR, например C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\WEB-INF\appengine-generated\local_db.bin)
  4. Удалить содержимое appengine-generated папка
  5. Откройте обычную командную строку Windows (запустите от имени администратора)
  6. cd в каталог, содержащий ваше приложение AppEngine
  7. Запустите эмулятор, используя следующую команду (убедитесь, что data-dir указывает каталог, который вы определили на шаге 3) - gcloud beta emulators datastore start --data-dir=C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\ (см. https://cloud.google.com/datastore/docs/tools/datastore-emulator)
  8. Запишите порт, на котором запускается эмулятор хранилища данных
  9. Убедитесь, что ваш скрипт импорта DataStore использует этот порт в качестве значения $LOCAL_DATASTORE_PORT
  10. Если локальный эмулятор хранилища данных все еще работает, снова запустите сценарий импорта (для сценария Powershell убедитесь, что сценарий запускается при запуске Powershell от имени администратора).
  11. Если это успешно, вы должны увидеть сообщения в консоли, которые могут выглядеть как некоторые или все из следующих: INFO: Добавление обработчиков в недавно зарегистрированный канал. INFO: Обнаружено соединение HTTP/2. INFO: Обнаружено соединение не HTTP/2. Время до постоянное хранилище данных: 125 мс
  12. Теперь проверьте ваш файл local_db.bin, например C:\my_app_engine_app\target\my-app-name-1.0-SNAPSHOT\WEB-INF\appengine-generated\local_db.bin - вы должны увидеть, что он завышен, чтобы указать, что теперь он содержит ваши данные.