Ipsquiggle
Ipsquiggle

Reputation: 1856

"ExistenceError" in simple AppEngine + Google Cloud Storage application

I have a simple AppEngine handler as follows:

class TestGS(webapp2.RequestHandler):
    def get(self):

        file_name = '/gs/ds_stats/testfile'
        files.gs.create(file_name, mime_type='text/html')        

        with files.open(file_name, 'a') as file_handle:

            file_handle.write("foo")

        files.finalize(file_name)

However, when I call this handler, I get ExistenceError: ApplicationError: 105 at the line with files.open(....

This seems like a super simple scenario, and there's no indication at all as to why this is failing (especially since the files.gs.create right above it seems to have succeeded, though, is there any way to verify this?).

Looking through the source code, I see the following problems can cause this error:

  if (e.application_error in
      [file_service_pb.FileServiceErrors.EXISTENCE_ERROR,
       file_service_pb.FileServiceErrors.EXISTENCE_ERROR_METADATA_NOT_FOUND,
       file_service_pb.FileServiceErrors.EXISTENCE_ERROR_METADATA_FOUND,
       file_service_pb.FileServiceErrors.EXISTENCE_ERROR_SHARDING_MISMATCH,
       file_service_pb.FileServiceErrors.EXISTENCE_ERROR_OBJECT_NOT_FOUND,
       file_service_pb.FileServiceErrors.EXISTENCE_ERROR_BUCKET_NOT_FOUND,
       ]):
    raise ExistenceError()

That's a pretty large range of issues... Of course it doesn't tell me which one! And again, strange that the 'create' seems to work.

Upvotes: 0

Views: 302

Answers (1)

Ipsquiggle
Ipsquiggle

Reputation: 1856

The problem turned out to be a lack of clarity in the documentation. files.gs.create returns a special 'writeable file path' which you need to feed in to open and finalize. A correct example looks like this:

class TestGS(webapp2.RequestHandler):
    def get(self):

        file_name = '/gs/ds_stats/testfile'
        writable_file_name = files.gs.create(file_name, mime_type='text/html')        

        with files.open(writable_file_name, 'a') as file_handle:

            file_handle.write("foo")

        files.finalize(writable_file_name)

Upvotes: 2

Related Questions