[avahi] [PATCH] avahi-core: reserve space for record data when size estimate
Troyanker, Vlad
vlad at lab126.com
Mon Oct 8 14:16:00 PDT 2012
I wonder what is the plan for next official release? We have a few fixes
that seem important, like one mentioned in this thread. However we would
not take them piecemeal, we would like to get a official stable release. I
am sure Ubuntu team is even more inclined to wait for something stable.
On 10/8/12 2:09 PM, "Till Kamppeter" <till.kamppeter at gmail.com> wrote:
>Thank you very much for your patch!
>
>I had the same problem as you, but with CUPS registering its printer
>shares into Avahi (built-in from CUPS 1.6.x on). I have 18 queues and
>have always avahi-daemon spinning up and not working any more.
>
>I have applied it to the Ubuntu package of Avahi and the problem is
>solved!
>
>See
>
>https://bugs.launchpad.net/ubuntu/+source/avahi/+bug/1059286
>
>Our big problem at Ubuntu and Canonical is that we do not have any one
>familiar with Avahi. Now all my major problems for the release of Ubuntu
>12.10 (Quantal) are solved!
>
> Till
>
>On 09/10/2012 04:27 AM, Lee, Chun-Yi wrote:
>> From: "Lee, Chun-Yi" <jlee at suse.com>
>>
>> When we tested put a lot of airprint service files(have 45 to 60
>>flies), found there have cpu loadinghigh problem when start avahi-daemon
>>with those service files.
>>
>> After traced source code, there have problem in
>>probe-sched.c::elapse_callback causes doesn't have any probe job set to
>>DONE so the daemon unlimited send out DNS package.
>> The root cause is when compare with the free package space in
>>packet_add_probe_query before attach job key, the free package space
>>doesn't include any record data that will attached after all keys
>>attached. This defect causes whole DNS package is filled by job key, but
>>doesn't remain enough space for any rdata. Then, that means have no job
>>set to DONE.
>>
>> This patch add a new res_size member to AvahiDnsPacket, it used to sum
>>the reserve size for record data the will attached after all keys
>>attached. It can avoid keys consume whole size until p->size larger then
>>p->max_size.
>>
>> Signed-off-by: Lee, Chun-Yi <jlee at suse.com>
>> ---
>> avahi-core/dns.c | 20 ++++++++++++++++++++
>> avahi-core/dns.h | 4 +++-
>> avahi-core/probe-sched.c | 10 ++++++++--
>> 3 files changed, 31 insertions(+), 3 deletions(-)
>>
>> diff --git a/avahi-core/dns.c b/avahi-core/dns.c
>> index 2fcd91f..523afdc 100644
>> --- a/avahi-core/dns.c
>> +++ b/avahi-core/dns.c
>> @@ -55,6 +55,7 @@ AvahiDnsPacket* avahi_dns_packet_new(unsigned mtu) {
>>
>> p->size = p->rindex = AVAHI_DNS_PACKET_HEADER_SIZE;
>> p->max_size = max_size;
>> + p->res_size = 0;
>> p->name_table = NULL;
>> p->data = NULL;
>>
>> @@ -833,6 +834,25 @@ size_t avahi_dns_packet_space(AvahiDnsPacket *p) {
>> return p->max_size - p->size;
>> }
>>
>> +size_t avahi_dns_packet_reserve_size(AvahiDnsPacket *p, size_t
>>res_size) {
>> + assert(p);
>> +
>> + assert(p->size + p->res_size <= p->max_size);
>> +
>> + if ((p->size + p->res_size + res_size) <= p->max_size)
>> + p->res_size += res_size;
>> +
>> + return p->res_size;
>> +}
>> +
>> +size_t avahi_dns_packet_reserved_space(AvahiDnsPacket *p) {
>> + assert(p);
>> +
>> + assert(p->size + p->res_size <= p->max_size);
>> +
>> + return p->max_size - p->size - p->res_size;
>> +}
>> +
>> int avahi_rdata_parse(AvahiRecord *record, const void* rdata, size_t
>>size) {
>> int ret;
>> AvahiDnsPacket p;
>> diff --git a/avahi-core/dns.h b/avahi-core/dns.h
>> index 52e8d88..13b1ac2 100644
>> --- a/avahi-core/dns.h
>> +++ b/avahi-core/dns.h
>> @@ -30,7 +30,7 @@
>> #define AVAHI_DNS_PACKET_SIZE_MAX (AVAHI_DNS_PACKET_HEADER_SIZE + 256
>>+ 2 + 2 + 4 + 2 + AVAHI_DNS_RDATA_MAX)
>>
>> typedef struct AvahiDnsPacket {
>> - size_t size, rindex, max_size;
>> + size_t size, rindex, max_size, res_size;
>> AvahiHashmap *name_table; /* for name compression */
>> uint8_t *data;
>> } AvahiDnsPacket;
>> @@ -78,6 +78,8 @@ int avahi_dns_packet_skip(AvahiDnsPacket *p, size_t
>>length);
>>
>> int avahi_dns_packet_is_empty(AvahiDnsPacket *p);
>> size_t avahi_dns_packet_space(AvahiDnsPacket *p);
>> +size_t avahi_dns_packet_reserve_size(AvahiDnsPacket *p, size_t
>>res_size);
>> +size_t avahi_dns_packet_reserved_space(AvahiDnsPacket *p);
>>
>> #define AVAHI_DNS_FIELD_ID 0
>> #define AVAHI_DNS_FIELD_FLAGS 1
>> diff --git a/avahi-core/probe-sched.c b/avahi-core/probe-sched.c
>> index 1e63411..63cb817 100644
>> --- a/avahi-core/probe-sched.c
>> +++ b/avahi-core/probe-sched.c
>> @@ -179,7 +179,7 @@ static int
>>packet_add_probe_query(AvahiProbeScheduler *s, AvahiDnsPacket *p, Ava
>> avahi_record_get_estimate_size(pj->record);
>>
>> /* Too large */
>> - if (size > avahi_dns_packet_space(p))
>> + if (size > avahi_dns_packet_reserved_space(p))
>> return 0;
>>
>> /* Create the probe query */
>> @@ -189,6 +189,9 @@ static int
>>packet_add_probe_query(AvahiProbeScheduler *s, AvahiDnsPacket *p, Ava
>> b = !!avahi_dns_packet_append_key(p, k, 0);
>> assert(b);
>>
>> + /* reserve size for record data */
>> + avahi_dns_packet_reserve_size(p,
>>avahi_record_get_estimate_size(pj->record));
>> +
>> /* Mark this job for addition to the packet */
>> pj->chosen = 1;
>>
>> @@ -202,9 +205,12 @@ static int
>>packet_add_probe_query(AvahiProbeScheduler *s, AvahiDnsPacket *p, Ava
>> continue;
>>
>> /* This job wouldn't fit in */
>> - if (avahi_record_get_estimate_size(pj->record) >
>>avahi_dns_packet_space(p))
>> + if (avahi_record_get_estimate_size(pj->record) >
>>avahi_dns_packet_reserved_space(p))
>> break;
>>
>> + /* reserve size for record data */
>> + avahi_dns_packet_reserve_size(p,
>>avahi_record_get_estimate_size(pj->record));
>> +
>> /* Mark this job for addition to the packet */
>> pj->chosen = 1;
>> }
>>
>
>_______________________________________________
>avahi mailing list
>avahi at lists.freedesktop.org
>http://lists.freedesktop.org/mailman/listinfo/avahi
More information about the avahi
mailing list