{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":47752449,"defaultBranch":"master","name":"plugins_replication","ownerLogin":"GerritCodeReview","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2015-12-10T09:44:10.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/7028910?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1716414616.0","currentOid":""},"activityList":{"items":[{"before":"aab69373db6152ea98e7627f816fa3d777d5fe46","after":"56b8ffbab5bf619c0b6b5d44f0255fd41b9e1c89","ref":"refs/heads/master","pushedAt":"2024-04-09T04:49:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Load replication configuration only once\n\nReuse the same instance across requests in ReplicationConfigImpl.\nThis avoids reloading the configuration from disk continuously.\n\nPreviously, the config was retrieved on-demand with the Provider<>.get()\nparadigm. However, the Provider<>.get() would trigger the creation of a\nnew instance of the Config every time it is invoked, causing the full\nscan and parsing of the replication configs.\n\nOn GerritHub.io, the processing of all replication configs (12k files)\nwould take around 5 minutes, causing a catastrophic overload of the CPU\nand preventing the plugin that use ReplicationConfigImpl (replication\nand pull-replication) to even start.\n\nWith regards to the configVersion, the description of the interface has\nbeen amended to reflect the expected behaviour to report the\n*latest actual* version on the storage, regardless of the in-memory copy.\n\nThe AutoReloadConfigDectorator relies on the configVersion to reflect\nthe storage version for triggering a configuration reload by forcibly\nre-creating the config resources and therefore triggering the reload and\nparsing of the replication configs from the underlying storage.\n\nAutoReloadConfigDecorator should not reload the configuration again\nin his constructor because the AutoReloadRunnable has already loaded\nthe initial state and therefore can reuse that one as valid starting\npoint.\n\nChange-Id: I6f9c3a35d1ecbfa87f3daeeb464face0c6b6400e","shortMessageHtmlLink":"Load replication configuration only once"}},{"before":"5e33f8344e3855478914a5c530a327f888bd8c8e","after":"aab69373db6152ea98e7627f816fa3d777d5fe46","ref":"refs/heads/master","pushedAt":"2024-04-04T18:05:33.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Revert \"Expose API to update remotes' configurations\"\n\nThis reverts commit 68ce459ba2dd7d5625e03712635caf78957e1c1e.\n\nThe plan is:\n- Revert master\n- cut stable-3.10\n- Re-apply on master and expose the new API properly\n\nReason for revert: Broke the pull-replication plugin\n\nChange-Id: I461cd1bef6d74d48763662c0c26db47bafe5d422","shortMessageHtmlLink":"Revert \"Expose API to update remotes' configurations\""}},{"before":"012f04240eafe6dfa21fd94e012e97498881c621","after":"5e33f8344e3855478914a5c530a327f888bd8c8e","ref":"refs/heads/master","pushedAt":"2024-04-04T15:49:28.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Decouple replication-api.jar from the main replication plugin\n\nThe Change Ib7a04eea5 made the whole replication plugin an ApiModule\nwhich becomes the base injector for all plugins and forbids reloads,\n(see the Iac2851022ea for enforcing it at Gerrit level)\neven when there is no intention to use th extension points.\n\nAll plugins that expose an ApiModule have the following limitations:\n- Cannot add extra dependencies\n- Cannot be reloaded\n- Are the base injectors for all plugins\n\nThe above limitations aren't acceptable for the whole replication\nplugin when used standalone without extensions.\n\nDefine a new replication-api target that generates the sole ApiModule\nneeded for extending the replication plugin functionality.\nAll the classes that are part of the replication-api are moved\ninto a separate c.g.g.p.replication.api package so that can be\nincluded in the replication-api.jar plugin.\n\nThe gerrit.war will continue to include only the replication.jar which\nwill still work out of the box. Anyone willing to customise its behaviour\nthrough the API will have to build the replication-api target.\nAlso fix the MergedConfigResource that was assuming that the ApiModule\nwas always installed and was binding DynamicItem.\n\nBug: Issue 324462734\nRelease-Notes: Decouple replication-api.jar from the main replication plugin\nChange-Id: Ic432fc77daf1162368abd65f64c463e4ef4f5d6d","shortMessageHtmlLink":"Decouple replication-api.jar from the main replication plugin"}},{"before":"cc47d53d4870e2c285c3b72202ebe6f3fdd67b57","after":"012f04240eafe6dfa21fd94e012e97498881c621","ref":"refs/heads/master","pushedAt":"2024-04-02T12:54:25.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Remove remaining event posting from synchronized sections\n\nPosting events sometimes can take significant time, mainly due to the\nevent visibility checks. When this is done from a synchronized block\nthen all other threads trying to schedule replication to the same\n(locked) Destination get blocked. Even worse, the synchronization\nhappens on the Destination level, so even operations on unrelated\nrepositories block each other.\n\nChange-Id: I7498c7b36ee4b0b2d915a414a0fb1054160e8a1c","shortMessageHtmlLink":"Remove remaining event posting from synchronized sections"}},{"before":"cf510966724cb0963976c9d09aabfdd2bf32d8b6","after":"cc47d53d4870e2c285c3b72202ebe6f3fdd67b57","ref":"refs/heads/master","pushedAt":"2024-03-29T09:04:42.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Destination#pushWasCanceled: minimize time spent in critical section\n\nWhen cancelling a push to a replication destination don't notify\nlisteners about not attempted push during the critical section where the\nstateLock is held but do this immediately after the critical section.\n\nWe observed in a high-availability setup with 2 primaries that\ncancelling a replication push blocked >90 other threads trying to\nupdate some refs which tried to create new replication tasks via\nsynchronous events. Cancelling the push was stuck on visibility checks\ndone in EventBroker#fireEvent triggered by Destination#pushWasCanceled.\nThis visibility check was slow since the affected repository is huge\n(30GiB) and we use NFS for sharing repositories between primaries.\n\nMoving the call to PushOne#notifyNotAttempted outside the critical\nsection should reduce the impact of this critical section on other\nrequests updating refs concurrently.\n\nChange-Id: I085700c3f4cad95ef62521527ac4b920a59c76c2\nSigned-off-by: Matthias Sohn ","shortMessageHtmlLink":"Destination#pushWasCanceled: minimize time spent in critical section"}},{"before":"2f6c7ceeb0cc50bc73d018cd9f990392d58804ab","after":"cf510966724cb0963976c9d09aabfdd2bf32d8b6","ref":"refs/heads/master","pushedAt":"2024-03-28T20:49:36.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Auto-format source code\n\nChange-Id: I5ad6ff9555239442fa3cc86952bf6a313b9bda92","shortMessageHtmlLink":"Auto-format source code"}},{"before":"aac252809094b8e4d4e26d69dab75a23d2da1770","after":"2f6c7ceeb0cc50bc73d018cd9f990392d58804ab","ref":"refs/heads/master","pushedAt":"2024-03-18T15:49:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"ReplicationModule: Remove unused import\n\nChange-Id: I2d497abfa6ca4f4b79accb0f1584e3ff2462826d\nSigned-off-by: Edwin Kempin ","shortMessageHtmlLink":"ReplicationModule: Remove unused import"}},{"before":"d91399e3ff6205e22d065dbe8757f5128890bfac","after":"aac252809094b8e4d4e26d69dab75a23d2da1770","ref":"refs/heads/master","pushedAt":"2024-03-11T13:49:30.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Merge \"Prevent ConcurrentModificationException for PushOne.refBatchesToPush\"","shortMessageHtmlLink":"Merge \"Prevent ConcurrentModificationException for PushOne.refBatches…"}},{"before":"56ea64394e8a58b213c0d859c219036fe6c78b0c","after":"d91399e3ff6205e22d065dbe8757f5128890bfac","ref":"refs/heads/master","pushedAt":"2024-03-09T02:49:48.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Merge \"Expose API to update remotes' configurations\"","shortMessageHtmlLink":"Merge \"Expose API to update remotes' configurations\""}},{"before":"d464511adf2f5560f1aea9932fc6a80e0cf3595d","after":"56ea64394e8a58b213c0d859c219036fe6c78b0c","ref":"refs/heads/master","pushedAt":"2024-03-06T08:07:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Set SSH timeouts from configuration file\n\nIt looks like during the refactoring in I253a6d94, `sshCommandTimeout`\nand `sshConnectionTimeout` fields were not initialized with values from\nthe `replication.config`.\n\nThis is restoring code present before change mentioned above.\n\nChange-Id: Id1f8e9f17a2a8bf7c1dfbd48b6cd005513e7b187","shortMessageHtmlLink":"Set SSH timeouts from configuration file"}},{"before":"877f52684857aa1e5cf6d7146d493cbe9702e314","after":"d464511adf2f5560f1aea9932fc6a80e0cf3595d","ref":"refs/heads/master","pushedAt":"2024-02-19T08:04:31.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Fix PreferredInterfaceType ErrorProne warnings\n\nhttps://errorprone.info/bugpattern/PreferredInterfaceType\n\nWe intent to set PreferredInterfaceType to ERROR in Gerrit core.\n\nChange-Id: I139506ae2233125fce7a28a946bcec2b34794076\nSigned-off-by: Edwin Kempin ","shortMessageHtmlLink":"Fix PreferredInterfaceType ErrorProne warnings"}},{"before":"6b8312712728a4ddc5db33ff3ec93548345ea136","after":"877f52684857aa1e5cf6d7146d493cbe9702e314","ref":"refs/heads/master","pushedAt":"2024-01-27T09:48:44.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Remove unused Nfs class\n\nThe Nfs class is not used anywhere in the code base, also JGit's\nFileUtils class exposes the same methods and will be prefered over this\nimplementation.\n\nChange-Id: I22d2e8a804af02348de34b5cedfe6eddda4fd68c","shortMessageHtmlLink":"Remove unused Nfs class"}},{"before":"f2bcb4111b9597345b855c397754c3dbde626021","after":"6b8312712728a4ddc5db33ff3ec93548345ea136","ref":"refs/heads/master","pushedAt":"2024-01-15T11:05:02.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"config.md: Fix link to delete-project plugin\n\nChange-Id: I314f2937815f60fd543c144ab6fc4c7286541324","shortMessageHtmlLink":"config.md: Fix link to delete-project plugin"}},{"before":"689ce66406c94bf1ef4d43e2ce1951aa1268aa4a","after":"f2bcb4111b9597345b855c397754c3dbde626021","ref":"refs/heads/master","pushedAt":"2024-01-09T09:49:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Adapt to enabling the MutableGuiceModule errorprone pattern in Gerrit core\n\nChange-Id: I839505a493f8cc03ee598d3cf076254bfd50b006\nSigned-off-by: Edwin Kempin ","shortMessageHtmlLink":"Adapt to enabling the MutableGuiceModule errorprone pattern in Gerrit…"}},{"before":"2ce75a836343d901004aedda0a4567c49fabb9ed","after":"689ce66406c94bf1ef4d43e2ce1951aa1268aa4a","ref":"refs/heads/master","pushedAt":"2024-01-09T06:49:11.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Adapt to enabling CheckReturnValue in gerrit core\n\nBug: Google b/312699566\nChange-Id: Iab06e526f7617cd95d59622ad41f2b38cd366686\nSigned-off-by: Edwin Kempin ","shortMessageHtmlLink":"Adapt to enabling CheckReturnValue in gerrit core"}},{"before":"65fbf9b7dde9c712fed071c8f9c676e9c82f29d1","after":"2ce75a836343d901004aedda0a4567c49fabb9ed","ref":"refs/heads/master","pushedAt":"2024-01-05T23:03:56.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Merge \"Move ReplicationPushFilter DynamicItem to ApiModule\"","shortMessageHtmlLink":"Merge \"Move ReplicationPushFilter DynamicItem to ApiModule\""}},{"before":"dc41fee03e9233503e92caea8dae4838e4003d20","after":"65fbf9b7dde9c712fed071c8f9c676e9c82f29d1","ref":"refs/heads/master","pushedAt":"2024-01-05T22:48:45.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Expose API required by pull-replication plugin\n\nThe pull-replication plugin needs to have access to some of the\npreviusly hidden APIs in order to unit- and integration- test its\nfunctionality.\n\nChange-Id: I4e77d2cc418e623b93ef88887b5f9899263deda5","shortMessageHtmlLink":"Expose API required by pull-replication plugin"}},{"before":"5e76935f1c5b23cd849c68952e72a16563225ca5","after":"dc41fee03e9233503e92caea8dae4838e4003d20","ref":"refs/heads/master","pushedAt":"2024-01-05T21:58:09.000Z","pushType":"push","commitsCount":6,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Remove ReplicationConfigImpl constructor added for testing\n\nClean up code after implementing external configuraiton extension point.\nRemove a helper constructor added to limit changes in tests.\n\nChange-Id: Ib89f7a264848aee4ead45d545fd77a0ae97852d1","shortMessageHtmlLink":"Remove ReplicationConfigImpl constructor added for testing"}},{"before":"0b163f9efd55a9ac10132923ef3e26666f7dfbaa","after":"5e76935f1c5b23cd849c68952e72a16563225ca5","ref":"refs/heads/master","pushedAt":"2023-12-13T09:04:35.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Remove events from beforeStartupEventsQueue after fire()\n\nThe plugin was removing the event before firing it from the\nbeforeStartupEventsQueue. This could have caused a message\nloss in case the configuration was changed before firing the event.\n\nNow after the plugin is fully loaded each event is\nremoved from the the in-memory queue after being fired.\n\nFollow up of change 393036.\nPlese see comment [1]\n\n[1]: https://gerrit-review.googlesource.com/c/plugins/replication/+/393036/comment/f9aed6f7_5c06661a/\n\nChange-Id: I83abb264be3deae2f5b2330c70727e8f7b6cd3d3","shortMessageHtmlLink":"Remove events from beforeStartupEventsQueue after fire()"}},{"before":"c7c36d62cf61d1588e9cdeab3e89b77a65f44c79","after":"0b163f9efd55a9ac10132923ef3e26666f7dfbaa","ref":"refs/heads/master","pushedAt":"2023-12-07T14:49:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Remove unused method ReplicationFileBasedConfig.getCfgPath\n\nThe `ReplicationFileBasedConfig.getCfgPath()` is not longer used in the\nplugin, therefore it can be safely removed.\n\nChange-Id: I387bc0bd4b6f19cab3475be4aac939352b7dbeb4","shortMessageHtmlLink":"Remove unused method ReplicationFileBasedConfig.getCfgPath"}},{"before":"8fd3c271ce0a21480e3d04da5ad2112efea3bedf","after":"c7c36d62cf61d1588e9cdeab3e89b77a65f44c79","ref":"refs/heads/master","pushedAt":"2023-11-25T00:49:19.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"Remove events from beforeStartupEventsQueue in-memory queue\n\nBefore replication plugin is fully loaded it can receive\nevents. These events are stored in an in-memory queue called\n`beforeStartupEventsQueue`. After plugin is fully loaded those\nevents are processed but never removed from the queue. This can\ncause issue processing the same event multiple times.\n\nReplication done with apply-object may not be idempotent if\nthe event generated at a point in time is processed later.\n\nTo avoid that remove event from the queue and then process it.\n\nBug: Issue 307554728\nChange-Id: Ic075c9dfa0a2e984762fed0aaf7481f035fdd662","shortMessageHtmlLink":"Remove events from beforeStartupEventsQueue in-memory queue"}},{"before":"e7f35226d0ad3ccb5751c468168409705ae8e719","after":"694b34084ca623756a9ec7e6a60631ab6027d5c2","ref":"refs/heads/stable-3.5","pushedAt":"2023-09-13T20:05:18.000Z","pushType":"push","commitsCount":3,"pusher":{"login":"lucamilanesio","name":"Luca Milanesio","path":"/lucamilanesio","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/182893?s=80&v=4"},"commit":{"message":"TasksStorage: Remove synchronized from methods\n\nThese aren't expected to be necessary for correctness.\n\nChange-Id: Id23d3b385e289ba453638b76d6523016a5aabf2a","shortMessageHtmlLink":"TasksStorage: Remove synchronized from methods"}}],"hasNextPage":false,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEK5j3BAA","startCursor":null,"endCursor":null}},"title":"Activity · GerritCodeReview/plugins_replication"}