Hi guys,

I see that the original message and its clarification is hard to consume.
The problem is that indexes are identified by their names. So, the situation
that Kirill described is a valid one:
- you have index X for columns (a, b);
- you drop it;
- you create index X for columns (a, c).

This is a realistic scenario. If all of that happened during a single
checkpoint
interval and node failed.

Real issue here is the fact that we restore metastorage separately from
everything else.
This means that DurableBackgroundTask will start deleting X (a, c) if we're
not careful.

It all depends on the implementation. I'd suggest Alexeys solution with a
few tweaks:
- I'm not convinced that we need to log indexes creation, this is excessive;
- how do you drop index for the metatree:
-- pick a unique name;
-- acquire checkpoint read lock;
-- create DurableBackgroundTask that will delete index with that unique
name;
-- create logical WAL record "drop index X";
-- "rename" link to the index in meta tree;
-- release checkpoint read lock;
-- start DurableBackgroundTask.

Recovery for "drop index X" should also create another
DurableBackgroundTask,
this way I think we'll be able to avoid any possible issues. If
DurableBackgroundTask
has a name of an unexisting index then that's fine, task will be completed
as
successful, that's a normal flow.

I hope everything's clear here, I'm ready to clarify more details about my
idea. Thank you!


ср, 7 июл. 2021 г. в 17:20, ткаленко кирилл <tkalkir...@yandex.ru>:

> I'll try to explain:
>
> We create indexes through InlineIndexFactory#createIndex, where at the
> beginning we create the root page using QueryIndexDefinition#treeName, so
> if we create the same index 2 times, then we will refer to the same root.
>
> In order to make the deletion of the index independent, I propose to
> replace the name of the root pages with an arbitrary name (other than
> QueryIndexDefinition#treeName, for example UUID.toString()), in order to
> avoid the problems of a node crash, I propose to fix this in a logical
> record.
>
> After we change the name of the root page to delete the index, we can
> easily delete it and rebuild it (if the user does it) in parallel.
>
> If we consider your proposal, then the creation and deletion of the index
> will go in parallel and they will look at the same roots.
>
> You can see how the renaming will take place here:
> https://github.com/apache/ignite/pull/9223
>
> 07.07.2021, 10:28, "Alexei Scherbakov" <alexey.scherbak...@gmail.com>:
> > вт, 6 июл. 2021 г. в 15:57, ткаленко кирилл <tkalkir...@yandex.ru>:
> >
> >>  >> Can you clarify what it means to rename root index trees ?
> >>  Replacing
> >>
>  
> org.apache.ignite.internal.processors.cache.persistence.IndexStorageImpl.IndexItem,
> >>  changing IndexItem#idxName, but keeping fIndexItem#pageId.
> >
> > Changing to what ? Some temporary name ? Can you give a detailed step by
> > step description of the algorithm ?
> >
> >>  Suggested solution is not suitable for the situation: add index -> drop
> >>  index -> add an index. We can start deleting the last added index.
> >
> > How can we do that, give me an example ?
> >
> > From my understanding, the suggested solution should work ok for any
> number
> > of create/drop sequences.
> >
> >>  06.07.2021, 14:00, "Alexei Scherbakov" <alexey.scherbak...@gmail.com>:
> >>  > Can you clarify what it means to rename root index trees ?
> >>  >
> >>  > The simple solution which immediately comes to me is
> >>  >
> >>  > 1) write logical record on index creation - on reading it create an
> index
> >>  > during logical recovery
> >>  > 2) write logical record on index deletion - on reading it delete an
> index
> >>  > during logical recovery and start background clearing task with real
> root
> >>  > pages.
> >>  >
> >>  > Will it work for you ?
> >>  >
> >>  > вт, 6 июл. 2021 г. в 12:27, ткаленко кирилл <tkalkir...@yandex.ru>:
> >>  >
> >>  >> Hello everyone!
> >>  >>
> >>  >> Currently, dropping indexes consists of the following steps (based
> on
> >>  >> SchemaAbstractDiscoveryMessage's):
> >>  >>
> >>  >> Step 1: Removing the index from the SQL engine and starting
> >>  >> DurableBackgroundCleanupIndexTreeTask, which removes the index trees
> >>  in the
> >>  >> background;
> >>  >> Step 1.1: DurableBackgroundCleanupIndexTreeTask is added to the
> >>  >> metaStorage and removed after successful completion at the next
> >>  checkpoint.
> >>  >>
> >>  >> Step 2: Removing the index from the cache configuration and persist
> it.
> >>  >>
> >>  >> Problems:
> >>  >>
> >>  >> 1)We add and immediately delete the index, a checkpoint does not
> happen
> >>  >> and the node crashes, after restarting
> >>  >> DurableBackgroundCleanupIndexTreeTask will not be able to complete
> and
> >>  will
> >>  >> periodically restart due to the fact that it saves
> >>  >> DurableBackgroundCleanupIndexTreeTask#rootPages (root pages of index
> >>  trees)
> >>  >> that have not appeared;
> >>  >>
> >>  >> 2)After adding a DurableBackgroundCleanupIndexTreeTask node crashes,
> >>  after
> >>  >> restarting the node, the task will clean the index trees and there
> >>  will be
> >>  >> errors when using the index;
> >>  >>
> >>  >> 3)etc.
> >>  >>
> >>  >> Suggested solution:
> >>  >>
> >>  >> Rename the root index trees and write about this with a logical
> entry
> >>  in
> >>  >> the WAL and do this at the first start of
> >>  >> DurableBackgroundCleanupIndexTreeTask.
> >>  >> Thus, if we find the renamed root pages in task 1, we can clear the
> >>  index
> >>  >> trees to the end, otherwise the task can be completed.
> >>  >> Also, if we find that rename pages are present, and the step 2 has
> not
> >>  >> been completed, then we can start rebuilding the indexes.
> >>  >>
> >>  >> WDYT?
> >>  >
> >>  > --
> >>  >
> >>  > Best regards,
> >>  > Alexei Scherbakov
> >
> > --
> >
> > Best regards,
> > Alexei Scherbakov
>


-- 
Sincerely yours,
Ivan Bessonov

Reply via email to