Igniters, I wanted to pitch a rather radical idea regarding the Ignite 3.0 development which has occurred to me some time ago.
We already have several IEPs targeted to Ignite 3.0 which imply major changes to the codebase (the change in replication protocol and thus transactions, change in binary format, updated metastorage, etc). We also planned significant changes in public APIs: configuration format change, improvements in cache APIs, SQL APIs, transaction mode rework. The wishlist of changes for Ignite 3.0 is huge. So, I was wondering whether it makes sense to try to change the old codebase, or start with a new baseline and move old pieces of code that do not require significant rework. Personally, I would go with the second option for the following reasons: - We have a chance to shift the development paradigm in the project and introduce the practice of true unit-tests. In the new baseline at the beginning there will be no ability to run an end-to-end scenario, thus we will be forced to write unit-tests. So far, such practice was hard to implement because of tight coupling between Ignite components and inability to instantiate components without an instance of KernalContext. For example, we should be able to thoroughly test internal primitives, such as replication protocol (without actual communication), distributed metastorage contracts, persistence layer, etc. - We will significantly reduce the development cycle in the beginning (right now the RunAll takes two hours of astronomical time with empty TC; in the new approach developer will be able to run ALL tests locally in a matter of minutes) - We can get rid of TC bot and enforce green TC by integrating TC build results with GitHub PRs (the same way Travis is currently integrated to PR check). We should restrict PR merge without a TC check - We will still have to re-write all tests, but only once. If we try to modify the old codebase, we would need to modify all the tests for every major change (public API change, configuration change) - We will have fewer conflicts when working together. For example, I cannot imagine how one would merge two changes of getting rid of IgniteFuture and changes in replication protocol, for example Technically, I would suggest creating a new repository for Ignite 3.0 (perhaps, a new clean branch, but a new repo looks nicer to me) and a new Ignite 3.0 TeamCity project. While it may seem quite radical, I do believe that this approach will give us more benefits than trying to make such major changes in the existing codebase. If needed, let's schedule a discord chat like before to discuss this. WDYT?