in go/storage/certdatabase.go [403:445]
func (db *CertDatabase) moveOneBinOfCachedSerialsToStorage(aTmpDir string, aExpDate types.ExpDate, aIssuer types.Issuer) error {
cachedSerials := db.ReadSerialsFromCache(aExpDate, aIssuer)
if len(cachedSerials) == 0 {
return nil
}
storedSerials, err := db.ReadSerialsFromStorage(aExpDate, aIssuer)
if err != nil {
return err
}
// Concatenate the serial lists and remove any duplicates
serials := append(storedSerials, cachedSerials...)
serials = types.SerialList(serials).Dedup()
// Write the merged serial list to a temporary file, and atomically
// overwrite the storage file if all goes well.
path := db.serialFile(aExpDate, aIssuer)
t, err := renameio.TempFile(aTmpDir, path)
if err != nil {
return err
}
defer t.Cleanup()
err = WriteSerialList(t, aExpDate, aIssuer, serials)
if err != nil {
return err
}
err = t.CloseAtomicallyReplace()
if err != nil {
return err
}
// It's now safe to remove cachedSerials from the cache.
cacheWriter := db.GetSerialCacheAccessor(aExpDate, aIssuer)
err = cacheWriter.RemoveMany(cachedSerials)
if err != nil {
glog.Warningf("Failed to remove serial from cache: %s", err)
}
return nil
}