Uploaded image for project: 'i2b2 Core Software'
  1. i2b2 Core Software
  2. CORE-228

Exception when running parallel queries using Postgres

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.7.06, 1.7.07
    • 1.7.09
    • CRC Cell
    • None
    • Queries
    • i2b2 Core
    • PostgreSQL

    Description

      This issue was reported by Robert Lodahl from the University Medical Center Gottingen.

      When running multiple parallel queries requesting a PDO, the CRC will return an error. It appears, for all parallel queries run by the custom plugin, the same connection is used.

      Upon further investigation, Robert has located the problem to the local temporary tables (like #temp_fact_param_table in this case) are only local for every connection, not per statement. So the first query starts, creating the table, wanting to execute something using this table, while the second query starts and drops the table (marked in bold). Obviously an exception occurs because the table no longer exists.

      The ERROR message that appears is:
       
      "Caused by: org.postgresql.util.PSQLException: ERROR: relation "temp_fact_param_table" does not exist“
       

      The exception can be traced back to the part of the code:

      edu.harvard.i2b2.crc.dao.pdo.PdoQueryConceptDao.getConceptByFact(PdoQueryConceptDao.java:346)
       

      The section of code that appears to be causing the problem can be seen in the attached document.

      ATTACHMENTS:

      EMAIL_Parallel_Queries_Error.pdf = original email from Robert.

      Attachments

        Activity

          mem61 Mike Mendis created issue -
          mem61 Mike Mendis made changes -
          Field Original Value New Value
          Description This issue was reported by Robert Lodahl from the University Medical Center Gottingen.

          When running multiple parallel queries requesting a PDO, the CRC will return an error. It appears, for all parallel queries run by the custom plugin, the same connection is used.

          Upon further investigation, Robert has located the problem to the local temporary tables (like #temp_fact_param_table in this case) are only local for every connection, not per statement. So the first query starts, creating the table, wanting to execute something using this table, while the second query starts and drops the table (marked in bold). Obviously an exception occurs because the table no longer exists.
          This issue was reported by Robert Lodahl from the University Medical Center Gottingen.

          When running multiple parallel queries requesting a PDO, the CRC will return an error. It appears, for all parallel queries run by the custom plugin, the same connection is used.

          Upon further investigation, Robert has located the problem to the local temporary tables (like #temp_fact_param_table in this case) are only local for every connection, not per statement. So the first query starts, creating the table, wanting to execute something using this table, while the second query starts and drops the table (marked in bold). Obviously an exception occurs because the table no longer exists.

          The ERROR message that appears is:
           
          "Caused by: org.postgresql.util.PSQLException: ERROR: relation "temp_fact_param_table" does not exist“
           

          The exception can be traced back to the part of the code:

          edu.harvard.i2b2.crc.dao.pdo.PdoQueryConceptDao.getConceptByFact(PdoQueryConceptDao.java:346)
           

          Which reads as follows (many lines of codes omitted, only showing relevant parts):

          ATTACHMENTS:

          EMAIL_Parallel_Queries_Error.pdf = original email from Robert.
          jmd86 Janice Donahoe made changes -
          Attachment EMAIL_Parallel_Queries_Error.pdf [ 10630 ]
          Component/s CRC Cell [ 10049 ]
          Description This issue was reported by Robert Lodahl from the University Medical Center Gottingen.

          When running multiple parallel queries requesting a PDO, the CRC will return an error. It appears, for all parallel queries run by the custom plugin, the same connection is used.

          Upon further investigation, Robert has located the problem to the local temporary tables (like #temp_fact_param_table in this case) are only local for every connection, not per statement. So the first query starts, creating the table, wanting to execute something using this table, while the second query starts and drops the table (marked in bold). Obviously an exception occurs because the table no longer exists.

          The ERROR message that appears is:
           
          "Caused by: org.postgresql.util.PSQLException: ERROR: relation "temp_fact_param_table" does not exist“
           

          The exception can be traced back to the part of the code:

          edu.harvard.i2b2.crc.dao.pdo.PdoQueryConceptDao.getConceptByFact(PdoQueryConceptDao.java:346)
           

          Which reads as follows (many lines of codes omitted, only showing relevant parts):

          ATTACHMENTS:

          EMAIL_Parallel_Queries_Error.pdf = original email from Robert.
          This issue was reported by Robert Lodahl from the University Medical Center Gottingen.

          When running multiple parallel queries requesting a PDO, the CRC will return an error. It appears, for all parallel queries run by the custom plugin, the same connection is used.

          Upon further investigation, Robert has located the problem to the local temporary tables (like #temp_fact_param_table in this case) are only local for every connection, not per statement. So the first query starts, creating the table, wanting to execute something using this table, while the second query starts and drops the table (marked in bold). Obviously an exception occurs because the table no longer exists.

          The ERROR message that appears is:
           
          "Caused by: org.postgresql.util.PSQLException: ERROR: relation "temp_fact_param_table" does not exist“
           

          The exception can be traced back to the part of the code:

          edu.harvard.i2b2.crc.dao.pdo.PdoQueryConceptDao.getConceptByFact(PdoQueryConceptDao.java:346)
           

          The section of code that appears to be causing the problem can be seen in the attached document.

          ATTACHMENTS:

          EMAIL_Parallel_Queries_Error.pdf = original email from Robert.
          i2b2 Sponsored Project/s i2b2 Core [ 10196 ]
          Reporter Mike Mendis [ mem61 ] Janice Donahoe [ jmd86 ]
          nich Nich made changes -
          Assignee Nich [ nich ]
          jmd86 Janice Donahoe made changes -
          Fix Version/s 1.7.09 [ 10306 ]
          Status New [ 10000 ] Open [ 1 ]
          jmd86 Janice Donahoe made changes -
          Fix Version/s 1.7.09 [ 10306 ]
          jmd86 Janice Donahoe made changes -
          Assignee Nich [ nich ] Mike Mendis [ mem61 ]
          Hello.
          After further investigation I am quite sure that I found and resolved the issue.

          The problem is: i2b2 creates it's temporary tables using this update statement:
          "create table #temp_fact_param_table ( set_index int, char_param1 varchar(500) )"

          i2b2 handles both sql-server and postgres in the same way. However they work quite different. While SqlServer creates local temporary tables using the "#"-sign in front of the table name, Postgres needs another update statement, explicitly naming that it is a temporary table to be created, see:

          "create TEMPORARY table #temp_fact_param_table ( set_index int, char_param1 varchar(500) )"

          This has resolved the issue for me, however, fixes in several files were needed.
          rlodahl Robert Lodahl added a comment - Hello. After further investigation I am quite sure that I found and resolved the issue. The problem is: i2b2 creates it's temporary tables using this update statement: "create table #temp_fact_param_table ( set_index int, char_param1 varchar(500) )" i2b2 handles both sql-server and postgres in the same way. However they work quite different. While SqlServer creates local temporary tables using the "#"-sign in front of the table name, Postgres needs another update statement, explicitly naming that it is a temporary table to be created, see: "create TEMPORARY table #temp_fact_param_table ( set_index int, char_param1 varchar(500) )" This has resolved the issue for me, however, fixes in several files were needed.
          mem61 Mike Mendis made changes -
          Status Open [ 1 ] In Progress [ 3 ]
          mem61 Mike Mendis made changes -
          Status In Progress [ 3 ] Ready to Test [ 10001 ]
          jmd86 Janice Donahoe made changes -
          Fix Version/s 1.7.09 [ 10306 ]
          jmd86 Janice Donahoe made changes -
          Assignee Mike Mendis [ mem61 ] Janice Donahoe [ jmd86 ]
          jmd86 Janice Donahoe made changes -
          Status Ready to Test [ 10001 ] Testing [ 10002 ]
          This issue has been fixed and will be included in release 1.7.09.
          jmd86 Janice Donahoe added a comment - This issue has been fixed and will be included in release 1.7.09.
          jmd86 Janice Donahoe made changes -
          Resolution Fixed [ 1 ]
          Status Testing [ 10002 ] Resolved [ 5 ]
          jmd86 Janice Donahoe made changes -
          Status Resolved [ 5 ] Closed [ 6 ]

          People

            jmd86 Janice Donahoe
            jmd86 Janice Donahoe
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: