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+bus >>> 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.java >>> f6743ba >>> > >>> api/src/org/apache/cloudstack/api/command/admin/region/UpdateRegionCmd.java >>> 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-core-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/network/contrail/management/MockAccountManager.java >>> 957f708 >>> > plugins/pom.xml 9b391b8 >>> > >>> server/resources/META-INF/cloudstack/core/spring-server-core-managers-context.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 >>> > >>> > >>> >>> >> >