On 4/8/14, 12:03 PM, "Alex Ough" <alex.o...@sungardas.com> wrote:
>I understand that, but I don't understand why their values can't be >assigned through the dao methods when necessary. >But if you still feel uncomfortable, do you think it is ok to include the >job to store the datetime values in another table into the same >transaction >of creating/removing/updating the resources in their manager methods to >guarantee the atomicity? Yes, as long as this transaction is made from your plugin code, not from GenericDao itself. -Alena. > >Thanks >Alex Ough > > >On Tue, Apr 8, 2014 at 2:45 PM, Alena Prokharchyk < >alena.prokharc...@citrix.com> wrote: > >> Alex, >> >> Take for example the Removed field. Its not being managed through none >>of >> the CS interfaces, and you can't set this value neither from the API, >>nor >> from the Orchestration layer. Its being set automatically in GenericDao >> once the object is set for removal by the very same Dao. >> >> The same applies to the Created/Updated fields. >> >> >> -Alena. >> >> On 4/8/14, 11:41 AM, "Alex Ough" <alex.o...@sungardas.com> wrote: >> >> >#2 : I will, and YES, you need to change the modes of all regions, >>which >> >also means that you can sync the resources only in the regions you >>select. >> > >> > >> >#1: Well... it looks like I still need more information why they can't >>be >> >added to their attributes. They are also managed through the their dao >> >interfaces, and the values are assigned only during the full scan to >> >preserve the original value when they >> > are missed. >> > >> > >> >Thanks >> >Alex Ough >> > >> > >> >On Tue, Apr 8, 2014 at 2:29 PM, Alena Prokharchyk >> ><alena.prokharc...@citrix.com> wrote: >> > >> > >> > >> >On 4/8/14, 11:26 AM, "Alex Ough" <alex.o...@sungardas.com> wrote: >> > >> >>Yes, I really hope so from now on :-) >> >> >> >> >> >>For #2, the current setting is NOT syncing the resources and these are >> >>the steps to enable this feature >> >> - Set the "mode" value of the remote regions to sync into 'sync >>on' >> >> - Set the value of global parameter, "region.full.scan.interval" >>(the >> >>default value is '0"), into value of milliseconds to enable the Full >>Scan >> >> Let me know if you want a different way. >> > >> > >> > >> >Sounds good to me. We have to document it though very clearly under >>³how >> >to disable the feature² section. When you set the mode, you have to >>set it >> >for all the regions to completely disable the feature, right? >> > >> >> >> >> >> >>For #1, after another thought, I'm not still clear why those datetime >> >>values can't be added to their attributes. As you recommended, we can >>use >> >>another table to track them, but there can be an issue of partial >>commits >> >>when only the resource are successfully >> >> created/updated/removed and their datetime values fail to be stored >> >>because they are NOT in the same transaction. >> >> >> >> >> >>And we also need to track the 'removed' datetime because when a >>resource >> >>exists in only either the local or the remote region, we don't know >> >>whether it was created but it failed to be created in another region >>or >> >>it was removed but it failed to be removed >> >> in another region. That's why I track the "removed" datetime and >> >>preserve the original datetime. >> > >> > >> >I¹m fine with keeping the removed field, as long as you don¹t update >>this >> >field in CS DB. >> > >> > >> >> >> >> >> >>Let me think about the #1 more closely and let you know what I find. >> >>So please let me know if you have any other suggestion related with >>this. >> >>Thanks >> >>Alex Ough >> >> >> >> >> >> >> >>On Tue, Apr 8, 2014 at 2:09 PM, Alena Prokharchyk >> >><alena.prokharc...@citrix.com> wrote: >> >> >> >>Sorry, Alex, for not providing the input earlier, I understand that >> >>requests like this shouldn¹t come the last minute. But unfortunately >>your >> >>FS didn¹t have enough information to caught these design problems - >>the >> >>fact that the GenericDaoFields modified/removed >> >> get modified directly - from the very start, and only by reviewing >>the >> >>review board ticket you could see it. Hopefully the next time the >> >>experience will be more smooth for both parties. Meanwhile I¹m ready >>to >> >>help with whatever questions you have. >> >> >> >> >> >>Yes, only 2 things need to be fixed. #2 should be pretty >>straightforward. >> >>Make sure your component injects the global config variable if you >>decide >> >>to make a switch via global config. For that, your class has to >>implement >> >>Configurable interface. You can >> >> find examples of how this interface is utilized by existing CS >> >>components. Here is the FS: >> >> >> >> >> >>https://cwiki.apache.org/confluence/display/CLOUDSTACK/Configuration >> >> >> >> >> >>For #1 - I don¹t think you need to keep track of Removed date times. >>Once >> >>the removed field is set in Region1, its safe to just go ahead and >>remove >> >>the entry in all the rest of the regions. You can¹t (and don¹t need >>to) >> >>perform any other operation on the >> >> resource if its removed in one of the regions. >> >>You just have to fix it in created/updated(modified) fields. >> >> >> >> >> >>-Alena. >> >> >> >> >> >>From: Alex Ough <alex.o...@sungardas.com> >> >>Date: Tuesday, April 8, 2014 at 10:39 AM >> >>To: Alena Prokharchyk <alena.prokharc...@citrix.com> >> >>Cc: "dev@cloudstack.apache.org" <dev@cloudstack.apache.org>, Alex >>Huang >> >><alex.hu...@citrix.com> >> >> >> >>Subject: Re: Review Request 20099: Domain-Account-User Sync Up Among >> >>Multiple Regions (Core Changes) >> >> >> >> >> >> >> >> >> >> >> >>Alena, >> >> >> >> >> >>It would be really nice if I had this feedback when I presented this >>at >> >>the beginning. >> >>Anyway, so are only these 2 things necessary to be merged into the >> >>master? >> >> >> >> >> >>1. find another way to store the created/updated/removed datetimes of >>the >> >>resources >> >>2. provide a way to disable this feature. >> >> >> >> >> >>Let me try to resolve those 2 and let you know once done, >> >>so please let me know now if there is anything else needed. >> >> >> >> >> >>Thanks >> >>Alex Ough >> >> >> >> >> >> >> >>On Tue, Apr 8, 2014 at 1:02 PM, Alena Prokharchyk >> >><alena.prokharc...@citrix.com> wrote: >> >> >> >>Alex, thank you for the explanation. But I think there should be >>another >> >>way of saving all the ³updated²/³created² info rather than updating >>the >> >>UserVO/AccountVO/DomainVO fields directly. >> >> >> >> >> >>The one way I can think of - you can create a helper table where you >> >>store the ref UUID->Region->UpdatedTime stamps for all Local/Remote >> >>regions, and you update/compare those fields. Your component is a >> >>business logic component, and it shouldn¹t modify >> >> the fields originally set by GenericDao (Removed/Created/Modified). >>You >> >>should operate only with parameters that are exposed to changes coming >> >>through the APIs. >> >> >> >> >> >>-Alena. >> >> >> >> >> >>From: Alex Ough <alex.o...@sungardas.com> >> >>Date: Monday, April 7, 2014 at 9:16 PM >> >>To: "dev@cloudstack.apache.org" <dev@cloudstack.apache.org>, Alena >> >>Prokharchyk <alena.prokharc...@citrix.com>, >> >> Alex Huang <alex.hu...@citrix.com> >> >>Subject: Re: Review Request 20099: Domain-Account-User Sync Up Among >> >>Multiple Regions (Core Changes) >> >> >> >> >> >> >> >>And all 4 of the recommendations Alex Hwang gave were already >>implemented >> >>to support the real time synchronization (#1), >> >>but like I said in the previous email, we need to support the full >>scan >> >>(#2) to cover any failures during the synchronization. >> >> >> >> >> >>Thanks >> >>Alex Ough >> >> >> >> >> >> >> >> >> >> >> >>On Tue, Apr 8, 2014 at 12:10 AM, Alex Ough >> >><alex.o...@sungardas.com> wrote: >> >> >> >>Alena/Alex, >> >> >> >> >> >>I think I need to give some explanation how this works. >> >> >> >> >> >>There are 2 ways of sync. >> >> >> >> >> >>1. The real time sync : Whenever a resource is create/updated/removed, >> >>each region gets the event of that and requests the same job to all >> >>remote regions using API interfaces, which will create/update/remove >>the >> >>same resource in each remote region in the >> >> real time. >> >> >> >> >> >>2. Full scan : There can be some interruption (whatever the reason is) >> >>that makes fail the real time sync, so each region scans its own >> >>resources with an interval and compares them with those of remote >> >>regions. This is a little tricky because we need to >> >> find out whose change is later when there is any discrepancy between >> >>resources in the local & remote regions and this is why we need >>maintain >> >>the created/updated/removed times. >> >> >> >> >> >> 1) When a resource exists in both local (L) and remote regions >>(R1) >> >> - compare the 'updated' times of both >> >> - Update the local's resource using remote resource attributes >> >>only if the updated time of the remote region is later >> >> - Store the "updated" time of the remote resource (not the >> >>current time) as the local's updated time >> >> - If we store the current time as the updated time, it will >>cause >> >>an mis-sync >> >> because if the resource was updated in another remote region >> >>(R2) a little after it was updated in the remote region(R1), >> >> update in R2 region will be overwritten by the update in R1 >> >>because the current time is later than the updated time of R2 >> >> >> >> >> >> 2) When a resource exists only in the local region >> >> - Find if there was a removal event of this resource in the >>remote >> >>region >> >> - and if so, compare the time when the event occurred with the >> >>created time in the local region >> >> - Remove the resource from the local only if the event time is >> >>later >> >> - Like #1, store the time the event was occurred as the >>'removed' >> >>time of the removed resource in the local region >> >> >> >> >> >> 3) When a resource exists only in the remote region >> >> - Find if the resource in the local has been removed >> >> - If so, compare the removal time in the local and the created >>time >> >>in the remote >> >> - Create the resource in the local only if either the local was >>not >> >>removed or the created time of the remote is later than the removal in >> >>local >> >> - LIke #1 & #2, store the time of the created of the remote >>region >> >>as the 'created' time of the newly created in the local region. >> >> >> >> >> >>I hope this will help you understand how the create/updated/removed >>times >> >>are managed. >> >>If there is no failure in the real time sync (#1), we'll not need the >> >>full scan (#2) and we don't need to worry about the times, >> >>but there is no way to guarantee #1 not to be failed, so #2 is very >> >>important to be supported. >> >> >> >> >> >>Please let me know what you think and we can have a conference call if >> >>you want. >> >>Thanks >> >>Alex Ough >> >> >> >> >> >> >> >>On Mon, Apr 7, 2014 at 8:39 PM, Alena Prokharchyk >> >><alena.prokharc...@citrix.com> wrote: >> >> >> >> >> >>----------------------------------------------------------- >> >>This is an automatically generated e-mail. To reply, visit: >> >> >> >>https://reviews.apache.org/r/20099/#review39753 >> >>----------------------------------------------------------- >> >> >> >> >> >> >> >>Alex, just discussed your changes to existing CS code >> >>(Account/Domain/UserManager, VOs, Daos, GenericDaoBase), with Alex >>Huang. >> >>Here are the concerns: >> >> >> >> >> >>1) there is no need to update the Removed field. Once the entry is >> >>removed, you should purely rely on the removed not to be null, in >>order >> >>to update it in the second region database. >> >> >> >>2) The big issue - you can't trigger generic dao fields modification - >> >>Modified/Removed - through the Management/Services layer. Once the >>field >> >>is defined in Generic Dao Attributes, it should be populated by >>generic >> >>dao only. It should never be populated by >> >> the business logic component what your service is. >> >> >> >>You should remove the field updates from all the methods I've >>mentioned >> >>in my previous review (for example, >> >> >> >> AccountManager >> >> >> >> public boolean disableAccount(long accountId, Date modified) throws >> >>ConcurrentOperationException, ResourceUnavailableException;) >> >> >> >>and find another way of keeping track of modified attribute update for >> >>the CS objects. >> >> >> >>Alex suggested a following solution: >> >>========================================================= >> >>* Every time user/domain/account is created/updated/removed in CS, >> >>certain Action event is generated. There is a way to pubish this >>event to >> >>the event bus, either rabbitMQ or in-memory bus. >> >>* Instead of scanning user/domain/account tables, your plugin should >> >>listen to the create/update/remove user/domain/account events >>published >> >>to the event bus, and update the user/domain/account in all regions in >> >>the system accordingly >> >>* Of course, you have to skip the event processing for the event >> >>generated by your plugin - this part can be tricky >> >>* The events processing should be synchronized on the resource type >> >>(user/account/domain) + event timestamp in your plugin, so all the >>events >> >>for the same resource are processed in the order based on the >>timeStamp >> >>they were generated >> >> >> >>When to use in-memory bus vs RabbitMQ? It depends on how your service >> >>runs. If it runs on each management server, then it would be >>responsible >> >>only for events generated by this management server, and should use >> >>events published to in-memory bus. >> >>If your server runs only on one of the Management servers, and there >>are >> >>multiple servers in the cluster, you should listen to all the events >>from >> >>all the management servers in cluster. In this case, you should use >> >>RabbitMQ bus. >> >> >> >>Here is the link to the in-memory bus FS: >> >> >> >>https://cwiki.apache.org/confluence/display/CLOUDSTACK/In-memory+event+bu >> >>s >> >>But I'm sure you are familiar how this stuff works as you utilize the >> >>event bus in your code already. >> >> >> >>Or you can find another solution; but this solution should never >>involve >> >>direct modification for "Modified" field by your plugin. >> >> >> >>3) You should add a way to disable your plugin through Global >>Config/API. >> >>This should be done to support the case when user/domain/account >>entries >> >>are generated by some app running on top of CS, for all the regions in >> >>the system. In this case admin controls >> >> the user/domain/account entries outside of the CS, and synchronize >>them >> >>outside as well - so might need to disable your plugin. >> >> >> >>- Alena Prokharchyk >> >> >> >> >> >>On April 7, 2014, 7:13 p.m., Alex Ough wrote: >> >>> >> >>> ----------------------------------------------------------- >> >>> This is an automatically generated e-mail. To reply, visit: >> >>> https://reviews.apache.org/r/20099/ >> >> >> >>> ----------------------------------------------------------- >> >>> >> >>> (Updated April 7, 2014, 7:13 p.m.) >> >>> >> >>> >> >>> Review request for cloudstack. >> >>> >> >>> >> >> >> >>> Repository: cloudstack-git >> >>> >> >>> >> >>> Description >> >>> ------- >> >>> >> >>> This is the review request for the core changes related with #17790 >> >>>that has only the new plugin codes. >> >>> >> >>> >> >> >> >>> Diffs >> >>> ----- >> >>> >> >>> api/src/com/cloud/domain/Domain.java 365a705 >> >>> api/src/com/cloud/event/EventTypes.java 39ef710 >> >>> api/src/com/cloud/user/Account.java b912e51 >> >>> api/src/com/cloud/user/AccountService.java 7e37b38 >> >>> api/src/com/cloud/user/User.java 36e9028 >> >>> api/src/com/cloud/user/UserAccount.java c5a0637 >> >>> api/src/org/apache/cloudstack/api/ApiConstants.java fdb4558 >> >>> api/src/org/apache/cloudstack/api/BaseCmd.java f6f21ae >> >>> >> >>>>>api/src/org/apache/cloudstack/api/command/admin/region/AddRegionCmd.ja >>>>>va >> >>>f6743ba >> >> >> >>> >> >>>>>api/src/org/apache/cloudstack/api/command/admin/region/UpdateRegionCmd >>>>>.j >> >>>a >> >>>va b08cbbb >> >>> api/src/org/apache/cloudstack/api/response/AccountResponse.java >> >>>2e50c51 >> >>> api/src/org/apache/cloudstack/api/response/DomainResponse.java >> >>>0c0281e >> >>> api/src/org/apache/cloudstack/api/response/RegionResponse.java >> >>>6c74fa6 >> >>> api/src/org/apache/cloudstack/api/response/UserResponse.java >>40e1561 >> >>> api/src/org/apache/cloudstack/region/Region.java df64e44 >> >>> api/src/org/apache/cloudstack/region/RegionService.java afefcc7 >> >>> api/test/org/apache/cloudstack/api/command/test/RegionCmdTest.java >> >>>10c3d85 >> >>> client/pom.xml d8dbde7 >> >> >> >>> >> >>>>>engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema- >>>>>co >> >>>r >> >>>e-daos-context.xml 489b37d >> >>> engine/schema/src/com/cloud/domain/DomainVO.java f6494b3 >> >>> engine/schema/src/com/cloud/user/AccountVO.java 0f5a044 >> >>> engine/schema/src/com/cloud/user/UserAccountVO.java cef9239 >> >>> engine/schema/src/com/cloud/user/UserVO.java 68879f6 >> >>> engine/schema/src/org/apache/cloudstack/region/RegionVO.java >>608bd2b >> >>> framework/db/src/com/cloud/utils/db/Attribute.java 82c2bdb >> >>> framework/db/src/com/cloud/utils/db/GenericDao.java cb401cd >> >>> framework/db/src/com/cloud/utils/db/GenericDaoBase.java 2052aad >> >>> framework/db/src/com/cloud/utils/db/SqlGenerator.java befe34b >> >>> framework/db/test/com/cloud/utils/db/GenericDaoBaseTest.java >>aef0c69 >> >>> framework/db/test/com/cloud/utils/db/SqlGeneratorTest.java >> >>>PRE-CREATION >> >>> >> > >> > >> >>>>>plugins/network-elements/juniper-contrail/test/org/apache/cloudstack/n >>>>>et >> >>>w >> >>>ork/contrail/management/MockAccountManager.java 957f708 >> >>> plugins/pom.xml 9b391b8 >> >> >> >>> >> >>>>>server/resources/META-INF/cloudstack/core/spring-server-core-managers- >>>>>co >> >>>n >> > >> >>>text.xml fc1c7e2 >> >>> server/src/com/cloud/api/ApiDispatcher.java 95074e2 >> >>> server/src/com/cloud/api/ApiResponseHelper.java 38f2f0b >> >>> server/src/com/cloud/api/dispatch/ParamProcessWorker.java e9bdd8b >> >>> server/src/com/cloud/api/query/dao/AccountJoinDaoImpl.java ecd97c7 >> >>> server/src/com/cloud/api/query/dao/UserAccountJoinDaoImpl.java >> >>>923a238 >> >>> server/src/com/cloud/api/query/vo/AccountJoinVO.java 8d642ed >> >>> server/src/com/cloud/api/query/vo/UserAccountJoinVO.java ed29284 >> >>> server/src/com/cloud/event/ActionEventUtils.java 28e5680 >> >>> server/src/com/cloud/projects/ProjectManagerImpl.java d10c059 >> >>> server/src/com/cloud/user/AccountManager.java 03bf842 >> >>> server/src/com/cloud/user/AccountManagerImpl.java 2070ee6 >> >>> server/src/com/cloud/user/DomainManager.java f72b18a >> >>> server/src/com/cloud/user/DomainManagerImpl.java fbbe0c2 >> >>> server/src/org/apache/cloudstack/region/RegionManager.java 6f25481 >> >>> server/src/org/apache/cloudstack/region/RegionManagerImpl.java >> >>>8910714 >> >>> server/src/org/apache/cloudstack/region/RegionServiceImpl.java >> >>>98cf500 >> >>> server/test/com/cloud/api/dispatch/ParamProcessWorkerTest.java >> >>>12051a6 >> >>> server/test/com/cloud/user/MockAccountManagerImpl.java f373cba >> >>> server/test/com/cloud/user/MockDomainManagerImpl.java 7dddefb >> >>> server/test/org/apache/cloudstack/region/RegionManagerTest.java >> >>>d7bc537 >> >>> setup/db/db/schema-440to450.sql 2bd5386 >> >>> ui/scripts/regions.js 66dae8c >> >>> >> >>> Diff: https://reviews.apache.org/r/20099/diff/ >> >>> >> >>> >> >>> Testing >> >>> ------- >> >>> >> >> >> >> >> >>> 1. Successfully tested real time synchronization as soon as >>resources >> >>>are created/deleted/modified in one region. >> >>> 2. Successfully tested full scans to synchronize resources that were >> >>>missed during real time synchronization because of any reasons like >> >>>network connection issues. >> >>> 3. The tests were done manually and also automatically by randomly >> >>>generating changes each region. >> >>> >> >>> >> >> >> >>> Thanks, >> >>> >> >>> Alex Ough >> >>> >> >>> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> > >> > >> > >> > >> > >> > >> > >> > >> > >> > >> >>