Re: multiple nntp connections to same server in ubhdb
Gerard Lanois <[email protected]> Fri, 18 Mar 2005 17:59:28 -0800 (PST)
| Newsgroups | gmane.network.ubh |
|---|---|
| Message-ID | <[email protected]> |
what ben wants to do is have multiple connections during the ubhdb (header downloading) phase. that's different from having multiple instances of during the ubh (article downloading) phase. --- sean roehnelt <[email protected]> wrote: > I'm not sure if this solves what your trying to do, but I will run > several concurrent ubh processes sometimes, and the effect is multiple > concurrent connections. - Although, I only connect to a single nntp > server. > > On Mar 18, 2005, at 1:11 AM, Ben wrote: > > > Hello again, > > > > I was curious if any more thought or development had been made on > > enabling multiple, concurrent connections to the same nntp servers in > > ubhdb. > > > > I was considering how to implement this and wanted to get some > > feedback on the approach. > > > > Currently, in Ubh::ServerConnections::connect_to_servers, we take an > > arrayref of hashrefs containing server connection properties and stash > > the Ubh::NNTP object in the nntp element. > > > > Then in freshen_headers(), we iterate through each newsgroup, then > > each server, fetch the range of articles available, delete from the > > database anything expired from that server, figure out the range of > > articles we do have and what new ranges we should retrieve. Finally, > > we split that into full sips, retrieve, then fetch the final partial > > sip (if any). > > > > I am considering modifying Ubh::ServerConnections::connect_to_servers > > to create an arrayref of Ubh::NNTP objects. The servers table would > > be modified to hold a maxconns field indicating the maximum number of > > concurrent connections permitted and perhaps another field to indicate > > how many of those connections to actually utilize. > > > > In the sipping logic of freshen_headers(), we would then fork and call > > socketpair to establish pipes for bidirectional communication with > > each child. The child would block on reading the parent pipe for a > > range to sip or command to exit. The parent, after handing sips to > > the children, would select on the pipes to see when they have > > completed that sip, and either send another sip or instruct the child > > to exit. When all sips have been exhausted, the parent does a waitpid > > on each child to avoid zombies. > > > > That sounds kind of complex but I've written some test programs to > > verify how it would all work and it actually doesn't seem too bad, > > Granted I buried my face in the the manpages for select, vec, > > socketpair, perlipc, IO::Handle, waitpid, and friends for a while. > > > > However, it still leaves the case where you have 5 servers defined in > > your servers table and 1 of them only permits one connection at 10kbps > > or some similarly slow rate. Your other servers would be blocked > > until that server finished freshening it's headers, though I suppose > > you could use the priority field to make it update last? > > > > Otherwise, I had thought we could also fork each main server > > definition and iterate through the newsgroups within each child, > > applying the above described sipping logic in each of those children. > > > > I don't know if any of this would work under Windows. It also adds a > > lot of memory and filehandle consumption. But I think it would > > increase article fetching speed quite a bit. > > > > I've probably left out some details that are in my head. Does this > > sound crazy? Is there an easier way I'm overlooking? Maybe manually > > running additional ubh processes and making ubhdb store it's state in > > the database so other processes can not conflict? > > > > Ben > > Yahoo! Groups Links <*> To visit your group on the web, go to: http://groups.yahoo.com/group/ubh/ <*> To unsubscribe from this group, send an email to: [email protected] <*> Your use of Yahoo! Groups is subject to: http://docs.yahoo.com/info/terms/