ignite-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Roman Kondakov <kondako...@mail.ru.INVALID>
Subject Re: How KILL QUERY should work?
Date Mon, 02 Mar 2020 11:21:47 GMT
Nikolay,

as I can see, when you run "SELECT * FROM SYS.SQL_QUERIES ORDER BY
START_TIME" from the client node (not from the server node as was in
your first reproducer), the query you are looking for is correctly
returned in the view's result set. Right? So, the problem with this
error message is solved, isn't it?

> Error is «Query with provided ID doesn’t exist» 

The another problem you've encountered after running KILL QUERY command
with correct qryId is freezing. Am I correct? If yes, this is a known
issue and I am working on it.


-- 
Kind Regards
Roman Kondakov


On 02.03.2020 14:02, Nikolay Izhikov wrote:
> Hello, Roman.
> 
> Please, see updated test.
> I assert query text to ensure that correct `SELECT` statement used for KILL command.
> 
> This test freeze on «KILL QUERY» execution.
> 
> ```
> @Test
> public void testCancelSQLQuery() throws Exception {
>     startGrids(1);
>     IgniteEx client = startClientGrid("client");
> 
>     client.cluster().state(ACTIVE);
> 
>     IgniteCache<Object, Object> cache = client.getOrCreateCache(
>         new CacheConfiguration<>(DEFAULT_CACHE_NAME).setIndexedTypes(Integer.class,
Integer.class));
> 
>     for (int i = 0; i < PAGE_SZ * PAGE_SZ; i++)
>         cache.put(i, i);
> 
>     SqlFieldsQuery qry = new SqlFieldsQuery("SELECT _KEY, _VAL FROM INTEGER").setSchema("default").setPageSize(10);
>     Iterator<List<?>> iter = queryProcessor(client).querySqlFields(qry, true).iterator();
> 
>     assertNotNull(iter.next());
> 
>     List<List<?>> sqlQries0 = SqlViewExporterSpiTest.execute(client,
>         "SELECT * FROM SYS.SQL_QUERIES ORDER BY START_TIME");
>     assertEquals(2, sqlQries0.size());
> 
>     String qryId = (String)sqlQries0.get(0).get(0);
>     assertEquals("SELECT _KEY, _VAL FROM INTEGER", sqlQries0.get(0).get(1));
> 
>     SqlViewExporterSpiTest.execute(client, "KILL QUERY '" + qryId + "'");
> 
>     while(iter.hasNext())
>         assertNotNull(iter.next());
> 
>     fail("You shouldn't be here!");
> }
> ```
> 
>> 2 марта 2020 г., в 13:48, Roman Kondakov <kondakov87@mail.ru.INVALID>
написал(а):
>>
>> Nikolay,
>>
>>> This system view returns queries that are *running* on the node.
>>> I can see «"SELECT _KEY, _VAL FROM INTEGER» in the results of select.
>>
>> It looks a bit weird to me, because when I print results of the running
>> queries from server node:
>>
>> List<List<?>> sqlQries0 = SqlViewExporterSpiTest.execute(ignite0,
>> "SELECT * FROM SYS.SQL_QUERIES");
>> System.out.println("sqlQries0=" + sqlQries0);
>>
>> it prints only the system view query:
>>
>> sqlQries0=[[adfe8400-15c7-40cf-a6d2-41012b500000_1, SELECT * FROM
>> SYS.SQL_QUERIES, adfe8400-15c7-40cf-a6d2-41012b500000, 2020-03-02
>> 13:25:12.927, -3, false, PUBLIC]]
>>
>> but when I do the same for the client node, it prints both queries:
>>
>> sqlQries0=[[dbb3418d-dec2-40f4-8276-090fd31fc27d_1, SELECT _KEY, _VAL
>> FROM INTEGER, dbb3418d-dec2-40f4-8276-090fd31fc27d, 2020-03-02
>> 13:30:43.953, 17, false, default],
>> [dbb3418d-dec2-40f4-8276-090fd31fc27d_2, SELECT * FROM SYS.SQL_QUERIES,
>> dbb3418d-dec2-40f4-8276-090fd31fc27d, 2020-03-02 13:30:43.974, -4,
>> false, PUBLIC]]
>>
>> Are you sure you can see both queries in the result of select from the
>> server?
>>
>> It looks like the statement
>>
>>> This system view returns queries that are *running* on the node.
>>
>> is incorrect. The view returns queries that were *originated* from the
>> node, not the all *running* there. I'm not sure whether it is expected
>> behaviour.
>>
>>
>> And what about query hanging: it is a known issue. I'm working on it
>> right now. I'll file a ticket and propose a patch soon.
>>> I tried and it doesn’t work, also.
>>> `KILL QUERY` command just freeze on `CommandProcessor#processKillQueryCommand`
line 478.
>>
>>
>> -- 
>> Kind Regards
>> Roman Kondakov
>>
>>
>> On 02.03.2020 13:10, Nikolay Izhikov wrote:
>>> Hello, Roman.
>>>
>>> My initial query was about correct usage of KILL QUERY command.
>>> It seems for me, that It just doesn’t work.
>>>
>>>> itself, which is already completed by the time you run "KILL QUERY" command.
>>>
>>> As you can see from the source iterator doesn’t closed in the moment of `KILL
QUERY` execution.
>>> I suppose that should mean that query still executed.
>>>
>>>> returns only the queries which were originated from the ignite0 node.
>>>
>>> This system view returns queries that are *running* on the node.
>>> I can see «"SELECT _KEY, _VAL FROM INTEGER» in the results of select.
>>> I suppose that mean that query are executed on the server node.
>>>
>>>> Try to replace "ignite0" with a "client" node in this line. I think it may
help
>>>
>>> I tried and it doesn’t work, also.
>>> `KILL QUERY` command just freeze on `CommandProcessor#processKillQueryCommand`
line 478.
>>>
>>> ```
>>> /** @throws Exception If failed. */
>>> @Test
>>> public void testCancelSQLQuery() throws Exception {
>>>    IgniteEx ignite0 = startGrids(NODES_CNT);
>>>    IgniteEx client = startClientGrid("client");
>>>
>>>    ignite0.cluster().state(ACTIVE);
>>>
>>>    initCache(client);
>>>
>>>    SqlFieldsQuery qry = new SqlFieldsQuery("SELECT _KEY, _VAL FROM INTEGER").setSchema("default").setPageSize(10);
>>>    Iterator<List<?>> iter = queryProcessor(client).querySqlFields(qry,
true).iterator();
>>>
>>>    assertNotNull(iter.next());
>>>
>>>    List<List<?>> sqlQries0 = SqlViewExporterSpiTest.execute(client,
"SELECT * FROM SYS.SQL_QUERIES");
>>>    assertEquals(2, sqlQries0.size());
>>>
>>>
>>>    String qryId = (String)sqlQries0.get(0).get(0);
>>>    assertEquals("SELECT _KEY, _VAL FROM INTEGER", sqlQries0.get(0).get(1));
>>>
>>>    //Here test just freeze.
>>>    SqlViewExporterSpiTest.execute(client, "KILL QUERY '" + qryId + "'");
>>>
>>>    while(iter.hasNext())
>>>        assertNotNull(iter.next());
>>>
>>>    fail("You shouldn't be here!");
>>> }
>>> ``
>>>
>>>
>>>
>>>> 2 марта 2020 г., в 12:46, Roman Kondakov <kondakov87@mail.ru.INVALID>
написал(а):
>>>>
>>>> Hi Nikolay,
>>>>
>>>> I think that problem here is that the query you are trying to kill is
>>>>
>>>>> "SELECT QUERY_ID FROM SYS.SQL_QUERIES"
>>>>
>>>> itself, which is already completed by the time you run "KILL QUERY" command.
>>>>
>>>> I'm not an expert in the system views, but it seems to me that the line
>>>>
>>>>> List<List<?>> sqlQries0 = SqlViewExporterSpiTest.execute(ignite0,
"SELECT QUERY_ID FROM SYS.SQL_QUERIES");
>>>>
>>>> returns only the queries which were originated from the ignite0 node.
>>>> Since "SELECT _KEY, _VAL FROM INTEGER" was started on the client node,
>>>> it doesn't get into that list.
>>>>
>>>> Try to replace "ignite0" with a "client" node in this line. I think it
>>>> may help:
>>>>
>>>>> List<List<?>> sqlQries0 = SqlViewExporterSpiTest.execute(client,
"SELECT QUERY_ID FROM SYS.SQL_QUERIES");
>>>>
>>>>
>>>>
>>>> -- 
>>>> Kind Regards
>>>> Roman Kondakov
>>>>
>>>>
>>>> On 02.03.2020 12:02, Nikolay Izhikov wrote:
>>>>> Hello, Igniters.
>>>>>
>>>>> Ignite right now support `KILL QUERY` command.
>>>>> I tried to use it and stuck with the simple test.
>>>>> Error is «Query with provided ID doesn’t exist» 
>>>>>
>>>>> Can you, please, advise me - How KILL QUERY should be used?
>>>>>
>>>>> ```
>>>>>   @Test
>>>>>   public void testCancelSQLQuery() throws Exception {
>>>>>       IgniteEx ignite0 = startGrids(NODES_CNT);
>>>>>       IgniteEx client = startClientGrid("client");
>>>>>
>>>>>       ignite0.cluster().state(ACTIVE);
>>>>>
>>>>>       initCache(client);
>>>>>
>>>>>       SqlFieldsQuery qry = new SqlFieldsQuery("SELECT _KEY, _VAL FROM
INTEGER").setSchema("default").setPageSize(10);
>>>>>       Iterator<List<?>> iter = queryProcessor(client).querySqlFields(qry,
true).iterator();
>>>>>
>>>>>       assertNotNull(iter.next());
>>>>>
>>>>>       List<List<?>> sqlQries0 = SqlViewExporterSpiTest.execute(ignite0,
"SELECT QUERY_ID FROM SYS.SQL_QUERIES");
>>>>>       assertEquals(1, sqlQries0.size());
>>>>> 	
>>>>>       String qryId = (String)sqlQries0.get(0).get(0);
>>>>>       SqlViewExporterSpiTest.execute(client, "KILL QUERY '" + qryId +
"'»);
>>>>>
>>>>> 	//Expecting this iteration will fail.
>>>>>       while(iter.hasNext())
>>>>>           assertNotNull(iter.next());
>>>>>
>>>>>       fail("You shouldn't be here!");
>>>>>   }
>>>>>
>>>>>   private void initCache(IgniteEx client) {
>>>>>       IgniteCache<Object, Object> cache = client.getOrCreateCache(
>>>>>           new CacheConfiguration<>(DEFAULT_CACHE_NAME).setIndexedTypes(Integer.class,
Integer.class));
>>>>>
>>>>>       for (int i = 0; i < PAGE_SZ * PAGE_SZ; i++)
>>>>>           cache.put(i, i);
>>>>>   }
>>>>> ```
>>>>>
>>>>> ```
>>>>> class org.apache.ignite.internal.processors.query.IgniteSQLException:
Failed to cancel query [nodeId=4f812490-47b9-4331-8b51-d783f5300000,qryId=1,err=Query with
provided ID doesn't exist [nodeId=4f812490-47b9-4331-8b51-d783f5300000, qryId=1]]
>>>>>
>>>>> 	at org.apache.ignite.internal.processors.query.h2.CommandProcessor.processKillQueryCommand(CommandProcessor.java:482)
>>>>> 	at org.apache.ignite.internal.processors.query.h2.CommandProcessor.runCommand(CommandProcessor.java:411)
>>>>> 	at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeCommand(IgniteH2Indexing.java:996)
>>>>> 	at org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.querySqlFields(IgniteH2Indexing.java:1085)
>>>>> 	at org.apache.ignite.internal.processors.query.GridQueryProcessor$4.applyx(GridQueryProcessor.java:2454)
>>>>> ````
>>>>>
>>>
> 

Mime
View raw message