Skip to content

NDB transaction() read_only property does not work #114

@troberti

Description

@troberti

Expected Behavior

The NDB transaction() function has a read_only property to indicate that the transaction will only perform entity reads, potentially improving throughput. I expect that it will start a read only transaction when I invoke it as such: ndb.transaction(txn, read_only=True).

Actual Behavior

Sadly, this flag does not work in the current SDK. Instead, it fails with an TypeError: Unknown configuration option ('read_only') error when you specify it (regardless whether it is True of False).

Full stack trace:

Traceback (most recent call last):
  File "/Users/tijmen/dev/ndb-read-only/readonly_test.py", line 22, in test_readonly_transaction
    ndb.transaction(txn, read_only=False)  # Does not work
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/utils.py", line 182, in positional_wrapper
    return wrapped(*args, **kwds)
           ^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/model.py", line 3902, in transaction
    return fut.get_result()
           ^^^^^^^^^^^^^^^^
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/tasklets.py", line 397, in get_result
    self.check_success()
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/tasklets.py", line 394, in check_success
    six.reraise(self._exception.__class__, self._exception, self._traceback)
  File "/Users/tijmen/dev/ndb-read-only/lib/six.py", line 719, in reraise
    raise value
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/tasklets.py", line 444, in _help_tasklet_along
    value = gen.send(val)
            ^^^^^^^^^^^^^
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/context.py", line 976, in transaction
    options = _make_ctx_options(ctx_options, TransactionOptions)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/ext/ndb/context.py", line 145, in _make_ctx_options
    return config_cls(**ctx_options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/tijmen/dev/ndb-read-only/lib/google/appengine/datastore/datastore_rpc.py", line 392, in __new__
    raise TypeError('Unknown configuration option (%s)' % err)
TypeError: Unknown configuration option ('read_only')

Steps to Reproduce the Problem

Run the following test:

import unittest
from google.appengine.ext import testbed
from google.appengine.ext import ndb

class ExampleModel(ndb.Model):
    pass

class LoggingTest(unittest.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.setup_env()
        self.testbed.activate()
        self.testbed.init_memcache_stub()
        self.testbed.init_datastore_v3_stub()

    def tearDown(self):
        self.testbed.deactivate()

    def test_readonly_transaction(self):
        def txn():
            model = ExampleModel.get_by_id("test")
        ndb.transaction(txn, read_only=True)  # Does not work

    def test_normal_transaction(self):
        def txn():
            model = ExampleModel.get_by_id("test")
        ndb.transaction(txn)  # Works.


if __name__ == '__main__':
    unittest.main()

Specifications

Version: appengine-python-standard 1.1.6

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions