Opened 13 years ago

Closed 12 years ago

#17066 closed Bug (fixed)

Exception TypeError when using GeoIP

Reported by: Mitar Owned by: nobody
Component: GIS Version: 1.4
Severity: Normal Keywords:
Cc: mmitar@…, Stefan Wehrmeyer Triage Stage: Ready for checkin
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

When using GeoIP in my code I am getting such error at the end of syncdb call:

Exception TypeError: "'NoneType' object is not callable" in <bound method GeoIP.__del__ of <django.contrib.gis.utils.geoip.GeoIP object at 0x103a35690>> ignored

It seems there is some race condition? I am using Python 2.7.2 on Mac OS X. It has threaded support enabled. Django 1.3. python-geoip 1.2.5, libgeoip 1.4.7.

Attachments (1)

geoiptest.zip (7.0 KB ) - added by Stefan Wehrmeyer 12 years ago.
GeoIP Test Project

Download all attachments as: .zip

Change History (10)

comment:1 by Aymeric Augustin, 13 years ago

This looks similar to #13488 and #13843.

comment:2 by Aymeric Augustin, 13 years ago

Triage Stage: UnreviewedAccepted

comment:3 by Robby Dermody, 13 years ago

+1 I am getting this bug as well. Django 1.3.1

comment:4 by anonymous, 12 years ago

Version: 1.31.4

Same here after migrating to Django 1.4.1

comment:5 by Claude Paroz, 12 years ago

It could be useful if anyone could provide us with a basic project where this error can be reproduced.

comment:6 by Claude Paroz, 12 years ago

Resolution: needsinfo
Status: newclosed

by Stefan Wehrmeyer, 12 years ago

Attachment: geoiptest.zip added

GeoIP Test Project

comment:7 by Stefan Wehrmeyer, 12 years ago

Cc: Stefan Wehrmeyer added
Resolution: needsinfo
Status: closednew

I can confirm this on Django 1.4.3 with geoip 1.4.8.

I attached a test project that should reproduce this error. Instructions: Extract, install requirements (Django==1.4.3) and run runtest.sh which downloads GeoIP country data (slightly too big to attach) and then does a syncdb (any Django command will do).

The exception should be the last line of the output. The culprit is obviously in django.contrib.gis.geoip.base.GeoIP.__del__ where GeoIP_delete is None when this method is called.

Replacing __del__ with the following removes the exception, but may leave file handles lying around (I have no deeper knowledge about that).

def __del__(self):
    # Cleaning any GeoIP file handles lying around.
    if GeoIP_delete is None:
        return
    if self._country: GeoIP_delete(self._country)
    if self._city: GeoIP_delete(self._city)

comment:8 by Claude Paroz, 12 years ago

Triage Stage: AcceptedReady for checkin

Thanks for the research on that issue. I guess that we might have difficulties to come with a test for this, so I suggest to simply add the if GeoIP_delete is None safeguard, and call it a day!

comment:9 by Claude Paroz <claude@…>, 12 years ago

Resolution: fixed
Status: newclosed

In 35185495e3f70f900b542bf95d744f51e5c5cb92:

Fixed #17066 -- Prevented TypeError in GeoIP.del

When garbaging GeoIP instances, it happens that GeoIP_delete is
already None.
Thanks mitar for the report and stefanw for tests.

Note: See TracTickets for help on using tickets.
Back to Top