Software /
code /
prosody
Comparison
net/dns.lua @ 6463:460584257cc9
net.dns: Avoid duplicate cache entries
author | Florian Zeitz <florob@babelmonkeys.de> |
---|---|
date | Sun, 05 Oct 2014 14:28:40 +0200 |
parent | 6310:d232bb1bbe1e |
child | 6464:737c81bd898e |
child | 6508:4a28b8320d7f |
comparison
equal
deleted
inserted
replaced
6462:fcff8fa495d4 | 6463:460584257cc9 |
---|---|
132 end | 132 end |
133 | 133 |
134 | 134 |
135 local function prune(rrs, time, soft) -- - - - - - - - - - - - - - - prune | 135 local function prune(rrs, time, soft) -- - - - - - - - - - - - - - - prune |
136 time = time or socket.gettime(); | 136 time = time or socket.gettime(); |
137 for i,rr in pairs(rrs) do | 137 for i,rr in ipairs(rrs) do |
138 if rr.tod then | 138 if rr.tod then |
139 -- rr.tod = rr.tod - 50 -- accelerated decripitude | 139 -- rr.tod = rr.tod - 50 -- accelerated decripitude |
140 rr.ttl = math.floor(rr.tod - time); | 140 rr.ttl = math.floor(rr.tod - time); |
141 if rr.ttl <= 0 then | 141 if rr.ttl <= 0 then |
142 rrs[rr[rr.type:lower()]] = nil; | |
142 table.remove(rrs, i); | 143 table.remove(rrs, i); |
143 return prune(rrs, time, soft); -- Re-iterate | 144 return prune(rrs, time, soft); -- Re-iterate |
144 end | 145 end |
145 elseif soft == 'soft' then -- What is this? I forget! | 146 elseif soft == 'soft' then -- What is this? I forget! |
146 assert(rr.ttl == 0); | 147 assert(rr.ttl == 0); |
147 rrs[i] = nil; | 148 rrs[rr[rr.type:lower()]] = nil; |
149 table.remove(rrs, i); | |
148 end | 150 end |
149 end | 151 end |
150 end | 152 end |
151 | 153 |
152 | 154 |
185 | 187 |
186 | 188 |
187 local rrs_metatable = {}; -- - - - - - - - - - - - - - - - - - rrs_metatable | 189 local rrs_metatable = {}; -- - - - - - - - - - - - - - - - - - rrs_metatable |
188 function rrs_metatable.__tostring(rrs) | 190 function rrs_metatable.__tostring(rrs) |
189 local t = {}; | 191 local t = {}; |
190 for i,rr in pairs(rrs) do | 192 for i,rr in ipairs(rrs) do |
191 append(t, tostring(rr)..'\n'); | 193 append(t, tostring(rr)..'\n'); |
192 end | 194 end |
193 return table.concat(t); | 195 return table.concat(t); |
194 end | 196 end |
195 | 197 |
672 end | 674 end |
673 | 675 |
674 self.cache = self.cache or setmetatable({}, cache_metatable); | 676 self.cache = self.cache or setmetatable({}, cache_metatable); |
675 local rrs = get(self.cache, qclass, type, qname) or | 677 local rrs = get(self.cache, qclass, type, qname) or |
676 set(self.cache, qclass, type, qname, setmetatable({}, rrs_metatable)); | 678 set(self.cache, qclass, type, qname, setmetatable({}, rrs_metatable)); |
677 append(rrs, rr); | 679 if not rrs[rr[qtype:lower()]] then |
680 rrs[rr[qtype:lower()]] = true; | |
681 append(rrs, rr); | |
682 end | |
678 | 683 |
679 if type == 'MX' then self.unsorted[rrs] = true; end | 684 if type == 'MX' then self.unsorted[rrs] = true; end |
680 end | 685 end |
681 | 686 |
682 | 687 |