Bug 986219
| Summary: | Unable to connect to postgresql-9.2 database with python-2.7 app. | ||||||
|---|---|---|---|---|---|---|---|
| Product: | OpenShift Online | Reporter: | Oleg Fayans <ofayans> | ||||
| Component: | Containers | Assignee: | Michal Fojtik <mfojtik> | ||||
| Status: | CLOSED UPSTREAM | QA Contact: | libra bugs <libra-bugs> | ||||
| Severity: | high | Docs Contact: | |||||
| Priority: | high | ||||||
| Version: | 1.x | CC: | abhgupta, agrimm, amarecek, apatil, chunchen, dmcphers, jhonce, mmcgrath, spousty, tcpip4000, wzheng, xtian, zhewang | ||||
| Target Milestone: | --- | Keywords: | Reopened, SupportQuestion | ||||
| Target Release: | --- | ||||||
| Hardware: | Unspecified | ||||||
| OS: | Unspecified | ||||||
| Whiteboard: | |||||||
| Fixed In Version: | Doc Type: | Bug Fix | |||||
| Doc Text: | Story Points: | --- | |||||
| Clone Of: | Environment: | ||||||
| Last Closed: | 2014-02-11 18:15:58 UTC | Type: | Bug | ||||
| Regression: | --- | Mount Type: | --- | ||||
| Documentation: | --- | CRM: | |||||
| Verified Versions: | Category: | --- | |||||
| oVirt Team: | --- | RHEL 7.3 requirements from Atomic Host: | |||||
| Cloudforms Team: | --- | Target Upstream Version: | |||||
| Embargoed: | |||||||
| Attachments: |
|
||||||
Spent some time on this and gave up. Not sure if this is just a matter of specifying the LD_LIBRARY_PATH or not. Mrunal seemed to indicate that we may need to check that the correct version of the .so files are being loaded. ofayans: Thanks for reporting the issue. The problem is that the LD_LIBRARY_PATH does not include the path to postgresql-9.2 libraries. Could you try adding rhis line: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/rh/postgresql92/root/usr/lib64/ to your pre start python script to get around it for right now? We will work on a fix! - Mrunal Hi, I've tried putting this command in ./.openshift/action_hooks/deploy with no good result, where is the "pre start python script". After a while the libpq.so error disappears and now this error shows up: ImportError at / cannot import name utils /var/lib/openshift/520161db5004468578000363/python/virtenv/lib/python2.7/site-packages/Django-1.4-py2.7.egg/django/db/backends/postgresql_psycopg2/base.py in <module> 8. from django.db import utils (In reply to Juan P. Daza P. from comment #3) > Hi, I've tried putting this command in ./.openshift/action_hooks/deploy with > no good result, where is the "pre start python script". You could create one hook scripts named pre_start_python in ./.openshift/action_hooks/ and add the following to the hook script: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/rh/postgresql92/root/usr/lib64/ The bug is fixed with the resolution in Comment #5. Steps 1) create a python-2.7 app with postgresql-9.2 cartridge added 2) add the files in the attachment to the app's local repo, and enable psycopg2 support in its setup.py file. 3) create an executable hook named pre_start_python as Comment #5 4) push the changes 5) access <app_url>/postgresql Result: It showed "version 1" as expected. (In reply to Zhe Wang from comment #6) Can confirm this solutions works. Thank you. Reopening since I am not getting this with Python 2.7 and postgresl 9.2.
This is for the application that is supposed to work with the new book - please consider this an emergency patch.
-------------------
from python/logs/error_log
[Fri Feb 07 13:48:12 2014] [error] [client 127.9.124.1] ImportError: libpq.so.postgresql92-5: cannot open shared object file: No such file or directory
------------------
You have permission to go into the gears and diagnose the error.
account spousty+prod
-------------
insultapp @ http://insultapp-osbeginnerbook.rhcloud.com/ (uuid: 52df5ed54382x)
-----------------------------------------------------------------------------------------
Domain: osbeginnerbook
Created: Jan 21 10:01 PM
Gears: 1 (defaults to small)
Git URL: ssh://52df5ed54382x.com/~/git/insultapp.git/
SSH: 52df5ed54382x.com
Deployment: auto (on git push)
python-2.7 (Python 2.7)
-----------------------
Gears: Located with postgresql-9.2, cron-1.4
postgresql-9.2 (PostgreSQL 9.2)
-------------------------------
Gears: Located with python-2.7, cron-1.4
Connection URL: postgresql://$OPENSHIFT_POSTGRESQL_DB_HOST:$OPENSHIFT_POSTGRESQL_DB_PORT
Database Name: insultapp
Password: x
Username: x
cron-1.4 (Cron 1.4)
-------------------
Gears: Located with python-2.7, postgresql-9.2
I don't think it's appropriate to close a bug as "currentrelease" (implying that we fixed something) when the solution is really a workaround. Why are we not handling LD_LIBRARY_PATH elements like PATH elements? Confirmed on Python 3.3 as well. This is a production level issue, lets try to get a proper fix and put a hotfix out. I've dealt with LD_LIBRARY_PATH issues like this in community cartridges: https://github.com/mmcgrath-openshift/openshift-cartridge-varnish/blob/master/env/LD_LIBRARY_PATH.erb I know the shifters are running into issues with this now so it would be good to get a proper fix out. I'm no longer able to reproduce this on devenv, the app in Oleg's attachment works fine and I got 'version 1'. Also no compilation issues. Mike: There is a Trello card to multiple cartridges with isolated LD_LIBRARY_PATH (since we went throught this problem for Zend, Jenkins, Mysql...): https://trello.com/c/BB2errnd/31-handle-multiple-catridges-having-their-own-ld-library-path It's fixed, verified on devenv_4357, please refer to the following results: 1. create a python-2.7 app with postgresql-9.2 cartridge added 2. add the files in the attachment to the app's local repo, and enable psycopg2 support in its setup.py file. 3. push the changes 4. access <app_url>/postgresql Results: at step 4: Met "version 1" on the webpage The actual fix will be a part of: https://trello.com/c/BB2errnd chunchen you actually need to have an application that loads the driver otherwise it won't really test it.
Here is some example code that throws the error:
from random import choice
import psycopg2
#get a connection to use in the DB calls. Only need a cursor because these connections are read only
def get_cursor():
conn = psycopg2.connect(database=os.environ['OPENSHIFT_APP_NAME'], user=os.environ['OPENSHIFT_POSTGRESQL_DB_USERNAME'],
password=os.environ['OPENSHIFT_POSTGRESQL_DB_PASSWORD'], host=os.environ['OPENSHIFT_POSTGRESQL_DB_HOST'],
port=os.environ['OPENSHIFT_POSTGRESQL_DB_PORT'] )
cursor = conn.cursor()
return conn
#Clean up when done with the cursor and connection
def close_cursor(cursor):
conn = cursor.connection
cursor.close()
conn.close()
def insult():
return "Thou " + generate_insult() + "!"
def named_insult(name):
return name + ", thou " + generate_insult() + "!"
def generate_insult():
first_adjs = ["artless", "bawdy", "beslubbering", "bootless", "churlish"]
second_adjs = ["base-court", "bat-fowling", "beef-witted", "beetle-headed", "boil-brained"]
nouns = ["apple-john", "baggage", "barnacle", "bladder", "boar-pig"]
return choice(first_adjs) + " " + choice(second_adjs) + " " + choice(nouns)
#Expects to be passed a psycopg2 cursor
#Using the solution found on this Stack Overflow page
#http://stackoverflow.com/questions/5297396/quick-random-row-selection-in-postgres
def get_first_adj(cursor):
cur.execute("select string from short_adjective offset random() * (select count(*) from short_adjective) limit 1;")
print "HERE IS THE RESULT of count :: " + str(cur.fetchone()[0])
One other note for the workaround. If you are using python then the action_hook needs to be name pre_start_python Steven, Oleg: The Trello card I'm currently working will allow this without any workarounds or hacks for non-scalable but also for scalable apps. I tested both Oleg's and your code and they both works. Stay tuned! :-) Confirmed bug still exists for Python 2.7 and PostgreSQL 9.2, however workaround suggested in comment #5 works Have verified on devenv_4916 with Oleg's and Steven's scripts, both works well, below are the steps using Steven's scripts(please correct if my steps are wrong):
1. Create a python-2.7 with postgresql-9.2
2. In app local repo, edit setup.py: add "psycopg2" to "install_requires"
3. Create a table short_adjective with column "username" and values "openshift" in psql
4. Add below codes to wsgi.py:
from random import choice
import psycopg2
def application(environ, start_response):
....
elif environ['PATH_INFO'] == '/psql':
conn_str = "dbname=%s user=%s password=%s host=%s port=%s" % (
os.environ['OPENSHIFT_APP_NAME'],
os.environ['OPENSHIFT_POSTGRESQL_DB_USERNAME'],
os.environ['OPENSHIFT_POSTGRESQL_DB_PASSWORD'],
os.environ['OPENSHIFT_POSTGRESQL_DB_HOST'],
os.environ['OPENSHIFT_POSTGRESQL_DB_PORT'])
conn = psycopg2.connect(conn_str)
cur = conn.cursor()
cur.execute("select username from short_adjective offset random()")
response_body = str(cur.fetchone())
cur.close()
conn.close()
5. Git push the changes;
6. Access https://$appurl/psql, and can get the content I input in the table short_adjective successfully.
Below are the LD_LIBRARY_PATH returns in gear(which I didn't add like comment #5): [myapp-d.dev.rhcloud.com 53ad361405636e0e38000025]\> get_gear_ld_library_path /opt/rh/postgresql92/root/usr/lib64:/opt/rh/python27/root/usr/lib64 [myapp-d.dev.rhcloud.com 53ad361405636e0e38000025]\> env | grep LD_LIBRARY_PATH OPENSHIFT_PYTHON_LD_LIBRARY_PATH_ELEMENT=/opt/rh/python27/root/usr/lib64 LD_LIBRARY_PATH=/opt/rh/postgresql92/root/usr/lib64:/opt/rh/python27/root/usr/lib64 OPENSHIFT_POSTGRESQL_LD_LIBRARY_PATH_ELEMENT=/opt/rh/postgresql92/root/usr/lib64 |
Created attachment 775696 [details] wsgi/application and wsgi/postgresql_factory.py Description of problem: I created a python-2.7 app, embedded a postgresql-9.2 cartridge and created a simple script that inserts test data into the database. The script throws the following error: "libpq.so.postgresql92-5: cannot open shared object file: No such file or directory" The script, "postgresql_factory" as well as wsgi/application are attached Version-Release number of selected component (if applicable): How reproducible: Always Steps to Reproduce: 1. rhc app create myapp python-2.7 2. rhc cartridge add postgresql-9.2 -a myapp 3. add attached files, git add . ; git commit & git push 4. access /postgresql url of your app Actual results: FILE.postgresql factory is not added to this app libpq.so.postgresql92-5: cannot open shared object file: No such file or directory Expected results: version: 1 Additional info: reproduced on all devenv instances