0

I am using the Java/Groovy client for ElasticSearch and I am trying to restore an ES snapshot during an upgrade. I am using the Groovy code I have so far for setting up my old and new clients and making them create & restore snapshots:

    def oldElasticClient = new ElasticClient("old", oldElasticPort)
    oldElasticClient.cleanIndicesAndTemplates()
    def newElasticClient = new ElasticClient("new", newElasticPort)
    newElasticClient.cleanIndicesAndTemplates()
  
    try {
      oldElasticClient.refreshAll()
      oldElasticClient.createSnapshotRepository()
      newElasticClient.createSnapshotRepository()
      oldElasticClient.createSnapshot()
      newElasticClient.restoreSnapshot()
      oldElasticClient.deleteSnapshot()
       ....
    finally {
      oldElasticClient.close()
      newElasticClient.close()
      .... 
}

and these are the methods which execute the actual create and restoration of the snapshots:

def createSnapshotRepository() {
    log.info("Creating snapshot repository on ${name} Elasticsearch...");
    def settings = Settings.builder()
      .put(FsRepository.LOCATION_SETTING.getKey(), "/var/tmp")
      .put(FsRepository.COMPRESS_SETTING.getKey(), true)
      .build()
    client.snapshot().createRepository(
      new PutRepositoryRequest("myrepository").settings(settings).type(FsRepository.TYPE),
      RequestOptions.DEFAULT
    )
    log.info("Done creating snapshot repository on ${name} Elasticsearch!");
  }

  def createSnapshot(Boolean waitForCompletion = true) {
    log.info("Creating snapshot on ${name} Elasticsearch...");
    CreateSnapshotRequest createSnapshotRequest1 = new CreateSnapshotRequest("myrepository", "mysnapshot_1")
    createSnapshotRequest1.waitForCompletion(true)
    createSnapshotRequest1.includeGlobalState(true)
    CreateSnapshotResponse createSnapshotResponse = client.snapshot().create(createSnapshotRequest1, RequestOptions.DEFAULT)
    log.info("All Snapshots")
    GetSnapshotsRequest getSnapshotsRequest = new GetSnapshotsRequest("myrepository");
    GetSnapshotsResponse getSnapshotsResponse = client.snapshot().get(getSnapshotsRequest, RequestOptions.DEFAULT)
    log.info(getSnapshotsResponse.getProperties().toString())
  }

 def restoreSnapshot() {
    log.info("Restoring snapshot on ${name} Elasticsearch...");
    client.snapshot().restore(
      new RestoreSnapshotRequest("myrepository", "mysnapshot_1")
        .includeGlobalState(true)
        .waitForCompletion(true),
      RequestOptions.DEFAULT
    )
    log.info("Done restoring snapshot on ${name} Elasticsearch!");
  }

After checking the logs I saw that my snapshot has been created successfully like so:

snapshots:[SnapshotInfo{snapshot=_na_: mysnapshot_1/niEyiuCtRny_fON1aXTMLQ, state=SUCCESS .... ]

However, my restoring method exits with an error message indicating, that the snapshot doesnt exist, which is really confusing me.This is the exact error:

"error":{"root_cause":[{"type":"snapshot_restore_exception","reason":"[myrepository:mysnapshot_1] snapshot does not exist"}],"type":"snapshot_restore_exception","reason":"[myrepository:mysnapshot_1] snapshot does not exist"},"status":500}

Would anyone know how I could debug this further to see what could be wrong? I am kinda clueless what the error could be as everything seems right to me. Any help would be much appreciated.

marialadelbario
  • 325
  • 1
  • 4
  • 19

0 Answers0