Skip to content

Potential race condition in CertificateDownloader client access #273

@meandercloud-z

Description

@meandercloud-z

在程序初始化时,一般在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.clientupdateCertificates中则会在RWMutex write lock范围内更改d.client。理论上,在main goroutine执行的DownloadCertificates,和在ticker anonymous goroutine上执行的DownloadCertificates,如果出现performDownloadingupdateCertificatesd.client的access并行,则有可能使performDownloading中对d.client的access出现splintered read。虽然在现实使用中,由于ticker间隔足够大,不太可能出现两个goroutine同时执行DownloadCertificates的情况,但考虑到CertificateDownloaderRWMutex存在的目的,建议还是对performDownloadingd.client的access进行lock read,以避免上述race condition。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions