示例#1
0
        private static void RemoveExpiredCachedRecords(Zone currentZone)
        {
            //remove expired entries in current zone
            {
                List <KeyValuePair <DnsResourceRecordType, DnsResourceRecord[]> > updateEntries = null;

                foreach (KeyValuePair <DnsResourceRecordType, DnsResourceRecord[]> entry in currentZone._entries)
                {
                    foreach (DnsResourceRecord record in entry.Value)
                    {
                        if (record.TtlValue < 1u)
                        {
                            //create new entry
                            if (updateEntries == null)
                            {
                                updateEntries = new List <KeyValuePair <DnsResourceRecordType, DnsResourceRecord[]> >();
                            }

                            List <DnsResourceRecord> newRecords = new List <DnsResourceRecord>(entry.Value.Length);

                            foreach (DnsResourceRecord existingRecord in entry.Value)
                            {
                                if (existingRecord.TtlValue < 1u)
                                {
                                    continue;
                                }

                                newRecords.Add(existingRecord);
                            }

                            updateEntries.Add(new KeyValuePair <DnsResourceRecordType, DnsResourceRecord[]>(entry.Key, newRecords.ToArray()));
                            break;
                        }
                    }
                }

                if (updateEntries != null)
                {
                    foreach (KeyValuePair <DnsResourceRecordType, DnsResourceRecord[]> updateEntry in updateEntries)
                    {
                        if (updateEntry.Value.Length > 0)
                        {
                            currentZone._entries.AddOrUpdate(updateEntry.Key, updateEntry.Value, delegate(DnsResourceRecordType key, DnsResourceRecord[] existingRecords)
                            {
                                return(updateEntry.Value);
                            });
                        }
                        else
                        {
                            currentZone._entries.TryRemove(updateEntry.Key, out DnsResourceRecord[] removedValues);
                        }
                    }
                }
            }

            //remove expired entries in sub zones
            {
                List <string> subZonesToRemove = null;

                foreach (KeyValuePair <string, Zone> zone in currentZone._zones)
                {
                    RemoveExpiredCachedRecords(zone.Value);

                    if ((zone.Value._zones.Count == 0) && (zone.Value._entries.Count == 0))
                    {
                        if (subZonesToRemove == null)
                        {
                            subZonesToRemove = new List <string>();
                        }

                        subZonesToRemove.Add(zone.Key);
                    }
                }

                if (subZonesToRemove != null)
                {
                    foreach (string subZone in subZonesToRemove)
                    {
                        currentZone._zones.TryRemove(subZone, out Zone value);
                    }
                }
            }
        }