[pypy-issue] Issue #2855: PyDateTimeAPI->DateTime_FromDateAndTime (pypy/pypy)

Anya Tchernishov issues-reply at bitbucket.org
Sun Jul 8 07:01:29 EDT 2018


New issue 2855: PyDateTimeAPI->DateTime_FromDateAndTime
https://bitbucket.org/pypy/pypy/issues/2855/pydatetimeapi-datetime_fromdateandtime

Anya Tchernishov:

Calling `ciso8601.parse_datetime` with pypy3 leaks memory. 
Tested in CentOS 7 docker image with pypy3 installed:
```
$ pypy3 --version
Python 3.5.3 (fdd60ed87e941677e8ea11acf9f1819466521bf2, May 24 2018, 06:31:10)
[PyPy 6.0.0 with GCC 4.8.2 20140120 (Red Hat 4.8.2-15)]
```

```
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708
```

This code shows the leak (`main.py`):
```
import ciso8601

while True:
    iso_formatted_timestamp = '2018-07-07T14:06:07.560279-05:00'
    datetime_timestamp = ciso8601.parse_datetime(iso_formatted_timestamp)
```

Command used: `pypy3 main.py`

Expected behaviour:

- memory consumption of the pypy3 process doesn't grow over time


Actual behaviour:

- memory consumption growing rapidly (~35MB increase each second)

Cpython doesn't leak for this code. 

In addition, this the code leaks only when the timestamps timezone is not UTC. Calling `ciso8601.parse_datetime` with timestamp in UTC timezone doesn't leak.

The following C code reproduces the leak: 
```
datetime = PyImport_ImportModule("datetime");
fixed_offset = PyObject_GetAttrString(datetime, "timezone");

static PyObject *
_parse(PyObject *self, PyObject *args, int parse_any_tzinfo)
{
    PyObject *obj;
    PyObject *tzinfo = Py_None;

    tzinfo = PyObject_CallFunction(
                        fixed_offset, "N",
                        PyDelta_FromDSU(0, 60 * 60, 0));

#define LEAK 1
#if LEAK
    obj = PyDateTimeAPI->DateTime_FromDateAndTime(
        2017, 1, 1, 1, 1, 1, 1, tzinfo,
        PyDateTimeAPI->DateTimeType);
#elif
    obj = PyDateTimeAPI->Time_FromTime(1, 1, 1, 1, tzinfo, PyDateTimeAPI->TimeType);
#endif

    Py_DECREF(tzinfo);
    return obj;
}
```

`DateTime_FromDateAndTime` leaks while `Time_FromTime` doesn't.




More information about the pypy-issue mailing list