Re: Query Tool Slow to Load

Aditya Toshniwal <[email protected]>
Newsgroups gmane.comp.db.postgresql.pgadmin.devel
Message-ID <CAM9w-_k4c-Z20jUCX5Cbb7zhZvuHp_nxnzEt7qwFkoeUv4trhw@mail.gmail.com>
Hi Avin,

I create a config_local.py and try changing the below params. This will
avoid a clash between the dev environment and installed pgAdmin. Change the
DATA_DIR to one where you have permissions.

import os
import logging

DATA_DIR = '/Users/xyz/.pgadmin_dev'
LOG_FILE = os.path.join(DATA_DIR, 'pgadmin4.log')
SQLITE_PATH = os.path.join(DATA_DIR, 'pgadmin4.db')
SESSION_DB_PATH = os.path.join(DATA_DIR, 'sessions')
STORAGE_DIR = os.path.join(DATA_DIR, 'storage')
TEST_SQLITE_PATH = os.path.join(DATA_DIR, 'test_pgadmin4.db')
SESSION_COOKIE_NAME = 'pga4_session_schema_dev'


On Tue, Aug 6, 2019 at 9:42 AM Avin Kavish <[email protected]> wrote:

> I'm having trouble with the dev env. So I'm trying to develop in server
> mode because I don't have any QT sdks installed. Once I enter the username,
> password on first launch, I get this error.
>
>   File "./web/pgAdmin4.py", line 97, in <module>
>>     app = create_app()
>>   File "/home/avin/code/pgadmin4/web/pgadmin/__init__.py", line 330, in
>> create_app
>>     db_upgrade(app)
>>   File "/home/avin/code/pgadmin4/web/pgadmin/setup/db_upgrade.py", line
>> 25, in db_upgrade
>>     flask_migrate.upgrade(migration_folder)
>>   File "/usr/lib/python3/dist-packages/flask_migrate/__init__.py", line
>> 259, in upgrade
>>     command.upgrade(config, revision, sql=sql, tag=tag)
>>  < --- shortened stack trace -->
>>   File
>> "/home/avin/code/pgadmin4/web/pgadmin/setup/../../migrations/env.py", line
>> 94, in <module>
>>     run_migrations_online()
>>   File
>> "/home/avin/code/pgadmin4/web/pgadmin/setup/../../migrations/env.py", line
>> 87, in run_migrations_online
>>     context.run_migrations()
>>   File "<string>", line 8, in run_migrations
>>   File "/usr/lib/python3/dist-packages/alembic/runtime/environment.py",
>> line 836, in run_migrations
>>     self.get_context().run_migrations(**kw)
>>   File "/usr/lib/python3/dist-packages/alembic/runtime/migration.py",
>> line 330, in run_migrations
>>     step.migration_fn(**kw)
>>   File
>> "/home/avin/code/pgadmin4/web/migrations/versions/fdc58d9bd449_.py", line
>> 48, in upgrade
>>     sa.PrimaryKeyConstraint('name')
>>   File "<string>", line 8, in create_table
>>   File "<string>", line 3, in create_table
>>  < --- shortened stack trace -->
>> *sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) table
>> version already exists [SQL: '\nCREATE TABLE version (\n\tname VARCHAR(32)
>> NOT NULL, \n\tvalue INTEGER NOT NULL, \n\tPRIMARY KEY (name)\n)\n\n']*
>
>
> So I delete the database and  try again. Then I get this,
>
> *sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to
>> open database file*
>
>
> But the database and the logs do get created. So I try again, and then I
> get the first error again. I'm stuck in bit of a catch 22 scenario here and
> don't know what to do. Any ideas hackers?
>
> On Mon, Aug 5, 2019 at 7:12 PM Dave Page <[email protected]> wrote:
>
>> Hi
>>
>> On Mon, Aug 5, 2019 at 2:22 PM Avin Kavish <[email protected]> wrote:
>>
>>> Yeah, I'll give it a go. If you don't hear back from me in a week, it
>>> probably means I'm lost in the void between two AMD modules.
>>>
>>
>> Cool, thanks.
>>
>>
>>> Is there a WebStorm or VSCode extension that will help me cross that
>>> gap? ctrl + click to go to definition doesn't seem to work.
>>>
>>
>> No idea. I don't know if any of the devs use those IDEs (I think most of
>> us probably use the free version of PyCharm). Maybe it's time we invested
>> in the full version of PyCharm...
>>
>> Anyone else know?
>>
>>
>>>
>>> On Mon, Aug 5, 2019 at 5:31 PM Dave Page <[email protected]> wrote:
>>>
>>>> Hi
>>>>
>>>> Yes - we were talking about that last week as it happens:
>>>> https://redmine.postgresql.org/issues/4553
>>>>
>>>> Is this something you're interested to work on?
>>>>
>>>> On Mon, Aug 5, 2019 at 12:56 PM Avin Kavish <[email protected]>
>>>> wrote:
>>>>
>>>>> To Dave and maintainers,
>>>>>
>>>>> Here's when the click event handler triggers,
>>>>> [image: Query open.jpg]
>>>>> Here is the first loading screen,
>>>>> [image: query loading.jpg]
>>>>> It takes  3.8 - 1.5 = 2.3s for the loading screen to show up.
>>>>>
>>>>>
>>>>> Here's when the query tool is ready to use,
>>>>> [image: Query close.jpg]
>>>>>
>>>>> It takes 4.7s - 1.5s = 3.2s total for the query tool to be ready since
>>>>> click,  0.9s for UI instantiation.
>>>>>
>>>>> So, I looked at what is causing the delay, there is an ajax request to
>>>>> initialize_datagrid that takes 2s to complete. It's primary job is to
>>>>> return a transaction id under the key `gridTransId` after making the
>>>>> connection to the database. Obviously, dns, ssl, and password
>>>>> authentication to a remote database is going to incur delays. There is
>>>>> nothing that can be done to prevent that. BUT, there is no need to delay
>>>>> the loading of the query editor till the transaction id is received.
>>>>>
>>>>> this.on('pgadmin-datagrid:transaction:created', function(trans_obj) {
>>>>> this.launch_grid(trans_obj);
>>>>> });
>>>>>
>>>>> ^ This is where the delay happens. I suggest launching the grid
>>>>> instantly behind the $spinner_el and remove the $spinner_el when the
>>>>> transaction id is recieved and set via self.
>>>>>
>>>>> There are two primary hindrances to doing this, one being the
>>>>> transaction id being used as a url param in new tab mode,
>>>>>
>>>>> var url_params = {
>>>>> 'trans_id': trans_obj.gridTransId, // <<---- HERE
>>>>> 'is_query_tool': trans_obj.is_query_tool,
>>>>> 'editor_title': titileForURLObj.title,
>>>>> },
>>>>> baseUrl = url_for('datagrid.panel', url_params) +
>>>>> '?' + 'query_url=' + encodeURI(trans_obj.sURL) +
>>>>> '&server_type=' + encodeURIComponent(trans_obj.server_type) +
>>>>> '&server_ver=' + trans_obj.serverVersion+
>>>>> '&fslashes=' + titileForURLObj.slashLocations;
>>>>>
>>>>> The other being this close handler,
>>>>>
>>>>> queryToolPanel.on(wcDocker.EVENT.CLOSED, function() {
>>>>> $.ajax({
>>>>> url: url_for('datagrid.close', {'trans_id': trans_obj.gridTransId}), //
>>>>> <<---- and HERE
>>>>> method: 'DELETE',
>>>>> });
>>>>> });
>>>>>
>>>>> Looking at the python server, this id is nothing but a random number
>>>>> between 1 and 9999999,
>>>>> # Create a unique id for the transaction
>>>>> trans_id = str(random.randint(1, 9999999))
>>>>>
>>>>> So instead of generating this id once the connection to the database
>>>>> has been established, I suggest generating a random number in javascript
>>>>> and POSTing it to the backend to be associated with the newly created
>>>>> connection asynchronously while the query tool loads in the background. The
>>>>> spinning indicator can be removed once the server sends an OK response once
>>>>> the connection is established and associated with the number POSTed.
>>>>>
>>>>
>>>>
>>>> --
>>>> Dave Page
>>>> Blog: http://pgsnake.blogspot.com
>>>> Twitter: @pgsnake
>>>>
>>>> EnterpriseDB UK: http://www.enterprisedb.com
>>>> The Enterprise PostgreSQL Company
>>>>
>>>
>>
>> --
>> Dave Page
>> Blog: http://pgsnake.blogspot.com
>> Twitter: @pgsnake
>>
>> EnterpriseDB UK: http://www.enterprisedb.com
>> The Enterprise PostgreSQL Company
>>
>

-- 
Thanks and Regards,
Aditya Toshniwal
Software Engineer | EnterpriseDB India | Pune
"Don't Complain about Heat, Plant a TREE"
Query open.jpg (image/jpeg, 48.3 KB) - not displayed
Query close.jpg (image/jpeg, 50.7 KB) - not displayed
query loading.jpg (image/jpeg, 51.6 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.