Vote for 1. — Denis
> On Sep 26, 2017, at 11:23 PM, Vladimir Ozerov <voze...@gridgain.com> wrote: > > Folks, > > Let me summarize current naming ideas one more time: > > 1) [StorageConfiguration - StorageRegionConfiguration] > 2) [DurableMemoryConfiguration - DataRegionConfiguration] > 3) [DurableMemoryConfiguration - DurableMemoryRegionConfiguration] - out of > question, as "durable memory region" is too misleading. > > My vote for p.1. Short, simple and intuitive. > > Vladimir. > > On Tue, Sep 26, 2017 at 10:16 PM, Dmitriy Setrakyan <dsetrak...@apache.org> > wrote: > >> On Tue, Sep 26, 2017 at 7:33 AM, Dmitry Pavlov <dpavlov....@gmail.com> >> wrote: >> >>> Hi Dmitriy, thank you for reply. Do you agree Memory Policy already >> became >>> Ignite's term? We call this configuration now >> MemoryPolicy(Configuration), >>> can we call new configuration elments by their existings name? We can >> avoid >>> introduction of second Ignite's term in that case. >>> >> >> The refactoring is about merging memory and persistence configuration under >> the same umbrella. The term "MemoryPolicy" does not make sense anymore, >> given that it now also includes persistent configuration as well. >> >> >>> >>> вт, 26 сент. 2017 г. в 17:27, Dmitriy Setrakyan <dsetrak...@apache.org>: >>> >>>> Dmitriy, we are not renaming classes, we are refactoring them. Prior to >>>> this design, it was impossible to set persistence configuration on >>>> per-cache basis. With this new design, users will be able to configure >>> some >>>> caches to be in-memory only and others to be on disk. >>>> >>>> Given that we are already refactoring, it only makes sense to pick >>> better, >>>> more appropriate names. >>>> >>>> D. >>>> >>>> On Tue, Sep 26, 2017 at 7:20 AM, Dmitry Pavlov <dpavlov....@gmail.com> >>>> wrote: >>>> >>>>> Vladimir, it is not clear for me, why we need to rename existing >>>>> configuration classes. Could you explain? And if we can't get >> consensus >>>>> now, should we pospond solution? >>>>> >>>>> My idea is that user needs this feature more than elegant names in >>>>> configuration. >>>>> >>>>> Moreover once MemoryPolicyConfiguration was introduced as Ignite term >>> it >>>> is >>>>> simpler to keep it as is, than create new terms. >>>>> >>>>> Sincerely, >>>>> Dmitriy Pavlov >>>>> >>>>> вт, 26 сент. 2017 г. в 16:59, Vladimir Ozerov <voze...@gridgain.com >>> : >>>>> >>>>>> I do not understand why we should delay with renames. Yes, it will >>>> cause >>>>>> questions, so we will have to put additional efforts to docs and >>>>> JavaDocs. >>>>>> But the earlier we do that, the better. >>>>>> >>>>>> On Tue, Sep 26, 2017 at 4:50 PM, Dmitry Pavlov < >>> dpavlov....@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Hi Igniters, sorry for late response. I didn't catch idea of >>>> renaming. >>>>>>> PersistentStoreConfiguration is intuitive, and >>>>> MemoryPolicyConfiguration >>>>>> is >>>>>>> intuitive also. >>>>>>> >>>>>>> If we rename these classes now, it will bring more questions to >>> user >>>>>> list. >>>>>>> Users may be confused by old and new names and by trying to match >>> it. >>>>>> More >>>>>>> issues can came from XML configs that users already have. >>>>>>> >>>>>>> Can we postpone the renaming? I suggest to finish 'persistence >> per >>>>> memory >>>>>>> policy' task without renaming, and create separate JIRA issue for >>>>>> creating >>>>>>> future decision? >>>>>>> >>>>>>> вт, 26 сент. 2017 г. в 15:25, Alexey Goncharuk < >>>>>> alexey.goncha...@gmail.com >>>>>>>> : >>>>>>> >>>>>>>> I do not like DurableMemoryConfiguration, because it's quite >>>>> confusing >>>>>> - >>>>>>> we >>>>>>>> configure in-memory caches using DurableMemory class, which >>>>> immediately >>>>>>>> suggests that everything will be persisted. I am not sure if >> this >>>> is >>>>> a >>>>>>>> right wording choice for the documentation either. I would go >>> with >>>>>>>> DataStoreConfiguration and DataRegionConfiguration. >>>>>>>> >>>>>>>> --AG >>>>>>>> >>>>>>>> 2017-09-26 2:22 GMT+03:00 Dmitriy Setrakyan < >>> dsetrak...@apache.org >>>>> : >>>>>>>> >>>>>>>>> Given that we already have a notion of CacheStore which comes >>>> from >>>>>>> JCache >>>>>>>>> spec, I think having other stores may get confusing. I like >>>>>>>>> DurableMemoryConfiguration. >>>>>>>>> >>>>>>>>> Other opinions? >>>>>>>>> >>>>>>>>> D. >>>>>>>>> >>>>>>>>> On Mon, Sep 25, 2017 at 12:24 PM, Vladimir Ozerov < >>>>>>> voze...@gridgain.com> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> Dima, let's finalize the design first. >>>>>>>>>> >>>>>>>>>> As I understand, we are happy with idea to merge >>>>>> MemoryConfiguration >>>>>>>>>> and PersistentStoreConfiguration >>>>>>>>>> into something what I called DataConfiguration, and to >> rename >>>>>>>>>> MemoryPolicyConfiguration to DataRegionConfiguration. >>>>>>>>>> >>>>>>>>>> The only outstanding qurestion is whether DataConfiguration >>> is >>>> a >>>>>> good >>>>>>>>> name. >>>>>>>>>> I am not very happy with it, so let's think of other >>>>> alternatives. >>>>>>>> Quick >>>>>>>>>> ideas: >>>>>>>>>> 1) StoreConfiguration - looks perfect to me - short and >>>>>>>> self-describing, >>>>>>>>>> but clashes a bit with existing CacheStore >>>>>>>>>> 2) DataStoreConfiguration - same as p.1, but the word >> "data" >>> is >>>>> not >>>>>>>>>> necessary IMO >>>>>>>>>> 3) PageStoreConfiguration? GIves a hint to our page-based >>>>>>> architecture. >>>>>>>>>> 4) DurableMemoryConfiguration - aligns well with our docs, >>> but >>>> I >>>>> do >>>>>>> not >>>>>>>>>> like it - too long and misleading >>>>>>>>>> >>>>>>>>>> Any other ideas? >>>>>>>>>> >>>>>>>>>> I would prefer to have either [StoreConfiguration + >>>>>>>>>> StoreRegionConfiguration] or [PageStoreConfiguration and >>>>>>>>>> PageStoreRegionConfiguration]. Looks clean and simple. >>>>>>>>>> >>>>>>>>>> Vladimir. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Mon, Sep 25, 2017 at 3:49 PM, Dmitriy Setrakyan < >>>>>>>>> dsetrak...@apache.org> >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>>> Vladimir, >>>>>>>>>>> >>>>>>>>>>> Can you please add the configuration example in the >> ticket? >>>>>>>>>>> >>>>>>>>>>> D. >>>>>>>>>>> >>>>>>>>>>> On Mon, Sep 25, 2017 at 12:20 AM, Alexey Goncharuk < >>>>>>>>>>> alexey.goncha...@gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> Guys, >>>>>>>>>>>> >>>>>>>>>>>> I suggest we finalize the configuration changes in the >>>>> original >>>>>>>>> ticket >>>>>>>>>>>> then: https://issues.apache.org/ >> jira/browse/IGNITE-6030 >>>> and >>>>>>>> proceed >>>>>>>>>> with >>>>>>>>>>>> the changes. >>>>>>>>>>>> >>>>>>>>>>>> 2017-09-23 17:08 GMT+03:00 Dmitriy Setrakyan < >>>>>>>> dsetrak...@apache.org >>>>>>>>>> : >>>>>>>>>>>> >>>>>>>>>>>>> Can we specify what metrics will look like? I think >> we >>>>> should >>>>>>> not >>>>>>>>>> just >>>>>>>>>>>>> blindly merge them. >>>>>>>>>>>>> >>>>>>>>>>>>> On Fri, Sep 22, 2017 at 11:01 PM, Vladimir Ozerov < >>>>>>>>>>> voze...@gridgain.com> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Denis, >>>>>>>>>>>>>> >>>>>>>>>>>>>> Makes sense. Thanks for catching it! >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Sat, Sep 23, 2017 at 8:45 AM, Denis Magda < >>>>>>>> dma...@apache.org> >>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> If we’re taking the consolidation path for Memory >>> and >>>>>>>>> Persistence >>>>>>>>>>>>>>> configurations then it makes sense to merge >>>>> MemoryMetrics >>>>>>> [1] >>>>>>>>> and >>>>>>>>>>>>>>> PersistenceMetrics [2] plus their JMX beans. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Agree? >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> [1] >>>>>> https://ignite.apache.org/releases/latest/javadoc/org/ >>>>>>>>>>>>>>> apache/ignite/MemoryMetrics.html < >>>>>>> https://ignite.apache.org/ >>>>>>>>>>>>>>> releases/latest/javadoc/org/ >>>>> apache/ignite/MemoryMetrics. >>>>>>> html> >>>>>>>>>>>>>>> [2] >>>>>> https://ignite.apache.org/releases/latest/javadoc/org/ >>>>>>>>>>>>> apache/ignite/ >>>>>>>>>>>>>>> PersistenceMetrics.html >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> — >>>>>>>>>>>>>>> Denis >>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Sep 22, 2017, at 10:18 PM, Dmitriy >> Setrakyan < >>>>>>>>>>>>> dsetrak...@apache.org >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I like it. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> Alexey G, can you please chime in? >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> D. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Fri, Sep 22, 2017 at 11:33 AM, Vladimir >>> Ozerov < >>>>>>>>>>>>>> voze...@gridgain.com> >>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Guys, >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Here is my proposal: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> 1) MemoryPolicyConfiguration is renamed to >>>>>>>>>>>>> *DataRegionConfiguration*. >>>>>>>>>>>>>>>>> 2) PersistenceConfiguration is merged with >>>>>>>>> MemoryConfiguration >>>>>>>>>>> and >>>>>>>>>>>>>>> renamed >>>>>>>>>>>>>>>>> to ... *DataStorageConfiguration*! It has: >>> common >>>>>> memory >>>>>>>>>>> settings >>>>>>>>>>>>>> (e.g. >>>>>>>>>>>>>>>>> default data region), persistence settings >> (e.g. >>>>> WAL) >>>>>>> and >>>>>>>> a >>>>>>>>>> list >>>>>>>>>>>> of >>>>>>>>>>>>>>>>> DataRegionConfiguration beans. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> What we have in the end: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> <property name="dataConfiguration"> >>>>>>>>>>>>>>>>> <bean class="o.a.i.DataConfiguration"> >>>>>>>>>>>>>>>>> <property name="pageSize" value="8192" >> /> >>>>>>>>>>>>>>>>> <property name="persistentStorePath" >>>>>>>> value="/my/path" >>>>>>>>>> /> >>>>>>>>>>>>>>>>> <property name="dataRegions"> >>>>>>>>>>>>>>>>> <list> >>>>>>>>>>>>>>>>> <bean >>>>>>>> class="o.a.i.DataRegionConfiguration"> >>>>>>>>>>>>>>>>> <property name="name" >>>>>>> value="VOLATILE" >>>>>>>> /> >>>>>>>>>>>>>>>>> <property name="maxSize" >>>>>>>>>>> value="1_000_000_000" >>>>>>>>>>>> /> >>>>>>>>>>>>>>>>> </bean> >>>>>>>>>>>>>>>>> <bean >>>>>>>> class="o.a.i.DataRegionConfiguration"> >>>>>>>>>>>>>>>>> <property name="name" >>>>>>>> value="PERSISTENT" >>>>>>>>> /> >>>>>>>>>>>>>>>>> <property name="maxSize" >>>>>>>>>>> value="1_000_000_000" >>>>>>>>>>>> /> >>>>>>>>>>>>>>>>> <property name="persistent" >>>>>>>> value="true" >>>>>>>>> /> >>>>>>>>>>>>>>>>> </bean> >>>>>>>>>>>>>>>>> </list> >>>>>>>>>>>>>>>>> </property> >>>>>>>>>>>>>>>>> </bean> >>>>>>>>>>>>>>>>> </property> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Makes sense? >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> Vladimir. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> On Thu, Sep 21, 2017 at 7:04 AM, Dmitriy >>>> Setrakyan < >>>>>>>>>>>>>>> dsetrak...@apache.org> >>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Firstly all, why not call it DataPolicy >> instead >>>> of >>>>>>>>>>> MemoryPolicy? >>>>>>>>>>>>>>>>> Secondly, >>>>>>>>>>>>>>>>>> why not set data policies directly on >>>>>>>> IgniteConfiguration. >>>>>>>>>> And >>>>>>>>>>>>>> lastly, >>>>>>>>>>>>>>>>> how >>>>>>>>>>>>>>>>>> about we combine memory and disk properties >> in >>>> one >>>>>> bean >>>>>>>>> with >>>>>>>>>>>> clear >>>>>>>>>>>>>>> naming >>>>>>>>>>>>>>>>>> convention? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Here is the example. Note that all properties >>>> above >>>>>>> must >>>>>>>>>> start >>>>>>>>>>>> with >>>>>>>>>>>>>>> with >>>>>>>>>>>>>>>>>> "Memory" or "Disk". >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> *IgniteConfiguration cfg = new >>>>>> IgniteConfiguration();* >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> *cfg.setDataPolicies( new >>>>>> DataPolicyConfiguration() >>>>>>>>>>>>>>>>>>> .setName("bla"), >>> .setMemoryMaxSize(1024), >>>>> // >>>>>>> must >>>>>>>>> be >>>>>>>>>>>>> greater >>>>>>>>>>>>>>>>> than >>>>>>>>>>>>>>>>>> 0, >>>>>>>>>>>>>>>>>>> since memory always needs to be enabled. >>>>>>>>>>>>> .setDiskMaxSize(0), >>>>>>>>>>>>>> // >>>>>>>>>>>>>>>>> if >>>>>>>>>>>>>>>>>>> greater than 0, then persistence is enabled. >>>>> );* >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I think this approach is much more concise >> and >>>>>> straight >>>>>>>>>>> forward. >>>>>>>>>>>>> What >>>>>>>>>>>>>>> do >>>>>>>>>>>>>>>>>> you think? >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> D. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> On Wed, Sep 20, 2017 at 4:55 AM, Vladimir >>> Ozerov >>>> < >>>>>>>>>>>>>> voze...@gridgain.com >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> I prefer the second. Composition over >>>> inheritance >>>>> - >>>>>>> this >>>>>>>>> is >>>>>>>>>>> how >>>>>>>>>>>>> all >>>>>>>>>>>>>>> our >>>>>>>>>>>>>>>>>>> configuration is crafted. >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> E.g. we do not have "CacheConfiguration" >> and " >>>>>>>>>>>>>>>>>>> StoreEnabledCacheConfiguration". >>>>>>>>>>>>>>>>>>> Instead, we have "CacheConfiguration. >>>>>>>>> setCacheStoreFactory". >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> On Wed, Sep 20, 2017 at 2:46 PM, Alexey >>>> Goncharuk >>>>> < >>>>>>>>>>>>>>>>>>> alexey.goncha...@gmail.com> wrote: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> Reiterating this based on some feedback >> from >>>> PDS >>>>>>> users. >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> It might be confusing to configure >>> persistence >>>>> with >>>>>>>>>>>>> "MemoryPolicy", >>>>>>>>>>>>>>>>> so >>>>>>>>>>>>>>>>>>>> another approach is to deprecate the old >>> names >>>>> and >>>>>>>>>> introduce >>>>>>>>>>> a >>>>>>>>>>>>> new >>>>>>>>>>>>>>>>> name >>>>>>>>>>>>>>>>>>>> "DataRegion" because it reflects the actual >>>> state >>>>>>> when >>>>>>>>> data >>>>>>>>>>> is >>>>>>>>>>>>>> stored >>>>>>>>>>>>>>>>>> on >>>>>>>>>>>>>>>>>>>> disk and partially in memory. I have two >>>> options >>>>> in >>>>>>>> mind, >>>>>>>>>>> each >>>>>>>>>>>> of >>>>>>>>>>>>>>>>> them >>>>>>>>>>>>>>>>>>>> looks acceptable to me, so I would like to >>> have >>>>>> some >>>>>>>>>> feedback >>>>>>>>>>>>> from >>>>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>>>> community. Old configuration names will be >>>>>> deprecated >>>>>>>>> (but >>>>>>>>>>>> still >>>>>>>>>>>>> be >>>>>>>>>>>>>>>>>> taken >>>>>>>>>>>>>>>>>>>> if used for backward compatibility). Note, >>> that >>>>> old >>>>>>>> names >>>>>>>>>>>>>> deprecation >>>>>>>>>>>>>>>>>>>> handles default configuration compatibility >>>> very >>>>>>>> nicely - >>>>>>>>>>>> current >>>>>>>>>>>>>> PDS >>>>>>>>>>>>>>>>>>> users >>>>>>>>>>>>>>>>>>>> will not need to change anything to keep >>>>> everything >>>>>>>>>> working. >>>>>>>>>>>> The >>>>>>>>>>>>>> two >>>>>>>>>>>>>>>>>>>> options I mentioned are below: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> * we have two separate classes for >> in-memory >>>> and >>>>>>>>> persisted >>>>>>>>>>> data >>>>>>>>>>>>>>>>>> regions, >>>>>>>>>>>>>>>>>>>> so the configuration would look like so: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> IgniteConfiguration cfg = new >>>>>> IgniteConfiguration(); >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> cfg.setDataRegionsConfiguration(new >>>>>>>>>>> DataRegionsConfiguration() >>>>>>>>>>>>>>>>>>>> .setDataRegions( >>>>>>>>>>>>>>>>>>>> new MemoryDataRegion() >>>>>>>>>>>>>>>>>>>> .setName("volatileCaches") >>>>>>>>>>>>>>>>>>>> .setMaxMemorySize(...), >>>>>>>>>>>>>>>>>>>> new PersistentDataRegion() >>>>>>>>>>>>>>>>>>>> .setName("persistentCaches") >>>>>>>>>>>>>>>>>>>> .setMaxMemorySize(...) >>>>>>>>>>>>>>>>>>>> .setMaxDiskSize())); >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> cfg.setPersistentStoreConfiguration(new >>>>>>>>>>>>>>>>> PersistentStoreConfiguration() >>>>>>>>>>>>>>>>>> ); >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> * we have one class for data region >>>>> configuration, >>>>>>> but >>>>>>>> it >>>>>>>>>>> will >>>>>>>>>>>>>> have a >>>>>>>>>>>>>>>>>>>> sub-bean for persistence configuration: >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> IgniteConfiguration cfg = new >>>>>> IgniteConfiguration(); >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> cfg.setDataRegionsConfiguration(new >>>>>>>>>>> DataRegionsConfiguration() >>>>>>>>>>>>>>>>>>>> .setDataRegions( >>>>>>>>>>>>>>>>>>>> new DataRegion() >>>>>>>>>>>>>>>>>>>> .setName("volatileCaches") >>>>>>>>>>>>>>>>>>>> .setMaxMemorySize(...), >>>>>>>>>>>>>>>>>>>> new DataRegion() >>>>>>>>>>>>>>>>>>>> .setName("persistentCaches") >>>>>>>>>>>>>>>>>>>> .setMaxMemorySize(...), >>>>>>>>>>>>>>>>>>>> .setPersistenceConfiguration( >>>>>>>>>>>>>>>>>>>> new >>>> DataRegionPersistenceConfigura >>>>>>> tion() >>>>>>>>>>>>>>>>>>>> .setMaxDiskSize(...)))); >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>> cfg.setPersistentStoreConfiguration(new >>>>>>>>>>>>>>>>> PersistentStoreConfiguration() >>>>>>>>>>>>>>>>>> ); >>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >>