~ubuntu-branches/ubuntu/vivid/postfix/vivid-proposed

« back to all changes in this revision

Viewing changes to src/qmgr/qmgr_peer.c

  • Committer: Bazaar Package Importer
  • Author(s): LaMont Jones
  • Date: 2005-02-27 09:33:07 UTC
  • Revision ID: james.westby@ubuntu.com-20050227093307-cn789t27ibnlh6tf
Tags: upstream-2.1.5
ImportĀ upstreamĀ versionĀ 2.1.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*++
 
2
/* NAME
 
3
/*      qmgr_peer 3
 
4
/* SUMMARY
 
5
/*      per-job peers
 
6
/* SYNOPSIS
 
7
/*      #include "qmgr.h"
 
8
/*
 
9
/*      QMGR_PEER *qmgr_peer_create(job, queue)
 
10
/*      QMGR_JOB *job;
 
11
/*      QMGR_QUEUE *queue;
 
12
/*
 
13
/*      QMGR_PEER *qmgr_peer_find(job, queue)
 
14
/*      QMGR_JOB *job;
 
15
/*      QMGR_QUEUE *queue;
 
16
/*
 
17
/*      void qmgr_peer_free(peer)
 
18
/*      QMGR_PEER *peer;
 
19
/*
 
20
/*      QMGR_PEER *qmgr_peer_select(job)
 
21
/*      QMGR_JOB *job;
 
22
/*
 
23
/* DESCRIPTION
 
24
/*      These routines add/delete/manipulate per-job peers.
 
25
/*      Each queue corresponds to a specific job and destination.
 
26
/*      It is similar to per-transport queue structure, but groups
 
27
/*      only the entries of the given job.
 
28
/*
 
29
/*      qmgr_peer_create() creates an empty peer structure for the named
 
30
/*      job and destination. It is an error to call this function
 
31
/*      if a peer for given combination already exists.
 
32
/*
 
33
/*      qmgr_peer_find() looks up the peer for the named destination
 
34
/*      for the named job. A null result means that the peer
 
35
/*      was not found.
 
36
/*
 
37
/*      qmgr_peer_free() disposes of a per-job peer after all
 
38
/*      its entries have been taken care of. It is an error to dispose
 
39
/*      of a peer still in use.
 
40
/*
 
41
/*      qmgr_peer_select() attempts to find a peer of named job that
 
42
/*      has messages pending delivery.  This routine implements
 
43
/*      round-robin search among job's peers.
 
44
/* DIAGNOSTICS
 
45
/*      Panic: consistency check failure.
 
46
/* LICENSE
 
47
/* .ad
 
48
/* .fi
 
49
/*      The Secure Mailer license must be distributed with this software.
 
50
/* AUTHOR(S)
 
51
/*      Patrik Rak
 
52
/*      patrik@raxoft.cz
 
53
/*--*/
 
54
 
 
55
/* System library. */
 
56
 
 
57
#include <sys_defs.h>
 
58
 
 
59
/* Utility library. */
 
60
 
 
61
#include <msg.h>
 
62
#include <htable.h>
 
63
#include <mymalloc.h>
 
64
 
 
65
/* Application-specific. */
 
66
 
 
67
#include "qmgr.h"
 
68
 
 
69
/* qmgr_peer_create - create and initialize message peer structure */
 
70
 
 
71
QMGR_PEER *qmgr_peer_create(QMGR_JOB *job, QMGR_QUEUE *queue)
 
72
{
 
73
    QMGR_PEER *peer;
 
74
 
 
75
    peer = (QMGR_PEER *) mymalloc(sizeof(QMGR_PEER));
 
76
    peer->queue = queue;
 
77
    peer->job = job;
 
78
    QMGR_LIST_APPEND(job->peer_list, peer, peers);
 
79
    htable_enter(job->peer_byname, queue->name, (char *) peer);
 
80
    peer->refcount = 0;
 
81
    QMGR_LIST_INIT(peer->entry_list);
 
82
    return (peer);
 
83
}
 
84
 
 
85
/* qmgr_peer_free - release peer structure */
 
86
 
 
87
void    qmgr_peer_free(QMGR_PEER *peer)
 
88
{
 
89
    char   *myname = "qmgr_peer_free";
 
90
    QMGR_JOB *job = peer->job;
 
91
    QMGR_QUEUE *queue = peer->queue;
 
92
 
 
93
    /*
 
94
     * Sanity checks. It is an error to delete a referenced peer structure.
 
95
     */
 
96
    if (peer->refcount != 0)
 
97
        msg_panic("%s: refcount: %d", myname, peer->refcount);
 
98
    if (peer->entry_list.next != 0)
 
99
        msg_panic("%s: entry list not empty: %s", myname, queue->name);
 
100
 
 
101
    QMGR_LIST_UNLINK(job->peer_list, QMGR_PEER *, peer, peers);
 
102
    htable_delete(job->peer_byname, queue->name, (void (*) (char *)) 0);
 
103
    myfree((char *) peer);
 
104
}
 
105
 
 
106
/* qmgr_peer_find - lookup peer associated with given job and queue */
 
107
 
 
108
QMGR_PEER *qmgr_peer_find(QMGR_JOB *job, QMGR_QUEUE *queue)
 
109
{
 
110
    return ((QMGR_PEER *) htable_find(job->peer_byname, queue->name));
 
111
}
 
112
 
 
113
/* qmgr_peer_select - select next peer suitable for delivery within given job */
 
114
 
 
115
QMGR_PEER *qmgr_peer_select(QMGR_JOB *job)
 
116
{
 
117
    QMGR_PEER *peer;
 
118
    QMGR_QUEUE *queue;
 
119
 
 
120
    /*
 
121
     * If we find a suitable site, rotate the list to enforce round-robin
 
122
     * selection. See similar selection code in qmgr_transport_select().
 
123
     */
 
124
    for (peer = job->peer_list.next; peer; peer = peer->peers.next) {
 
125
        queue = peer->queue;
 
126
        if (queue->window > queue->busy_refcount && peer->entry_list.next != 0) {
 
127
            QMGR_LIST_ROTATE(job->peer_list, peer, peers);
 
128
            if (msg_verbose)
 
129
                msg_info("qmgr_peer_select: %s %s %s (%d of %d)",
 
130
                job->message->queue_id, queue->transport->name, queue->name,
 
131
                         queue->busy_refcount + 1, queue->window);
 
132
            return (peer);
 
133
        }
 
134
    }
 
135
    return (0);
 
136
}