[
https://issues.redhat.com/browse/TEIID-5969?page=com.atlassian.jira.plugi...
]
Dmitrii Pogorelov commented on TEIID-5969:
------------------------------------------
[~shawkins] thx a lot for your reply.
That is not expected. We should create a disk / memory backed copy
that will live as long as the query is open.
will it be fixed by you?
You may have found a code path though were that is inhibiting the
full copying and thus seeing the already removed exception.
maybe, I just set the org.teiid.maxStringLength to 20000 thus the MAX_LOB_MEMORY_BYTES
variable was increased as well and the exception disappeared.
Again that is not expected. What should happen is that the initial
copy will happen, then the cast will truncate the lob value.
yes, I got it, it should work if this is implemented: "We should create a disk /
memory backed copy that will live as long as the query is open."
No, that is really a separate consideration. You are asking about
having dynamic / unlimited length string values by default - that is dangerous from a
memory management perspective.
yes, I know that it can be dangerous as such a mechanism can consume all memory in case of
big data. It was just one of the suggestions though not so successful.
The "already removed" exception in case of copyLobs=true
translator property for MSSQL
--------------------------------------------------------------------------------------
Key: TEIID-5969
URL:
https://issues.redhat.com/browse/TEIID-5969
Project: Teiid
Issue Type: Quality Risk
Components: Query Engine
Affects Versions: 13.1
Reporter: Dmitrii Pogorelov
Assignee: Steven Hawkins
Priority: Major
We're getting the following exception:
{code:java}
2020-06-10 16:01:45,326 WARN [org.teiid.PROCESSOR] (Worker21_QueryProcessorQueue272)
1bxj3NJqJLpO TEIID30020 Processing exception for request 1bxj3NJqJLpO.10 'TEIID30328
Unable to evaluate convert(ms_dwh.v1.expr1, string): TEIID30384 Error while evaluating
function convert'. Originally ExpressionEvaluationException 'already removed'
FileStore.java:156. Enable more detailed logging to see the entire stacktrace. {code}
in the case of MSSQL connector and copyLobs=true in its translator property.
After debugging I discovered that the error occurred actually because of not enough value
in
MAX_LOB_MEMORY_BYTES which is used in LobManager. The variable depends on
org.teiid.maxStringLength which is set usually to 4000 by default. But if someone put a
data with text field type in MSSQL having more than, say, 20000 symbols then the field
won't be read by Teiid at all, Teiid will just throw out the exception mentioned
above. Will it be possible to improve LobManager so that it can read Text data dynamically
increasing needed memory for the process? Otherwise even setting
the org.teiid.maxStringLength to 20000 Teiid can raise the exception because of a Text
data with length more than 20000 symbols.
Steps to reproduce:
# create the v1 table in MSSQL:
{code:java}
CREATE TABLE [dbo].[v1](CREATE TABLE [dbo].[v1]( [expr1] [text] NULL, [b] [int] NULL) ON
[PRIMARY] TEXTIMAGE_ON [PRIMARY] {code}
2. insert in the table the following data (I did it via standard MSSQL Server Management
Studio):
{code:java}
insert into test_dwh.dbo.v1 values (replicate(convert(varchar(max),'a'), 20000),
1) ; {code}
3. add MSSQL as a source to Teiid:
{code:java}
<datasource jndi-name="java:/mssql-test-dwh"
pool-name="mssql-test-dwh" enabled="true"
use-java-context="true">
<connection-url>jdbc:sqlserver://localhost:1433;databaseName=test_dwh</connection-url>
<driver-class&gt;com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class&gt;
<driver>com.microsoft.sqlserver</driver>
<new-connection-sql>SET ANSI_WARNINGS
OFF</new-connection-sql>
<pool>
<min-pool-size>2</min-pool-size>
<max-pool-size>70</max-pool-size>
</pool>
<security>
<user-name>*****</user-name>
<password>*****</password>
</security>
<validation>
<check-valid-connection-sql>select
1</check-valid-connection-sql>
</validation>
<timeout>
<blocking-timeout-millis>120000</blocking-timeout-millis>
<idle-timeout-minutes>5</idle-timeout-minutes>
</timeout>
</datasource>{code}
4. add ms model:
{code:java}
<model name="ms_dwh">
<property name="importer.useFullSchemaName"
value="false"/>
<property name="importer.tableTypes"
value="TABLE,VIEW"/>
<property name="importer.importKeys" value="false"/>
<property name="importer.schemaPattern" value="dbo"/>
<source name="dwh_ms" translator-name="mySqlserver"
connection-jndi-name="java:/mssql-test-dwh"/>
</model>{code}
5. add mySqlserver translator:
{code:java}
<translator name="mySqlserver" type="sqlserver">
<property name="SupportsNativeQueries" value="true"/>
<property name="copyLobs" value="true"/>
</translator> {code}
6. try to run the following query:
{code:java}
select cast(expr1 as string) from ms_dwh.v1 ;; {code}
--
This message was sent by Atlassian Jira
(v7.13.8#713008)