)]}'
{
  "commit": "c7459997f41fd6c606156e270f7eae6462b9d62e",
  "tree": "ad34d544d8192b7b2a1294068cf9c3f692f58843",
  "parents": [
    "706090f7ed00917644e89fa537e90c557d214891"
  ],
  "author": {
    "name": "jieguo",
    "email": "1193249232@qq.com",
    "time": "Thu Jun 25 16:53:15 2026 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Jun 25 16:53:15 2026 +0800"
  },
  "message": "feat(metadata): add concurrency safety for application-level metadata state (#3353) (#3367)\n\n* feat(metadata): add internal RWMutex for MetadataInfo and fix json serialization (#3353)\n\nAdd sync.RWMutex to MetadataInfo struct with json:\"-\" / hessian:\"-\"\ntags to skip serialization. All mutating methods (AddService, RemoveService,\nAddSubscribeURL, RemoveSubscribeURL) acquire the write lock, and read\nmethods (GetExportedServiceURLs, GetSubscribedURLs, GetServices) acquire\nthe read lock. The new GetServices method returns a snapshot copy.\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* feat(metadata): add lock protection for global registry and instances (#3353)\n\nAdd sync.RWMutex to protect registryMetadataInfo in metadata.go and\ninstances in report_instance.go. Extract getMetadataReportUnsafe helper\nto avoid reentrant RLock deadlock in GetMetadataReportByRegistry fallback.\nFix nacos report_test to use pointer to MetadataInfo for json.Marshal.\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* feat(metadata): fix concurrency safety in listener callbacks and external calls (#3353)\n\nAdd mutex locking to AddListenerAndNotify and RemoveListener to protect\nshared fields listeners and serviceUrls. Replace direct access to\nMetadataInfo.Services with safe GetServices method in OnEvent and\nconvertV2 to prevent unprotected map reads.\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* style: format import blocks using dubbo-go imports-formatter\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* style: format metadata.go and report_instance.go to pass CI\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* fix(metadata): resolve data races pointed out in code review\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* test: fix failing tests and improve unit test coverage\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* test: fix testifylint error by avoiding require in goroutines\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* fix(metadata): deep copy ServiceInfo to prevent write-on-read data race and reduce lock granularity in report creation\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* chore: trigger CI re-run for codecov gpg issue\n\n* refactor(metadata): implement no-lock helper to fix data race and avoid deadlocks in ReplaceExportedServices\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* test: fix compilation error in instance changed listener tests by adding missing registryId argument\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n* fix(metadata): add RLock around global map lookup in RemoveService and RemoveSubscribeURL to prevent concurrent map read/write\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e\n\n---------\n\nSigned-off-by: jieguo-coder \u003c1193249232@qq.com\u003e",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "1714389998338b665c0d4a9812c4eb5215304890",
      "old_mode": 33188,
      "old_path": "metadata/info/metadata_info.go",
      "new_id": "8843fb029226f09c05486dccfa4f438176c99f1a",
      "new_mode": 33188,
      "new_path": "metadata/info/metadata_info.go"
    },
    {
      "type": "modify",
      "old_id": "242f28a39299ff92299cded9dd8f261e2127a2f7",
      "old_mode": 33188,
      "old_path": "metadata/info/metadata_info_test.go",
      "new_id": "59c99812ceb7a5f6ae7196042177a0aa9cae9fb1",
      "new_mode": 33188,
      "new_path": "metadata/info/metadata_info_test.go"
    },
    {
      "type": "modify",
      "old_id": "15367cf1cfbc3266852b0a862a6aaf225a60b7ab",
      "old_mode": 33188,
      "old_path": "metadata/metadata.go",
      "new_id": "6117864aa0a229d55e5ee9b98c97346e1b184943",
      "new_mode": 33188,
      "new_path": "metadata/metadata.go"
    },
    {
      "type": "modify",
      "old_id": "8cf7da13b73720b4b35f7c27cb8998085e4bca9c",
      "old_mode": 33188,
      "old_path": "metadata/metadata_service.go",
      "new_id": "353044c04bb6895a404a79cc6edf1816ebbd860e",
      "new_mode": 33188,
      "new_path": "metadata/metadata_service.go"
    },
    {
      "type": "modify",
      "old_id": "67a0bb55714c317a2ecc0954bfbc7750e318b3c6",
      "old_mode": 33188,
      "old_path": "metadata/metadata_service_test.go",
      "new_id": "c0cf0d8a70897306ef9277e0c075d5a0a6c65f7c",
      "new_mode": 33188,
      "new_path": "metadata/metadata_service_test.go"
    },
    {
      "type": "modify",
      "old_id": "2c8de5b2794c59468a1cc74132bcd9b79d9297b0",
      "old_mode": 33188,
      "old_path": "metadata/metadata_test.go",
      "new_id": "da4446e29f429c5efdfde85acbc1da921a84e086",
      "new_mode": 33188,
      "new_path": "metadata/metadata_test.go"
    },
    {
      "type": "modify",
      "old_id": "108e330bb52e23489ec59a696778d6de28f286f6",
      "old_mode": 33188,
      "old_path": "metadata/report/nacos/report_test.go",
      "new_id": "1ce968772805698e18db58e26c7abb7303e8f6d6",
      "new_mode": 33188,
      "new_path": "metadata/report/nacos/report_test.go"
    },
    {
      "type": "modify",
      "old_id": "55cf516df6788bb45d33c7b425bb38020847a633",
      "old_mode": 33188,
      "old_path": "metadata/report_instance.go",
      "new_id": "4d2354b877b8e8a2db1219143ed0b461b6b46808",
      "new_mode": 33188,
      "new_path": "metadata/report_instance.go"
    },
    {
      "type": "modify",
      "old_id": "427895aebffa4affc14b7b9aeaea9a8ae63ef9c7",
      "old_mode": 33188,
      "old_path": "registry/servicediscovery/service_instances_changed_listener_impl.go",
      "new_id": "8cb28b6d887dbc970af76c02b67fd2266f4700c3",
      "new_mode": 33188,
      "new_path": "registry/servicediscovery/service_instances_changed_listener_impl.go"
    },
    {
      "type": "modify",
      "old_id": "22f7582ae4533b4849448a77e435f1c69053c934",
      "old_mode": 33188,
      "old_path": "registry/servicediscovery/service_instances_changed_listener_impl_test.go",
      "new_id": "b0e3fb5b73f34ab393fbfe314a2430b99251d524",
      "new_mode": 33188,
      "new_path": "registry/servicediscovery/service_instances_changed_listener_impl_test.go"
    }
  ]
}
