-
Notifications
You must be signed in to change notification settings - Fork 151
Description
在程序初始化时,一般在main goroutine上会调用downloader.MgrInstance().RegisterDownloaderWithPrivateKey,其中downloader.MgrInstance中会通过NewCertificateDownloaderMgr建立singleton instance,进而在NewCertificateDownloaderMgrWithInterval中设立默认24小时一次的ticker,每次tick会在这个anonymous goroutine中执行mgr.DownloadCertificates,进而间接通过tmpDownloaderMap的pointer copy对mgr.downloaderMap中每一个注册的downloader执行downloader.DownloadCertificates。
在CertificateDownloaderMgr singleton instance建立后,RegisterDownloaderWithPrivateKey会通过NewCertificateDownloader建立一个新的downloader,并同步执行一次downloader.DownloadCertificates。
在CertificateDownloader DownloadCertificates中,performDownloading中会直接读取使用d.client;updateCertificates中则会在RWMutex write lock范围内更改d.client。理论上,在main goroutine执行的DownloadCertificates,和在ticker anonymous goroutine上执行的DownloadCertificates,如果出现performDownloading与updateCertificates对d.client的access并行,则有可能使performDownloading中对d.client的access出现splintered read。虽然在现实使用中,由于ticker间隔足够大,不太可能出现两个goroutine同时执行DownloadCertificates的情况,但考虑到CertificateDownloader中RWMutex存在的目的,建议还是对performDownloading中d.client的access进行lock read,以避免上述race condition。