Parent Directory | Revision Log
1 Fixed: Added SIGPIPE handler. We noticed that under heavy load Meteor receives SIGPIPEs from the OS, suspected to relate to clients that have just disconnected the moment Meteor attempts to write to the socket. This caused Meteor to crash. 2 Fixed: Long polling multiple channels no longer causes the loop to die and restart when some channels have messages queued for delivery. 3 Fixed: Over time, Meteor 'collected' connections from clients that never got disconnected even if MaxTime was set. This happened if the client concerned sent a header with no terminating blank line. Meteor kept waiting for the rest of the header, which never arrived, and therefore the client remained in limbo, never subjected to the MaxTime time limit because it had not yet become a subscriber. Clients are now allowed 30 seconds to send a valid request header. 4 Fixed: If only one message existed on the server, the JS client would continue to request it again and again, because it has message ID 0, and the JS client considered this an invalid message ID. 5 Fixed: Corrected some comments in file headers 6 Changed: MaxMessages has been renamed to CloseOnEvent and functions in a similar, but not quite identical way. Thanks to Matthew Haak, who pointed out the extreme confusingness of MaxMessages and a bug that has resulted in Fix 2 above. Setting CloseOnEvent to any value that evaluates to true will cause Meteor to close subscriber connections after at least one message has been sent and there are no further messages pending. This is identical to MaxMessages for values of 0 and 1, but where MaxMessages is set to a value higher than one, replacing it with CloseOnEvent with the same value will act as though it were set to one. The intent of MaxMessages was to enable long- polling (and it is used by the JS client in that way), and CloseonEvent is a drop in replacement for that behaviour. 7 Changed: Meteor JS client now uses dynamic <SCRIPT> tags for all polling behaviours, rather than XHR. This enables it to make poll requests cross-domain (see 13) 8 Changed: Meteor JS client now abstracts timestamp lookups to a dedicated method. 9 Changed: Default HeaderTemplates no longer include cache busting headers, since all meteor requests contain a millisecond timestamp and so no client makes the same request twice. These were therefore simply chewing up bandwidth. 10 Changed: Date strings used for logging debug messages are cached to avoid numerous expensive lookups to localtime(). 11 Changed: Channel info is only sent in a response if the client does not request a restart from a specified ID. The logic being that if the client knows the ID they want to start from, they have already made previous requests and have the channel information they need. Bandwidth saving measure. 12 Added: JS client now has a Meteor.isSupportedBrowser() method, which you can call to detemine whether Meteor will run in the user's browser version. 13 Added: JS client can now use different hosts for polling and streaming. This is only really useful if your website is on a domain that has a lot of cookies, and you don't want to send them in every poll request. Removing cookies from request headers can reduce the size of the request significantly. We find that with cookies included Meteor poll requests are usually larger than the responses. To use, set Meteor.pollhost. Meteor.pollhost can be any domain, while Meteor.host must be a subdomain of your website hostname. 14 Added: Config file now supports new 'FooterTemplate' parameter, for a string to send just before the connection to the subscriber is closed. This is in support of change 7. 15 Added: Better inline documentation for ChannelInfoTemplate config parameter 16 Added: Log output includes connection IDs corresponding to the file inode for each connection 17 Added: New controller command LISTCONNECTIONS, produces a newline delimited list of all currently connected clients, and for each one displaying "ConnectionID IPAddress ClientType [SubscriberID]" 18 Added: New controller command DESCRIBE, takes a ConnectionID as a parameter, and outputs numerous statistics about that particular client, including number of messages sent/received, user agent, IP address, time connected, time remaining until MaxTime etc. 19 Added: New controller comment LISTSUBSCRIBERS, produces a newline delimited list of all currently connected streaming subscribers, and for each one displaying "SubscriberID IPAddress Starttime TimeLimit TimeRemaining MessageCount UserAgent" 20 Added: SHOWSTATS command produces the following additional stats: connection_count: total current connections, real_subscribers: total of number of currently connected streaming subscribers plus the number of unique polling connections seen in the last 60 seconds. 21 Added: STDERR outputs prior to every exit() for debugging purposes 22 Added: The UDP server is now considered stable, and is the best way of broadcasting messages to lots of Meteor nodes simultaneously and efficiently.
1 | #!/usr/bin/perl -w |
2 | ############################################################################### |
3 | # Meteor |
4 | # An HTTP server for the 2.0 web |
5 | # Copyright (c) 2006 contributing authors |
6 | # |
7 | # Subscriber.pm |
8 | # |
9 | # Description: |
10 | # Convenience interface to syslog |
11 | # |
12 | ############################################################################### |
13 | # |
14 | # This program is free software; you can redistribute it and/or modify it |
15 | # under the terms of the GNU General Public License as published by the Free |
16 | # Software Foundation; either version 2 of the License, or (at your option) |
17 | # any later version. |
18 | # |
19 | # This program is distributed in the hope that it will be useful, but WITHOUT |
20 | # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
21 | # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for |
22 | # more details. |
23 | # |
24 | # You should have received a copy of the GNU General Public License along |
25 | # with this program; if not, write to the Free Software Foundation, Inc., |
26 | # 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
27 | # |
28 | # For more information visit www.meteorserver.org |
29 | # |
30 | ############################################################################### |
31 | |
32 | package Meteor::Syslog; |
33 | ############################################################################### |
34 | |
35 | use strict; |
36 | use Sys::Syslog; |
37 | |
38 | ############################################################################### |
39 | # Configuration |
40 | ############################################################################### |
41 | |
42 | $Meteor::Syslog::DEFAULT_FACILITY='daemon'; |
43 | |
44 | $Meteor::Syslog::_lasttimestamp=0; |
45 | $Meteor::Syslog::_lasttimestring=""; |
46 | $Meteor::Syslog::_open=0; # set to 1 by _open |
47 | |
48 | ############################################################################### |
49 | # Implementation |
50 | ############################################################################### |
51 | sub ::syslog { |
52 | |
53 | my $debug=$::CONF{'Debug'}; |
54 | |
55 | my $priority=shift; |
56 | return if($priority eq 'debug' && !$debug); |
57 | |
58 | my $format=shift; |
59 | my @args=@_; |
60 | |
61 | if($format eq '') |
62 | { |
63 | my $txt=join("\t",@args); |
64 | $format='%s'; |
65 | @args=($txt); |
66 | } |
67 | |
68 | my $facility=$::CONF{'SyslogFacility'} || $Meteor::Syslog::DEFAULT_FACILITY; |
69 | |
70 | if($debug || $facility eq 'none') |
71 | { |
72 | $format=~s/\%m/$!/g; |
73 | |
74 | my $time = time; |
75 | if ($::CONF{'LogTimeFormat'} ne 'unix') { |
76 | if ($Meteor::Syslog::_lasttimestamp != time) { |
77 | $Meteor::Syslog::_lasttimestring = localtime(time); |
78 | $Meteor::Syslog::_lasttimestamp = time; |
79 | } |
80 | $time = $Meteor::Syslog::_lasttimestring; |
81 | } |
82 | |
83 | print STDERR "$time\t$priority\t"; |
84 | print STDERR sprintf($format,@args); |
85 | print STDERR "\n" unless(substr($format,-1) eq "\n"); |
86 | |
87 | return; |
88 | } |
89 | |
90 | unless($Meteor::Syslog::_open) |
91 | { |
92 | my $facility=$::CONF{'SyslogFacility'} || $Meteor::Syslog::DEFAULT_FACILITY; |
93 | openlog($::PGM,0,$facility); |
94 | $Meteor::Syslog::_open=1; |
95 | } |
96 | |
97 | syslog($priority,$format,@args); |
98 | } |
99 | |
100 | sub myWarn { |
101 | local $SIG{'__DIE__'}=''; |
102 | local $SIG{'__WARN__'}=''; |
103 | |
104 | &::syslog('warning',$_[0]); |
105 | } |
106 | |
107 | sub myDie { |
108 | local $SIG{'__DIE__'}=''; |
109 | local $SIG{'__WARN__'}=''; |
110 | |
111 | my $inEval=0; |
112 | my $i=0; |
113 | my $sub; |
114 | while((undef,undef,undef,$sub)=caller(++$i)) |
115 | { |
116 | $inEval=1, last if $sub eq '(eval)'; |
117 | } |
118 | |
119 | unless($inEval) |
120 | { |
121 | &::syslog('err',$_[0]); |
122 | $Meteor::Socket::NO_WARN_ON_CLOSE=1; |
123 | exit; |
124 | } |
125 | } |
126 | |
127 | 1; |
128 | ############################################################################EOF |
ViewVC Help | |
Powered by ViewVC 1.1.26 |