REST API error on member-related operations
Version affected: 3.3.4
Version not affected: 3.3.2
When calling REST API after upgrading from 3.3.2 to 3.3.4, a possibly random, crash occurs when handling the user addresses. A few tracebacks are below. The issue manifested in random 500 errors when viewing mailman GUI, but refreshing the page a few times helped. Also affected a custom script (using go/resty) used for the last few years to sync users with an external database.
Reverting 69c66a39 (#700 (closed)) fixed this issue for me. It might be also related to !777 (merged).
2022-05-21 20:44:17 [FALCON] [ERROR] GET /3.1/lists/[removed]/roster/owner => Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/falcon/app.py", line 361, in __call__
responder(req, resp, **params)
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 136, in on_get
resource = self._make_collection(request, fields)
File "/usr/lib/python3.8/site-packages/mailman/rest/helpers.py", line 182, in _make_collection
entries = [as_dict(resource) for resource in collection]
File "/usr/lib/python3.8/site-packages/mailman/rest/helpers.py", line 182, in <listcomp>
entries = [as_dict(resource) for resource in collection]
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 111, in _resource_as_dict
value = value_getter(member)
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 83, in _get_address
'addresses/{}'.format(member.address.email))
File "/usr/lib/python3.8/site-packages/mailman/model/member.py", line 117, in address
if self._address is None
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/attributes.py", line 294, in __get__
return self.impl.get(instance_state(instance), dict_)
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/attributes.py", line 730, in get
value = self.callable_(state, passive)
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/strategies.py", line 759, in _load_for_state
return self._emit_lazyload(
File "<string>", line 1, in <lambda>
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/strategies.py", line 847, in _emit_lazyload
q(session)
File "/usr/lib/python3.8/site-packages/sqlalchemy/ext/baked.py", line 615, in _load_on_pk_identity
result = list(bq.for_session(self.session).params(**params))
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 100, in instances
cursor.close()
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.raise_(
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 80, in instances
rows = [proc(row) for row in fetch]
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 80, in <listcomp>
rows = [proc(row) for row in fetch]
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 524, in _instance
tuple([row[column] for column in pk_cols]),
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 524, in <listcomp>
tuple([row[column] for column in pk_cols]),
File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 681, in _key_fallback
util.raise_(
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'address.id'"
2022-05-21 20:04:26 [FALCON] [ERROR] GET /3.1/members/find?list_id=[removed]&role=member => Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/falcon/app.py", line 361, in __call__
responder(req, resp, **params)
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 466, in on_get
return self._find(request, response)
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 503, in _find
collection = resource._make_collection(request, fields)
File "/usr/lib/python3.8/site-packages/mailman/rest/helpers.py", line 182, in _make_collection
entries = [as_dict(resource) for resource in collection]
File "/usr/lib/python3.8/site-packages/mailman/rest/helpers.py", line 182, in <listcomp>
entries = [as_dict(resource) for resource in collection]
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 111, in _resource_as_dict
value = value_getter(member)
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 83, in _get_address
'addresses/{}'.format(member.address.email))
File "/usr/lib/python3.8/site-packages/mailman/model/member.py", line 117, in address
if self._address is None
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/attributes.py", line 294, in __get__
return self.impl.get(instance_state(instance), dict_)
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/attributes.py", line 730, in get
value = self.callable_(state, passive)
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/strategies.py", line 759, in _load_for_state
return self._emit_lazyload(
File "<string>", line 1, in <lambda>
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/strategies.py", line 847, in _emit_lazyload
q(session)
File "/usr/lib/python3.8/site-packages/sqlalchemy/ext/baked.py", line 615, in _load_on_pk_identity
result = list(bq.for_session(self.session).params(**params))
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 100, in instances
cursor.close()
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.raise_(
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 80, in instances
rows = [proc(row) for row in fetch]
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 80, in <listcomp>
rows = [proc(row) for row in fetch]
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 524, in _instance
tuple([row[column] for column in pk_cols]),
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 524, in <listcomp>
tuple([row[column] for column in pk_cols]),
File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 681, in _key_fallback
util.raise_(
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'address.id'"
2022-05-21 20:44:10 [FALCON] [ERROR] GET /3.1/lists/[removed]/roster/moderator => Traceback (most recent call last):
File "/usr/lib/python3.8/site-packages/falcon/app.py", line 361, in __call__
responder(req, resp, **params)
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 136, in on_get
resource = self._make_collection(request, fields)
File "/usr/lib/python3.8/site-packages/mailman/rest/helpers.py", line 182, in _make_collection
entries = [as_dict(resource) for resource in collection]
File "/usr/lib/python3.8/site-packages/mailman/rest/helpers.py", line 182, in <listcomp>
entries = [as_dict(resource) for resource in collection]
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 111, in _resource_as_dict
value = value_getter(member)
File "/usr/lib/python3.8/site-packages/mailman/rest/members.py", line 83, in _get_address
'addresses/{}'.format(member.address.email))
File "/usr/lib/python3.8/site-packages/mailman/model/member.py", line 117, in address
if self._address is None
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/attributes.py", line 294, in __get__
return self.impl.get(instance_state(instance), dict_)
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/attributes.py", line 730, in get
value = self.callable_(state, passive)
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/strategies.py", line 759, in _load_for_state
return self._emit_lazyload(
File "<string>", line 1, in <lambda>
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/strategies.py", line 847, in _emit_lazyload
q(session)
File "/usr/lib/python3.8/site-packages/sqlalchemy/ext/baked.py", line 615, in _load_on_pk_identity
result = list(bq.for_session(self.session).params(**params))
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 100, in instances
cursor.close()
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/langhelpers.py", line 68, in __exit__
compat.raise_(
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 80, in instances
rows = [proc(row) for row in fetch]
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 80, in <listcomp>
rows = [proc(row) for row in fetch]
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 524, in _instance
tuple([row[column] for column in pk_cols]),
File "/usr/lib/python3.8/site-packages/sqlalchemy/orm/loading.py", line 524, in <listcomp>
tuple([row[column] for column in pk_cols]),
File "/usr/lib/python3.8/site-packages/sqlalchemy/engine/result.py", line 681, in _key_fallback
util.raise_(
File "/usr/lib/python3.8/site-packages/sqlalchemy/util/compat.py", line 182, in raise_
raise exception
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'address.id'"
Edited by Robert Kurjata