[
https://issues.apache.org/jira/browse/DISPATCH-1735?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17170984#comment-17170984
]
Ganesh Murthy edited comment on DISPATCH-1735 at 8/4/20, 5:57 PM:
------------------------------------------------------------------
I am on Fedora 32
{noformat}
[gmurthy@localhost qpid-dispatch]$ python --version
Python 3.8.3
[gmurthy@localhost qpid-dispatch]$ {noformat}
I added the following to python_embedded.c
{noformat}
[gmurthy@localhost qpid-dispatch]$ git diff src/python_embedded.c
diff --git a/src/python_embedded.c b/src/python_embedded.c
index 7265eb29..60bae6df 100644
--- a/src/python_embedded.c
+++ b/src/python_embedded.c
@@ -656,6 +656,17 @@ static void qd_io_rx_handler(void *context, qd_message_t
*msg, int link_id, int
iter_to_py_attr(qd_message_field_iterator(msg,
QD_FIELD_APPLICATION_PROPERTIES), py_iter_parse, py_msg, "properties");
iter_to_py_attr(qd_message_field_iterator(msg, QD_FIELD_BODY),
py_iter_parse, py_msg, "body");
+
+ PyObject* properties_map = PyObject_GetAttrString(py_msg, "properties");
+ PyObject* data = PyDict_GetItemString(properties_map, "data");
+ if (data) {
+ if (PyBytes_CheckExact(data)) {
+ printf ("BATMAN qd_io_rx_handler PyBytes_CheckExact is True\n");
+ }
+ }
+
PyObject *value = PyObject_CallFunction(self->handler, "Oil", py_msg,
link_id, inter_router_cost);
Py_DECREF(py_msg);
[gmurthy@localhost qpid-dispatch]$
{noformat}
When I run the failing test -
{noformat}
/usr/bin/python "/home/gmurthy/opensource/qpid-dispatch/build/tests/run.py"
"-m" "unittest" "-v" "system_tests_management.ManagementTest.test_dummy"
{noformat}
I see the output
{noformat}
BATMAN qd_io_rx_handler PyBytes_CheckExact is True {noformat}
So, the C code is doing the right thing here by setting the the type of the
value in the dict to byte. The python code is called from the c code (in
python_embedded.c) using the following line
{noformat}
PyObject *value = PyObject_CallFunction(self->handler, "Oil", py_msg, link_id,
inter_router_cost); {noformat}
which in turn calls this function -
[https://github.com/apache/qpid-dispatch/blob/1.12.0/python/qpid_dispatch_internal/management/agent.py#L821]
When you try to get the type of key 'data' in request.properties, it prints
<str>
In summary, I think the Python object API (PyObject*) has a bug. This test does
not fail in Python 3.6
{noformat}
{noformat}
was (Author: ganeshmurthy):
I am on Fedora 32
{noformat}
[gmurthy@localhost qpid-dispatch]$ python --version
Python 3.8.3
[gmurthy@localhost qpid-dispatch]$ {noformat}
I added the following to python_embedded.c
{noformat}
[gmurthy@localhost qpid-dispatch]$ git diff src/python_embedded.c
diff --git a/src/python_embedded.c b/src/python_embedded.c
index 7265eb29..60bae6df 100644
--- a/src/python_embedded.c
+++ b/src/python_embedded.c
@@ -656,6 +656,17 @@ static void qd_io_rx_handler(void *context, qd_message_t
*msg, int link_id, int
iter_to_py_attr(qd_message_field_iterator(msg,
QD_FIELD_APPLICATION_PROPERTIES), py_iter_parse, py_msg, "properties");
iter_to_py_attr(qd_message_field_iterator(msg, QD_FIELD_BODY),
py_iter_parse, py_msg, "body");
+
+ PyObject* properties_map = PyObject_GetAttrString(py_msg, "properties");
+ PyObject* data = PyDict_GetItemString(properties_map, "data");
+ if (data) {
+ if (PyBytes_CheckExact(data)) {
+ printf ("BATMAN qd_io_rx_handler PyBytes_CheckExact is True\n");
+ }
+ }
+
PyObject *value = PyObject_CallFunction(self->handler, "Oil", py_msg,
link_id, inter_router_cost);
Py_DECREF(py_msg);
[gmurthy@localhost qpid-dispatch]$
{noformat}
And I see the output
{noformat}
BATMAN qd_io_rx_handler PyBytes_CheckExact is True {noformat}
So, the C code is doing the right thing here by setting the the type of the
value in the dict to byte. The python code is called using the following line
{noformat}
PyObject *value = PyObject_CallFunction(self->handler, "Oil", py_msg, link_id,
inter_router_cost); {noformat}
which in turn calls this function -
[https://github.com/apache/qpid-dispatch/blob/1.12.0/python/qpid_dispatch_internal/management/agent.py#L821]
When you try to get the type of key 'data' in request.properties, it prints
<str>
In summary, I think the Python object API (PyObject*) has a bug. This test does
not fail in Python 3.6
{noformat}
{noformat}
> system_tests_management failing on Fedora 32
> --------------------------------------------
>
> Key: DISPATCH-1735
> URL: https://issues.apache.org/jira/browse/DISPATCH-1735
> Project: Qpid Dispatch
> Issue Type: Bug
> Components: Tests
> Reporter: Ganesh Murthy
> Assignee: Ganesh Murthy
> Priority: Major
>
> {noformat}
> 19: ======================================================================
> 19: FAIL: test_dummy (system_tests_management.ManagementTest)
> 19: Test all operations on the dummy test entity
> 19: ----------------------------------------------------------------------
> 19: Traceback (most recent call last):
> 19: File
> "/home/gmurthy/opensource/qpid-dispatch/tests/system_tests_management.py",
> line 347, in test_dummy
> 19: self.assertEqual(
> 19: AssertionError: {'operation': 'callme', 'type': 'org.apache[58
> chars]tes'} != {'type': 'org.apache.qpid.dispatch.dummy', [57 chars]y/0'}
> 19: - {'data': b'bytes',
> 19: ? -
> 19:
> 19: + {'data': 'bytes',
> 19: 'identity': 'dummy/0',
> 19: 'operation': 'callme',
> 19: 'type': 'org.apache.qpid.dispatch.dummy'}
> 19:
> 19: ----------------------------------------------------------------------
> 19: Ran 21 tests in 9.483s
> 19:
> 19: FAILED (failures=1)
> 1/1 Test #19: system_tests_management ..........***Failed 9.69 sec
> {noformat}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]