code: private void uploadImage(long txid) throws IOException {
      final long start = AvatarNode.now();
      LOG.info("Standby: Checkpointing - Upload fsimage to remote namenode.");
      checkpointStatus("Image upload started");
      
      imageUploader = new ImageUploader(txid);
      imageUploader.start();
      
      // wait for the upload to complete   
      while (running
          && !imageUploader.done
          && AvatarNode.now() - start < MAX_CHECKPOINT_UPLOAD_TIMEOUT) {
        try {
          imageUploader.join(3000);
        } catch (InterruptedException ie) { 
          LOG.error("Reveived interruption when uploading image for txid: "
              + txid);
          Thread.currentThread().interrupt();
          throw (IOException) new InterruptedIOException().initCause(ie);
        } 
      }
      if (!running || !imageUploader.succeeded) {
        InjectionHandler.processEvent(InjectionEvent.STANDBY_UPLOAD_FAIL);
        throw new IOException(
            "Standby: Checkpointing - Image upload failed (time= "
                + (AvatarNode.now() - start) + " ms).", imageUploader.error);
      }
      imageUploader = null;
      LOG.info("Standby: Checkpointing - Upload fsimage to remote namenode DONE.");
      checkpointStatus("Image upload completed");
    }
docs: Creates image upload thread.