NOTICE: This version of the NSF Unidata web site (archive.unidata.ucar.edu) is no longer being updated.
Current content can be found at unidata.ucar.edu.
To learn about what's going on, see About the Archive Site.
Hi, Version 6.11.4 of the Local Data Manager (LDM) has been released. This version fixes and improves the defense against a denial-of-service attack, which is new with version 6.11. Getting the defense right was trickier than initially thought. A key aspect of the defense is that a request by a downstream LDM that duplicates an earlier request from the same downstream host will cause termination of the upstream LDM process that's servicing the earlier request. This has ramifications for LDMs running on distinct computers that request data from the same upstream LDM from behind a Network Address Translation (NAT) device. To the upstream LDM, all the requests will appear to come from the same IP address (that of the NAT device). Consequently, duplicate requests will interfere with each other. The solutions to this situation are: 1) Have one LDM request all the desired data and have the other LDMs request from it; 2) Make the patterns in the REQUEST entries distinct by enclosing them in different numbers of parentheses (e.g., ".*" on one computer, "(.*)" on the second, "((.*))" on the third, etc.); 3) Have the LDMs request from each other as well as the same upstream LDM and just live with the resultant churn in the connections. The significant new log messages of LDM 6.11.4 are: Terminated obsolete upstream LDM (addr=ipAddr, pid=pid, vers=vers, type=type, mode=mode, sub=(sub)) This means that the upstream LDM that logged the message terminated the indicated earlier upstream LDM because the logging LDM will send at least the same data as the earlier LDM to the same downstream host. "ipAddr" is the IP address of the downstream host, "pid" is the process identifier of the earlier LDM, "vers" is the LDM protocol version (5 or 6), "type" is the type of the earlier LDM (feeder or notifier), "mode" is the transfer-mode of the earlier LDM (primary or alternate), and "sub" is the subscription that the earlier LDM was satisfying (feedtype, pattern, etc.). If this happens a lot (on the order of once per minute), then 1) the downstream "host" might actually be multiple hosts — each running an LDM that makes the same request — that are hidden behind a NAT device (as described earlier); and 2) you should contact the LDM user at the downstream site to make sure that everything is OK. Subscription reduced by one or more existing subscriptions: requested -> allowed This means that the upstream LDM that logged the message reduced the subscription from its associated downstream LDM by the amount that the subscription overlapped subscriptions that are being currently serviced by existing, previously-created upstream LDMs. Note that this can result in an empty subscription, in which case the downstream LDM will close the connection and retry sometime later. Here "requested" is the initial subscription and "allowed" is the reduced subscription. You should contact the LDM user at the downstream host and tell them that they are making redundant requests. If you need to contact the LDM user at the downstream site, the email address "ldm@host" should work, where "host" is either the fully-qualified name of the downstream host or its IP address. It might be necessary to enclosed the IP address in square brackets. Besides ensuring against the denial-of-service attacks that we've seen, this new feature of LDM 6.11 should reduce unnecessary bandwidth usage by enforcing the requirement that requests for data from the same upstream LDM be disjoint. This version can be downloaded at <http://www.unidata.ucar.edu/downloads/ldm>. For documentation and additional release information, see this version's homepage at <http://www.unidata.ucar.edu/software/ldm-6.11.4/>. The CHANGE_LOG file is attached. Regards, Steve Emmerson LDM Developer
6.11.4 2013-04-03 14:22:34-06:00 Installation: Added $(DESTDIR) to "ensure-ldmhome-links" rule in the makefile. ldmd(1): Made the "Exiting" log message an unconditional NOTICE. Eliminated redundant and dangerous free_prod_class() before set_prod_class() in the LDM-5 module. Improved places where an LDM process might terminate. Made establishing a connection more efficient. Decreased timeout if a forked server doesn't receive anything from 12 minutes to 1 minute. Upstream LDM: Changed policy on duplicate incoming requests from 6.11.3 to terminate the earlier upstream LDM rather than current upstream LDM. Corrected PID in OK reply to version 6 FEEDME or NOTIFYME request. Reduced resource usage by eliminating duplication of upstream socket. Corrected time amount in "silent client" log message. Documented log message about terminating an obsolete upstream LDM process. Eliminated some closings of the connection by the upstream LDM to favor closing by the downstream LDM in order to avoid the upstream LDM going into the TCP TIME_WAIT state. Improved handling of errors. Demoted logging-level of transmission failure to INFO because this is expected when the downstream LDM switches its transfer-mode between PRIMARY and ALTERNATE. Documented log messages associated with subscription reduction by upstream LDM. Simplified waiting for next data-product (sleep either 0 or 60 seconds). Downstream LDM: Assume upstream LDM is alive unless explicitly stated otherwise by the upstream LDM server. Convert status of a time-out due to death of upstream LDM from a disconnect into a time-out. Added PID of upstream LDM to error-messages. Enabled logging of LDM-6 request errors. Removed duplication of downstream socket. Made the autoshifting default "don't switch" in order to correctly handle out-of-the-blue HIYA messages. Improved decision on when a downstream LDM would change its transfer-mode. ldmsend(1): Added flushing of connection when all files are sent. protocol/child_process_set.c: Simplified some functions and added internal documentation. NOAAPORT Ingester: Allowed tabs in textual products. pqact(1): Improved clarity of buffer-toggling code in processProduct(). rtstats(1): Added "-H <hostname>" option to rtstats(1) program. Added test for disallowed operands. Added gethostbyname(3) to "See Also" section of manual-page. RPM generation (still don't know if it works): Improved support: requtil(1) makefile: Made rules involving ETC_DIR honor DESTDIR. Corrected definition of ETC_DIR. ldm.spec.in: Added DESTDIR=%{buildroot} to "make" invocations. Misc: Improved some log messages. Improved some internal documentation. Made some cosmetic changes. 6.11.3 2013-02-12 13:11:20-07:00 General: Ported to all available in-house systems. Unfortunately, this means only certain versions of Linux (Fedora and CentOS), SunOS, and Darwin. Installation: Fix creation of ~/data if it already exists and isn't a link Downstream LDM 6: Added the reduction of REQUEST subscriptions based on previous REQUEST subscriptions. This means that, for example, the second subscription in the following: REQUEST IDS|DDPLUS .* idd.unidata.ucar.edu REQUEST UNIDATA .* idd.unidata.ucar.edu will, effectively, become REQUEST HDS|UNIWISC .* idd.unidata.ucar.edu This was done in order to reduce bandwidth usage and because many sites have such inefficient REQUEST entries. THIS MIGHT CAUSE A PROBLEM IF YOU HAVE SEVERAL DOWNSTREAM LDM-s BEHIND A NAT THAT REQUEST OVERLAPPING DATA FROM THE SAME UPSTREAM LDM. This is because the upstream LDM will see all the requests as coming from the same NAT device and so will reduce them to non-overlapping requests. The best solution is to have only one downstream LDM request all the data and to have the other downstream LDM-s request their subset of the data from it. (There are other solutions. Contact <support-ldm@xxxxxxxxxxxxxxxx> if you need them). Improved the API of the auto-shift module (which is responsible for switching between primary and alternate transfer modes) and refactored the module in order to improve its performance. Adapted the rest of the LDM to the changes (in particular, an upstream LDM no longer initializes the autoshift module). Added checking for nil HEREIS data-product (does nothing). Upstream LDM 6: Modified to no longer reject a subscription by a downstream LDM 6 based on existing subscriptions from the same downstream host. Instead, the upstream LDM checks the new subscription against all previous subscriptions from the same downstream host. If the new subscription is a superset (either proper or improper) of an existing subscription from the same downstream host, then the other upstream LDM 6 process is terminated; otherwise, the new subscription is reduced by all previous subscriptions (which would normally do nothing). Eliminated the requirement that an upstream LDM that's sending the same data-products must be in the same transfer-mode (PRIMARY or ALTERNATE) in order to be terminated. This is because the downstream LDM can alternate between the transfer-modes and the previous upstream LDM should be terminated regardless of its transfer-mode. Added the ability to flush the connection by use of a nil (i.e., empty) data-product in order to improve performance over the current method of using a NULLPROC message, which requires a round-trip. This feature is currently disabled. It can be enabled once all downstream LDM-s are version 6.11.3 or later. Replaced use of exit() with done=1 in feed_or_notify(). Improved free(3)ing of upstream LDM database (ULDB)-determined product-class. Eliminated use of the auto-shift module because that capability is only meaningful to a downstream LDM. Top-level LDM Server: Added restart of system logging if an EXEC-initiated execvp(2) fails so that the reason for the failure will be logged. Ensured resource deallocation in upFilter_addComponent(). pqact(1): Added printing of product-identifier to debug message. Added "pipe_put(): write error: ..." error-message. rtstats(1): Replaced initial use of standard error stream with use of the LDM logging module, ulog(3). Corrected documentation on "-P port" option. Made miscellaneous improvements. System Logging: Logging library (ulog(3)): Added getter functions for ulog(3) parameters to support the top-level LDM server logging the reason for an EXEC failure. Modified how the system logging configuration-file is modified during package installation: Replaced ".debug" with ".*" in LDM entry to get logging to work on most systems. Added addition and use of template on systems that use version 5 or later of rsyslogd(8) so that the timestamps will be in UTC. Documentation: Improved description of LDM behavior. Documented "-p pattern" option in pqsend(1). Documented use of uldbutil(1) for monitoring upstream LDM-s. Updated 2012 workshop: Made break-times indefinite in workshop web pages. Corrected class times. Changed domain-name from guest.ucar.edu to fl-guest.ucar.edu. Added configuration variable YEAR to workshop-specifics. Replaced "6.9.8" with "@VERSION@". Misc: Created a data-product module and a nil data-product. Improved internal documentation. Adapted extractDecls(1) to SunOS 5.11's /usr/bin/awk. Corrected "git status -a" to "git status -u" in makefile. 6.11.2 2012-12-17 11:11:20-07:00 HOTFIX! LDM server: Differentiated between feeders and notifiers by the upstream LDM database (ULDB) when rejecting a request by a downstram LDM. Also removed all uldb_remove() calls except in cleanup() routine. ULDB module: Corrected use of RWL_EXIST in initLock() in misc/semRWLock.c. Makefile: Removed unnecessary "releaseCheck" target. Corrected "git status -a" to "git status -u". 6.11.1 2012-10-05 10:21:05-06:00 Makefile: Improved rules for releasing a new version: Removed targets "releaseCheck" and "ensureRelease". Corrected how "release" rule sets version in AC_INIT(). Made "release" mandatory to prevent bad CHANGE_LOG from being released. Corrected "commit-check" rule: added "-Fq" to grep(1). Upstream LDM Database (uldbutil(1) & uldb(3)): Added pathname to uldb(3) initialization so that "make check" in the "protocol/" subdirectory doesn't interfere with a running LDM system. Improved logging by both uldb(3) and uldbutil(1). pqing(1): Corrected setting of logging file-descriptor (thanks Harry). Moved parsing of "-s" option to outside #ifdef conditional. Corrected version printed. Documentation: Corrected main index in tutorial. Added 5th channel example to NOAAPORT documentation. Corrected CHANGE_LOG for release 6.11.0. Added RELEASE_NOTES. Misc: Defined _XOPEN_SOURCE as 600 and corrected #includes of "config.h". Removed Eclipse-identified lint. Regenerated protocol/ldm_xdr.c. Improved some internal documentation. Removed unnecessary directories "pnglib/CVS" and "zlib/CVS". 6.11.0 2012-09-24 16:13 -06:00 Instructions: Improved preinstallation instructions: add modification of Red Hat net.ipv4.conf.default.rp_filter kernel parameter to preinstallation instructions. Corrected LDM configuration-file example: merged multi-line entry into single line. Installation: Improved configure(1) error-message: if the configuration-file for the system logging daemon isn't found, then the error-message will now indicate that the problem might be because it's not readable. NOAAPORT: Updated GRIB tables. Added noaaport/mainpage.h to repository. Fixed installation of NOAAPORT webpages ldmadmin(1): ldmadmin(1) calculates the number of slots from the size of the surf-queue. Modified to allow use of suffixes on size specification. ldmd(1): Added transitory upstream LDM database. uldbutil(1): Created uldbutil(1) utility to list local upstream LDM processes. pqact(1): Improved command-line parsing and usage message: two operands caused default configuration-file to be used, which is a latent bug. Error-messages during command-line parsing are printed to the standard-error stream, which doesn't exist in the LDM context. Merged Raytheon's changes from ldm-6.8.1 pqing(1): Made the size of the largest expected data-product a command-line option (-s size). pqinsert(1): Added "-i" option to usage-message and improved message. Improved exit status. Logging: Modified log_start(): it no longer clears accumulated log messages. Moved filename and line number to start of log messages. Corrected addition of "localx.none" to system logging configuration-file when an entry comprises multiple lines. Demoted "Couldn't flush connection" log message from ERROR to NOTE. General: Removed some lint reported by Eclipse's C code analysis. Merged AWIPS-2 modifications from Raytheon 6.10.1 2011-10-24 13:11:04-06:00 Installation: Corrected installation helper-script "ensureSyslogEntry": ensured that ${LOG_LDM} and ${LDM_LOGFILE} would be replaced by their values rather than by their names. Added C macro LDMHOME to configuration header-file "config.h" and made configure(1) script set it to default value to be used if environment variable LDMHOME isn't set. ldmadmin(1): Removed setting of LDMHOME to $HOME in ldmadmin(1) because it was no longer necessary (and could be wrong) because LDMHOME is now determined by the configure(1) script. pqutil(1): Improved pqutil(1): initialized "path" variable in main() to NULL to prevent crashing when dereferenced. LDM library: globals.c: Improved getLdmHomePath(): made use of LDMHOME C macro in "config.h" if environment variable LDMHOME isn't set. ulog.c: Corrected serror(): now handles arguments that contain "%". Documentation: Made cosmetic change to HTML documentation: remove extra space from example command. 6.10.0 2011-10-18 11:01:05-06:00 NOAAPORT: Merged the NOAAPORT package into the LDM package. Corrected a bug in the deprecated readnoaaport(1) and dvbs_ingest(1) programs that caused an abort if the logging level was DEBUG due to the shared memory FIFO being already locked. Improved noaaport/gempak error messages -- in particular, added information to messages about missing tables and parameters. GRIBINSERT: Merged the GRIBINSERT package into the LDM package. This subpackage converts GRIB messages in files into LDM data-products and inserts them into the LDM product-queue. Improved GRIB2 tables: Updated tables. Made installation rule create links instead of install duplicate files. Moved site-specific stuff from "g2varswmo.tbl" to "g2varsncep.tbl". pqact(1): Improved log messages: The PID and command-string of every child process is logged at level ERROR if its parent pqact(1) process deletes the reference to the child process due to an error in an interaction with it. The PID and command-string of every child process created due to a PIPE entry and whose reference is deleted in order to create another pipe is logged at level INFO. ldmadmin(1): Changed when product-queue metrics are reset by ldmadmin(1) and added queue metrics resetting to "ldmadmin start". The metrics are no longer reset if the reconciliation-mode is "do nothing". Improved the command "vetqueuesize" (and, consequently, the command "check"). The capacity of the product-queue will not be vetted until the LDM server has been running for at least `regutil /server/max-latency` seconds. This will prevent a misdiagnosis of the queue capacity when an initially empty queue is being rapidly filled at LDM startup. Improved "plotmetrics" command: Ported most of the command to SunOS. Getting the number of LDM connections is still problematical, however, because the output of SunOS's netstat(1) differs radically from Linux's netstat(1). Made the plotMetrics(1) script more portable by replacing arithmetic expansion with use of expr(1). Changed the title of an "ldmadmin plotmetrics" plot to "Amount of Data in Queue vs. time". Improved "ldmadmin newmetrics" example: corrected minute and hour fields and changed interval to weekly. Corrected spelling of "reconciliation" pqmon(1): Documented "mvrtSize" & "mvrtSlots" in output. pq(3): Improved error-message when queue is too big. Documentation: Improved installation documentation. Made tarfile reference version-independent. Modified README: removed RELEASE_NOTES section and modified SUPPORT section. Misc: Fixed error-logging when LDMHOME isn't set Many changes related to porting to different platforms. 6.9.8 2011-06-10 Installation: Changed the build-procedure for the product-queue library (pq(3)) to improve throughput. Before, the build-procedure was configured to create a pq(3) library that always memory-mapped the data-products individually (rather than memory-mapping the entire product-queue) if the C compiler was c89(1) or c99(1) and the "int", "long", and pointer types were 32-bits but the "off_t" type was at least 64-bits. Now, the pq(3) library will always memory-map the product-queue in a single call if possible regardless of the programming environment. This reduces the number of calls to the system mmap(2) and munmap(2) functions and, consequently, increases throughput. Installed rpc/ header-files because the native ones on a Solaris system were preventing the NOAAPORT package from being built. Changed "configure.ac" so that the C compiler determined by the top-level "configure" script is used to build the "libxml2" subpackage. Eliminated use of _MAPRGNS C macro. ldmadmin(1) script: Changed setting of PATH environment variable. Before, "$LDMHOME/bin" was prefixed to PATH; now, "@prefix@/bin" is prefixed to PATH, where "@prefix@" is the value of the "prefix" variable determined by the configure(1) script). This allows the LDM user to easily execute an LDM system to which the "runtime" link doesn't point. Removed reference to SEEK_END from "use Fcntl" statement because that constant isn't used and older perl(1)'s don't have it. Product-queue library, pq(3): Demoted the logging-level of the minimum virtual residence time (MVRT) data-product message from NOTICE to INFO so that it will only be emitted if verbose logging is enabled. Modified logic for deciding whether or not to memory-map data- products individually. Such mapping now occurs if and only if the PQ_MAPRGNS flag is specified (not likely) or the actual size of the product-queue prevents it from being memory-mapped by a single mmap(2) call. Eliminated use of _MAPRGNS C macro. pqact(1): Added "-metadata" option to FILE action. This causes a binary representation of the data-product's metadata to be written to the output file. See the distributed, example pqact(1) configuration- file for more information. Documented "-log" option of FILE action in distributed, example pqact(1) configuration-file. HTML documentation: Removed all attributes from <body> element to enable correct working with new UPC website. Improved documentation on running multiple LDM-s. Misc: Modified file "protocol/LdmProxy.c". Replaced use of "s_prod_info(NULL, 0, ...)" with use of a static buffer to prevent SIGSEGV on 64-bit RHEL 6. Thanks Doug Gaer. Removed valgrind(1) lint from "misc/inetutil.c:ghostname()". Added handling of snprintf(3) and vsnprintf(3) returning a value greater than the size of the buffer. Improved log(3) module: * Arbitrarily long messages; * Return-value handling of vsnprintf(3); and * Thread-safe. * Added log_errnum(int errnum) in anticipation of supporting multiple threads. 6.9.7 2011-02-01 Installation: Make the determination of large-file support by the configure(1) script more robust by removing the use of the "-v <spec>" option of the getconf(1) utility because some of those utilities are broken. ldmadmin(1): Improve the computation of the queue parameters when the queue is too small or the maximum-latency is too large by basing the computation on the data-usage and slot usage at the time when the minimum virtual residence time is set in order to increase the stability of the result. Improve the warning message from the "ldmadmin vetqueuesize" command when the reconciliation-mode is "do nothing" in order to better inform the user by printing to the standard error stream what the queue parameters or the maximum-latency parameter should be in order to guarantee rejection of duplicate products. pqmon(1): Improve the output from the "-S" option in order to improve the stability of the computation of new queue parameters and maximum latency parameter by printing two more metrics: the data-usage and the slot-usage at the time when the minimum virtual residence time was set. pq(3) library: Add additional queue metrics in order to improve the stability of the computation of new queue parameters and maximum latency parameter by adding persistent tracking of the number of bytes used and the number of slots used when the minimum virtual residence time is modified. Improve the computation of the minimum virtual residence time in order to improve its stability by safeguarding the computation against data-products that are received or deleted before their creation-time. Improve the minimum virtual residence time access-API by replacing pq_getMinVirtResTime() and pq_clearMinVirtResTime() with pq_getMinVirResTimeMetrics() and pq_clearMinVirtResTimeMetrics(), respectively. 6.9.6 2011-01-25 pqact(1): Now converts a relative specification of its configuration-file to an absolute one so that the file can be (re)read even if the current working directory changes (which is the default in LDM 6.9). ldmd(1): Add check for empty product-identifier patterns in the LDM configuration-file. ldmd(1) will now emit a good error message and error-exit if it encounters one. 6.9.5 2011-01-20 Installation: Correct determination by the configure(1) script of the pathname of the LDM log file for setting in the configuration-file of the system logging daemon. 6.9.4 2011-01-10 Installation: Correct the configure(1) script's adjusting of the "sysconfdir" and "localstatedir" variables in order to get the "--syscondir=" and "--localstatedir=" options working. Correct a bug in the makefile rule that adds the LDM to the list of facilities that don't log to any system log files. Generalize the makefile rule that ensures the LDM doesn't log to any system log files. 6.9.3 2011-01-04 Installation: Correct a bug in the configure(1) script's test for the c89(1) or c99(1) compiler that prevents building with support for large files on 32-bit systems. Generalize the makefile rule that adds the LDM to the list of facilities that don't log to the system log file. ldmadmin(1): Modify "newlog" command so that it no longer prevents other ldmadmin(1) scripts from executing simultaneously. pqact(1): Add the SIGXFSZ (file size limit exceeded) signal to the set of ignored signals in order to prevent the FILE action from crashing a running LDM system if the output file gets too big. Documentation: Remove "bin/" prefix from crontab(1) entry examples. It's unnecessary because the entries' "bash -l" beginning should obtain the correct LDM user's PATH environment variable. 6.9.2 2010-12-30 Improve HTML documentation: Correct crontab(1) example for "ldmadmin check". 6.9.1 2010-12-29 Enhance installation: Modify configure(1) script so that it attempts to build in as large a programming environment as possible (as it did in versions 6.2 through 6.8) in order to support product-queues larger than 2^31 bytes. The configure option "--disable-max-size" disables this feature. Modify ldmadmin(1): * Correct ldmadmin(1) lock-file locking (IMPORTANT!). * Improve queue-deletion logic. Improve pqcreate(1): Check for overflow of size specification due to suffix ("M", "G", etc.). Document wasReceived(1): Add printing of usage message; create man(1)-page; and add to list of programs in HTML documentation. 6.9.0 2010-12-23 SUMMARY: Dragged the kicking and screaming LDM package into the late 20th century. :-) Installation: Upgraded the package-installation mechanism from one based on autoconf(1) and ad-hoc makefiles to one based on automake(1). THIS IS A BIG DEAL WITH RAMIFICATIONS: BOTH THE INSTALLATION PROCEDURE AND LAYOUT ARE DIFFERENT. FORGET EVERYTHING YOU KNOW ABOUT INSTALLING THE LDM AND FOLLOW THE NEW WEB-PAGE INSTRUCTIONS. Incorporated documentation into the package. Registry: Created a registry for the LDM similar to the Windows registry, Gnome's GCONF, and Java's preferences. The registry can be accessed both from scripts and programatically. A new utility, regutil(1), can access the registry from the command-line. The registry is implemented as an XML file (etc/registry.xml) -- so it can be manually edited if no other process is writing to it. As a consequence of the creation and use of the registry, the following environment variables no longer work: LDMHOSTNAME LDMPQFNAME Portability: Added checks for netstat(1) and top(1) to configure(1) script and appropriately modified ldmadmin(1). Among other things, this ported the "ldmadmin printmetrics" command to Mac OS X (note, however, that a bug in Mac OS X prevents the LDM from working reliably on that system). ldmadmin(1): Added "vetqueuesize" command to reconcile the maximum latency parameter with the observed minimum virtual residence time of the queue. THIS IS A BIG DEAL BECAUSE IT MEANS THE LDM SYSTEM CAN NOW *AUTOMATICALLY* RECREATE THE PRODUCT-QUEUE -- ADJUSTING ITS SIZE AS NECESSARY -- TO PREVENT DUPLICATE PRODUCTS FROM BEING TRANSMITTED. See the web-page on configuring the LDM for details. Added "check" command to check the LDM system via crontab(1). This command will adjust the size of the product-queue if necessary and configured to do so. Made decoding of invocation-arguments command-specific so that the "-f" option could be used in both the "mkqueue" and "watch" commands. Improved support for concurrent ldmadmin(1) processes: replaced test for lock-file existence with non-blocking call to flock(). Modified "clean" command so that it no longer emits a warning and error exits if the LDM server pid-file (~/ldmd.pid) doesn't exist. Modified "log" command so that it uses the PAGER environment variable instead of more(1). Made "usage" the default command. Cleaned-up "usage" message. Enhanced output of "config" command. Improved some error-messages. LDM server (ldmd(1)): Renamed the LDM server from "rpc.ldmd" to just "ldmd". APPROPRIATELY ADJUST ANYTHING YOU HAVE THAT DEPENDS ON THIS NAME. Added logging to some failed pq_close() calls in an attempt to debug the Mac OS X 10.5 fcntl() problem. regutil(1): New utility for accessing the LDM registry from the command-line. pqmon(1): Added "-S" option to print various "size" parameters to the standard output stream. pqutil(1): Added "-C" option to clear the minimum virtual residence time metric. ulogger(1): Made the LDM logging facility (default: LOG_LOCAL0) the default facility for the "-p" option. pqsend(1): Modified to use LDM-6 protocol and added option to decouple its total time-out and time-offset parameters. Improved filtering of sent data-products. If the downstream LDM replied to the HIYA with a RECLASS response, then the offered product-class specification was replaced with the one in the reply. This would prevent the originating site from restricting the class of products sent to the LDM. Now, the product-class specification in the RECLASS response from the LDM is used in series with the originating site's specification: products must now pass both filters. ldmsend(1): Modified to ensure that it can send a zero-length file on any system. Improved filtering of sent data-products. If the downstream LDM replied to the HIYA with a RECLASS response, then the offered product-class specification was replaced with the one in the reply. This would prevent the originating site from restricting the class of products sent to the LDM. Now, the product-class specification in the RECLASS response from the LDM is used in series with the originating site's specification: products must now pass both filters. pq(3) library: Corrected ability to build without mmap(2) support via the NO_MMAP C macro. Added the ability to track the minimum virtual residence time. Added logging of data-product metadata when the associated data-product is deleted from the product-queue and it was created in the future. plotMetrics(1): Added test for non-existent data-files. Misc: Corrected pat_clone() if the source is the trivial pattern ".*". Upgraded the version-control mechanism from CVS to git(1). Corrected FNEXRAD webpages: removed "floater" link and corrected "how to" link. Replaced defunct hyperlinks to list of WMO headers with hyperlink to WMO Tables from Manual 386. Added (undocumented) wasReceived(1) script. Added "config.h" to installed headers. 6.8.1 2009-08-14 Installation: Improved configure(1) script: Added checks for ar(1), rpcgen(1), netstat(1), ntpdate(8), and version 5 of perl(1). Documented more significant environment variables listed by "configure --help". Replaced use of $(INSTALL) in makefiles with cp(1) because that was always the value of the macro. ldmadmin(1): Improved responsiveness by changing default ntpdate(1) timeout from 20 seconds to 5. Improved printmetrics": Fixed bug that caused the command on some systems to terminate prematurely due to a close() error. Set default values for product-queue metrics to -1 (missing). Ported command to more environments. Modified command to honor value of variable $pq_path. Added internal documentation to file pqact/state.c. 6.8.0 2009-07-31 Installation: The ldmadmin(1) configuration-file is copied, read, and rewritten with additional user-configurable parameters. LDM Server (rpc.ldmd): Improved vetting (i.e., access-checking) of a client to prevent delays due to a time-out on the reverse DNS lookup, which is used to convert the client IP address into a hostname: Moved vetting from the LDM server before fork(2)ing a child process to the fork(2)ed child process. Made vetting a two-phase procedure: first with the client IP address and then, if and only if that fails, with the client hostname. Added the new option "-M max_clients" (default: 256). ldmadmin(1): Program: Added the ability to check the accuracy of the system clock. This new ability is highly user-configurable. The defaults are to check the clock but not to abort if it's off by too much. Added removal of product-information (~/.*.info) files to the "delqueue" command if "$deleteInfoFiles" is true in the ldmadmin(1) configuration-file. Added the new option "-M max_clients". Added the new commands "printmetrics", "addmetrics", and "plotmetrics". Moved variables "$os" and "$release" to the configuration-file. Added the error message "Uknown command: ". Removed printing of "ldmadmin" from "ldmadmin usage" output. Configuration-file (ldmadmin-pl.conf): Improved internal documentation and layout. Added many new variables. Manual-Page: Documented LDM configuration-file argument. Added "-C" and "-x" options. Rearranged options alphabetically. scour(1): Added the prefix "scour: " to log messages. scripts/plotMetrics: Created this script for plotting the accumulated output of "ldmadmin addmetrics". 6.7.1 (was 6.7.1.1) 2009-06-19 Installation: Modified the rule for making the RPC library so that it always adds the object modules because they weren't always added to the LDM library on a very fast Linux 2.6.26.6-79.fc9.x86_64 system. Added printing of system logging daemon PID file to configure(1) script output. Improved configure(1) help message. ldmadmin(1): Modified "ldmadmin pqactHUP". In general, it now restricts its search for pqact(1) processes to those owned by the user. This should only affect sites running multiple pqact(1)-using LDMs on the same host. rpc.ldmd(1) (LDM server): Improved handling of "EXEC pqact..." entries in the LDM configuration-file that have trailing whitespace by the ldmadmin(1) script. Improved ldmd(1) manual-page. Downstream LDM: Fixed bug in downstream-LDM code when it receives a data-product that is larger than the largest data-product that the product-queue can hold. Before, the downstream-LDM process would terminate; now it emits an error-level log message and continues. (Thanks AWC). pqact(1): Fixed a bug in pqact(1) that caused it to receive a segmentation fault (SIGSEGV) when an action-entry matched the dummy "_BEGIN_" data-product. Thanks Chuck. Promoted "timed-out" message from pqact(1) PIPE action from WARN to ERROR. pqinsert(1): Added "-i" option to synopsis section of pqinsert(1) man(1)-page. Misc: Modified manual-pages to automatically indicate the time of last modification and put options in alphabetical order. 6.7.0 (was 6.7.0.7) 2008-10-09 Installation: Added rpcgen(1) output to distribution (e.g., ldm6_clnt.c, ldm_xdr.c) and removed unconditional use of rpcgen(1) from makefiles. This was done because rpcgen(1) on a Mac OS/X 10.5.1 (Darwin 9.1.1) system generates output that's incompatible with the "rpc" subpackage. Slightly modified the configure(1) script to work around non-standard tr(1) utilities. Added the typedef "prod_class_t" to the header-file "ldm.h" and changed all code and documentation to use it instead of the typedef "prod_class". This was done to allow "ldm.h" to be processed by a C++ compiler. The typedef "prod_class" still exists for backward compatibility -- though it is no longer used in the code. Both C and C++ programmers should now use "prod_class_t" instead of "prod_class". Added "typedef" for "rpc_inline_t" to "rpc/types.h" to support output of rpcgen(1) on SunOS 5.11 systems. Ported to Fedora 8. The log file of the system log daemon is "/var/run/rsyslogd.pid". Ported to Darwin 9: corrected misdefinition of OPEN_MAX as 10240 by ensuring that the XOPEN_SOURCE and XOPEN_SOURCE_EXTENDED macros are defined on that platform. Feedtypes: Changed the primary name of the FT27 feedtype from "NNEXRAD" to "NEXRAD3" to accomodate such data regardless of source. "NNEXRAD" is an understood alias for that feedtype. ldmadmin(1): Added checking of LDM configuration-file syntax to "start" command. Modified the "pqactcheck" command. By default, it now checks the syntax of every pqact(1) configuration-file that is associated with an EXEC entry for pqact(1) in the LDM configuration-file. LDM configuration-file entries like "EXEC pqact -f CONDUIT" (i.e., with options but with no explicit configuration-file) are correctly handled. Changed the default size of the product-queue from 400 megabytes to 500 megabytes. Changed setting of PATH environment variable in ldmadmin(1) script to use $bin_path and $PATH only. Added initialization of local variables to functions in the ldmadmin(1) script to accomodate Perl interpreters that no longer perform default initialization. rpc.ldmd(1) (LDM server): Adapted parsing of timestamps in .*.info files to Darwin 9.1.1: replaced use of strptime() with sscanf() (strptime() conversion specification must be separated by non-alphanumeric characters). pqact(1): Made each decoder its own process-group leader. This should improve the performance of decoders like GEMPAK's dcgrib2(1). Added "-metadata" and "-nodata" options to the PIPE action of pqact(1). Changed behavior if a corrupt state-file is read. Before, the process would exit. Now, it continues with the most recent data-product (same as if the state-file didn't exist). Adapted pqsurf(1) to handle multiple BOYC reports in composite SHIP bulletins. Added code to the parser of feedtype expressions to prevent an infinite loop upon encountering two consecutive UNION (|) operators. pq(3): Removed retry attempt from write-locking fcntl() call in file "pq/pq.c" because only fatal signals could occur. Misc: Improved some log messages. Slightly improved rtstats(1) man-page. 6.6.5 (was 6.6.5.11) 2007-06-19 Corrected the "pqact" utility's determination of the month associated with a data-product from the creation-time of the data-product and the day-of-the-month field in the product-identifier. This modification is tested extensively by executing the command "make check" in the pqact/ subdirectory. Removed extraneous carriage returns from file pqact/wmo_header.c. 6.6.4 (was 6.6.4.2) 2007-05-17 Modified the function surf_split() in the "pqsurf" program so that it uses a dynamically allocated buffer instead of a statically allocated one. This means that "pqsurf" can now handle arbitrarily large composite bulletins. Fixed (for the last time!) the "pqact" utility's determination of the month associated with a data-product from the creation-time of the data-product and the day-of-the-month field in the product-identifier. Changed the behavior of a downstream LDM upon reception of a COMINGSOON message whose data-product has zero length. Before, this would cause the downstream LDM to exit; now the data-product is simply rejected. Both LDM-6 and LDM-5 code were modified. Improved the performance of the "scour" utility. Added a call to exitIfDone() after the call to pq_sequence() in file "up6.c". 6.6.3 (was 6.6.3.1) 2007-04-06 Corrected command that removes old ".*.info" files from the LDM user's home-directory in the "ldmadmin" script. The "-prune" option wasn't preventing the "find" process from descending into subdirectories. Modified algorithm that determines when an upstream LDM should flush the connection to its downstream LDM. The modification of the algorithm introduced in version 6.6.1 appears to not flush the connection often enough --- resulting in bursts of data which can cause problems (e.g., the ORPG apparently has problems keeping up with bursts of NEXRAD Level II data). The modified algorithm will flush the connection the first time the end of the queue is hit and every 30 seconds thereafter if no relevant data is added to the queue. 6.6.2 (was 6.6.2.2) 2007-03-22 Corrected (again) the "pqact" utility's determination of the month associated with a data-product from the creation-time of the data-product and the day-of-the-month field in the product-identifier. This is the primary reason for this release. Added "-prune" option to execution of "find" in "ldmadmin" when removing old ".*.info" files from the LDM user's home directory. Corrected the logic behind an upstream LDM sending something (at least a NULLPROC) every 30 seconds. 6.6.1 (was 6.6.1.0) 2007-03-13 Demoted the "Exiting" message from "rpc.ldmd" from log-level NOTE to log-level INFO unless it's in response to a TERM signal (such as by "ldmadmin stop"). Modified the "flushing" algorithm of an upstream LDM. It used to flush the connection more often than every 30 seconds; now it flushes the connection no more often than every 30 seconds. 6.6.0 2007-03-07 Added a persistent-state file for a downstream LDM. This file saves the metadata of the last, successfully-received data-product so that the next downstream LDM process that requests the same data from the same source can start where the previous process stopped. The files reside in the LDM user's home-directory and have the pattern ".*.info". This increases the startup performance of a downstream LDM and will greatly benefit LDM's with many REQUEST entries. Changed format of distribution file from ".tar.Z" to ".tar.gz" because the "compress" utility is not available on my development workstation (due to IP restrictions) and the (now necessary) "gunzip" utility appears to be ubiquitous. Corrected the "pqact" utility's determination of the month associated with a data-product from the creation-time of the data-product and the day-of-the-month field in the product-identifier. 6.5.1 (was 6.5.1.5) 2007-02-23 Improved LDM performance: Of downstream process during startup by changing product-queue access-mode from writing to readonly when searching backwards for matching product to avoid file write-locking contention. Of upstream process during termination by Adding potential termination point to each data-product during initial backward search of the product-queue. Closing downstream connection upon receipt of SIGTERM. Of downstream process during termination by closing downstream connection upon receipt of SIGTERM. Modified the "pqact" utility: Corrected behavior of the "-overwrite" option of the FILE and STDIOFILE actions. Ensured proper behavior of the "-log" option of the FILE and STDIOFILE actions regardless of operating-system. 6.5.0 (was 6.5.0.4) Modified top-level LDM server: 1. Replaced sending of SIGINT to process-group with sending of SIGTERM because that allows for a cleaner shutdown of pqact(1) processes. This *shouldn't* affect decoders because they've always been required to terminate upon reception of either a SIGTERM or SIGINT. You might check your decoders, however. 2. Added the ability for the configuration-file to have "include" statements. Made all LDM programs safer in the face of asynchronous termination signals (SIGTERM) by eliminating calls to unsafe functions by signal handlers and correcting responses to SIGTERM. The LDM server and its child processes will now respond synchronously to a SIGTERM rather than in an unsafe, asynchronous manner. This makes termination of a running LDM system take longer (have patience), but greatly reduces the risk of mysterious crashes. Modified pqact(1) utility: 1. Added saving of the insertion-time of the last successfully-processed data-product in a file whose pathname is that of the configuration-file with ".state" appended. This allows the pqact(1) process in a subsequent LDM session that uses the same configuration-file to start processing where the previous one left-off (it logs this fact). This means that one pqact(1) process, at most, should execute any pqact(1) configuration-file. 2. Added "-log" option to FILE and STDIOFILE actions. This option will cause the pathname and product- identifier to be logged at the NOTICE level. 3. Added logging of warning message when the oldest product in the product-queue is processed. 4. Modified error-message logged with a child process terminates. If the child process was stated via an EXEC entry in the LDM configuration-file, then the command-line is appended to the error-message to identify the entry. 5. Added printing of the command-line of decoders that do not read from standard input quickly enough to log message. This should ease the identification of slow decoders. 6. Increased the number of arguments in a PIPE command from 15 to _POSIX_ARG_MAX/2 (2048). 7. Modified algorithm for determining the canonical time of a WMO data-product from the day-of-month component in the product-identifier. It now assigns the data-product to the previous month if and only if the canonical time of the data-product is one or more days in the future (as determined by the creation-time of the data-product and the day-of-month component in the product-identifier). This should eliminate the problem of old, retransmitted WMO data-products being assigned to a future time. Added "-i" option to pqinsert(1). This option causes the MD5 signature to be computed from the product-identifier rather than from the product's data. This will greatly increase the rate at which large data-products can be inserted but requires that the product-identifier be unique. Modified behavior of product-queue module: Modified pq_setCursorFromSignature(3) in file "pq/pq.c". It used to find the data-product with the given signature by searching forward in the time-map from just before the creation-time of the target data-product until it either found a time-map entry whose signature matched or until the data-products appeared to come from the same source but were created one minute later. Now it searches forward in the time-map from the same starting point until it finds an entry whose offset to the data region equals that of the signature-map entry. If no entry is found, then a second search is made starting from the beginning of the product-queue up to the starting point of the first search. This second search is much more time-consuming but will find data-products whose creation-time is, otherwise, too far in the future (relative to the local system clock). This should fix Art Person's problem of not finding the "signature" data-product during a reconnection by a downstream LDM (JIG-686458). Added warning-level log message to pq_insert(3) about data-products that are created sufficiently far in the future (see the previous paragraph) to cause problems during reconnection. Only one such message will be logged per hour per ingest host. In this day and age, any computer that's connected to the Internet can easily have an accurate system clock -- and that's been an explicit requirement for proper operation of the LDM from the beginning. Fixed bug in upstream LDM that could cause it to skip over data-products. The bug was due to the way an upstream LDM processed a request with an encoded signature. The LDM would adjust the "from" time of the request to the insertion time of the associated product, if found. Under sufficient latency conditions, the insertion time would be after the creation- time of the next products that should be sent and the products would be filtered-out. The correction involves removing the adjustment but still setting the product-queue cursor based on the signature product. Improved downstream LDM. Removed from a reconnection attempt the setting of the metadata of the last successfully-received data-product from a search of the product-queue if the number of downstream LDM was two or more. This was mistakenly introduced in version 6.4.5. Modified "log_log(3)" and "err_log(3)" so that they print error- messages using a "%s" format instead of passing them directly to ulog(3) because the messages might contain formatting characters (e.g., "%" from, for example, a product-identifier). This will prevent upstream and downsteam LDM-s from crashing when printing a product-identifier that contains a "%". (Thanks Harry.) 6.4.6 (was 6.4.6.5) 2006-10-19 Improved error-message from readtcp() in the svc_tcp module when a select() on the socket times-out. Modified ldmadmin(1) script to allow a zero argument to the offset option (-o). Corrected behavior of the "-overwrite" option in pqact(1)'s FILE and STDIOFILE actions. Before, data-products would always be appended unless the file was closed -- either explicitly via the "close" option or implicitly (and unpredictably) if pqact(1) ran out of file descriptors. Now, both those actions always start writing from the beginning of the file. Corrected "-P port" option for ldmsend(1). The option affected an LDM 6 connection but not an LDM 5 connection. Now it does. Renamed the type "error_t" to "ErrorObj" to avoid a legitimate name-conflict with system headers. Modified pq_del_oldest(3)) function so that it releases the data region if the signature isn't found in the signature-list. This should have little, practical effect because the result of not finding the signature entry is, ultimately, to terminate the downstream LDM (once the queue is corrupt, it's a little late to ensure consistency -- still, the code is better). Modified vulog(3) function. Because it calls functions that are unsafe in the presence of asynchronous signals (e.g., SIGCHLD), it now blocks most signals during its execution. This should prevent a SIGSEGV from occuring when inside the strftime(3) function when a SIGCHLD is received. Changed error-message "Terminating due to LDM failure..." to "Disconnecting due to LDM failure..." to improve accuracy. Moved initialization of autoshift module to accomodate incoming HIYA connections that start sending data-products regardless of a RECLASS reply. This solves a problem receiving data from WSI. Corrected ulog/log module (it only printed the first message). Cosmetic changes to "ulog/log" module. Committed previous-version changes to RPC library so that they will actually appear in a distribution. pqexpire: Enabled "make tags". Added internal commentary to code. In an attempt to solve Robert Mullenax's problem of the upstream connection being closed for no apparent reason (see AET-991057) the "ulog/log" module was created to accumulate log-messages and some logging was added to the "rpc/svc_tcp" module. This modification might have the added benefit of preventing a downstream LDM from receiving a SIGSEGV under very rare circumstances when the RPC layer closes the connection due to a fault (basically, svc_destroy(SVCXPRT*) was being called twice on the same transport). 6.4.5 (was 6.4.5.5) 2006-03-03 Corrected behavior of downstream LDM when upstream host no longer is has the IP address that was used to establish the connection. The downstream LDM now first verifies that the IP address of the upstream host has not changed when verifying that the upstream LDM is still alive after not receiving anything for 60 seconds. This detects problems arising from the upstream host being assigned a different IP address by its Internet Service Provider upon reconnection to the Internet by the upstream host (e.g., the UCAR HAIPER airplane). Added misc/inetutil/hostHasIpAddress() and modified server/requester6/is_upstream_alive() to use it. Rationalized forward and reverse hostname resolution: modified most code to use one of misc/inetutil/hostbyaddr(), misc/inetutil/addrbyhost(), or misc/inetutil/hostHasIpAddress. Added logging of excessive time-usage to those functions to notify user of, for example, an LDM server that's hanging trying to resolve an IP address into a hostname. This is particularly important for LDM-s to which many rstats(1) connect. Modified the downstream LDM code so that it closes any connection to the network host database after an unsuccessful connection attempt. This allows DNS updates to have an effect on a running downstream LDM. Modified when a downstream LDM process searches backwards through the product-queue for the most recent data-product that matches the product-class. It now does it only once if it's the only downstream LDM process that will request the data. This greatly reduces the load that a downstream LDM puts on the CPU when it can't connect to the upstream LDM. Corrected checking of saved product-information by a downstream LDM if the number of hosts sending the same products is two or more. This should decrease the rate of transfer-mode switching. Changed the identifier used in ulog(3) messages: the remote hostname portion is no longer truncated after the first component of the fully-qualified hostname. The maximum length of the identifier is still 32 characters. This should make interpretation of log messages easier. Stopped ldmping(1) and pqcheck(1) from writing into log file when executing "ldmadmin start" and "ldmadmin stop". Modified rtstats(1) so that it can report more than 2^32 bytes of received data. Fixed "ldmadmin pqactHUP" for Mac OS X by adding "Darwin" to known operating-systems for executing ps(1) in order to find the pqact(1) PIDs (thanks to Dave Dempsey). Modified mkdirs_open() so that it doesn't error-return if the directory to be created exists (it might just have been created by another pqact(1) process). This eliminates a race condition between two pqact(1) processes trying to write to the same output directory. Removed an assert(n > 0) call in pq/pq.c that was responsible for an upstream LDM crashing in the unlikely event that the first four bytes of a data-product's signature were all zero (2^32 to 1, against). Demoted "feed or notify failure; ..." message from level ERROR to level NOTICE because it's now expected for an autoshifting downstream LDM. Corrected test of strdup() result in parser for LDM configuration-file. Modified pqinsert(1) so that it exits with a non-zero status if something went wrong inserting a file into the product-queue. Corrected ldmping(1). It now correctly interprests hostnames that start with a digit (e.g., "600644362.tssmob.net") rather than assuming the hostname is an IP address in "dotted-quad" format. 6.4.4 (was 6.4.4.0) 2005-12-01 Eliminated ERROR-level logging by the pqact(1) utility of the extraneous messages that start with "pbuf_flush (fd) write: Broken pipe" by returning removal of the relevant file-list entry to the reap() function, when appropriate. This bug was introduced by the modification to pqact(1)'s logging in version 6.4.3. 6.4.3 (was 6.4.3.2) 2005-11-08 Added support for 4 GB product-queues on 32-bit systems running Free BSD 4. Modfied product-queue module: it now memory-maps the entire product-queue if possible and allowed based on a runtime determination (rather than a configuration-time one). Modified pqact(1): it will now print the command-string of a PIPE child process (if available) when the child process is stopped or terminated by a signal or when the child terminates normally but with an error status. The command-string won't be available if the child process terminates due to pqact(1)'s closing of the pipe. Modified logging module, ulog(3): Replaced use of vsprintf(3) with vsnprintf(3) to eliminate risk of buffer overflow. Rewrote vulog(): Eliminated fork()ing in writing to console when regular logging fails because of reports of hanging, downstream LDM. See <http://www.unidata.ucar.edu/support/help/MailArchives/ldm/msg04324.html>. Restructured code, removed superfluous code, and combined common code. Removed some lint(1). Corrected use of PATH_MAX in pqact/filel.c, which incorrectly assumed that the terminating NUL wasn't counted. Removed superfluous set_abbr_ident() from "up6" module. Changed URL "my.unidata.ucar.edu/content" to "www.unidata.ucar.edu" wherever found. 6.4.2 (was 6.4.2.5) Bug Fixes: Downstream LDM: Fixed bug in "DownHelp" module that caused a downstream LDM 5 resulting from a HIYA message to terminate normally with an error status when it received the first data-product. pqact(1): Fixed bug described in http://www.unidata.ucar.edu/support/help/MailArchives/ldm/msg04238.html. by improving how pqact(1) manages its file descriptors. File descriptors are now reserved for stdin, stdout, stderr, the configuration-file, the product-queue, and (possibly) logging. Stdin and stdout are redirected to /dev/null at startup to prevent problems with miscoded child programs. Stderr is redirected to /dev/null if logging isn't to stderr. Most other file descriptors are set to close-on-exec. scour(1): Fixed a bug in scour(1) that caused it to output extraneous error-messages about not being able to read (irrelevant) directories. The fix involved simplifying the use of the find(1) command. feedme(1): Fixed program feedme(1) -- which didn't work -- by adding use of module xdr_data. Non-Bug-Fix Improvements: General: Modified module xdr_data. Changed implementation and API to allow programs like feedme(1) to allocate less memory. Removed some lint(1). rpc.ldmd(1): Added calls to prctl() on Linux systems to allow the LDM program (rpc.ldmd) to dump a core-file. Modified LDM server to use new "xdr_data" API. Downstream LDM: Cleaned-up code for determining the acceptable class of products from the product-class of a HIYA message and the ACCEPT entries in the LDM configuration-file. Modified "down6" module of downstream LDM system. Renamed down6_new() to down6_init() and made it callable multiple times. Changed handling of uninitialized module from assert()ion failure to error-code return. Modified clients of down6 module accordingly. pqact(1): Improved efficiency of writing to a pipe by increasing the size of the pipe-buffer from _POSIX_PIPE_BUF (512) bytes to PIPE_BUF bytes on systems that define PIPE_BUF. Modified message logged when it takes longer than one second to flush a pipe: improved wording and reduced logging-level from ERROR to WARNING. 6.4.1 Installation: Bracketed _XOPEN_SOURCE and _XOPEN_SOURCE_EXTENDED in "config/ldmconfig.h" with "#ifndef" to accomodate compilation environments that define those macros (contrary to the standard). Downsteam LDM 6: Fixed bug in handling of ACCEPT connections that caused the downstream LDM to crash by adding initialization of autoshift module in response to HIYA message. 6.4.0 rpc.ldmd: Server: Added ability to use different port than well-known LDM port, 388: Default LDM port can be set when package is built. LDM port on which server will listen can be set when server is executed. Upstream port to which downstream LDM connects can be set in associated REQUEST entry. Downstream LDM 6: Behavior: Reject every data-product that is older than "max_latency" seconds -- regardless of arrival mode (HEREIS or COMINGSOON/BLKDATA). Added ability to encode MD5 signature of last, successfully-received data-product in FEEDME product-class specification when connecting to upstream LDM-6. Should prevent skipping of data-products that arrive at upstream LDM-6 out of temporal order. Added the ability of downstream LDM to automatically adjust transfer-mode of feed (primary vs. secondary) based on success of inserting data-products into product-queue. Replaced adjustment of product-class specification in FEEDME request based on last successfully-received data-product with similar adjustment based on most recent data-product in queue that matches specification. Allows input from other downstream LDM-s. Changed way data-products are accumulated when received via COMINSOON and BLKDATA messages. They are now fully received before any attempt is made to insert them into product-queue. Performance: Reduced CPU utilization by about 75 percent by creating new RPC library function, svc_getreqsock(3) and using it. Increased size of queue for connection requests in LDM server from 2 to 32. Should ameliorate connection problems that occur due to large number of connection attempts in short time. Upstream LDM 6: Added "upstream" filtering. An upstream LDM can now filter data-products based the product-identifier and regular-expression in the LDM configuration-file. pqact(1): Added ability to "back reference" more than nine subexpressions in string-replacement section of pqact(1) actions. Now, for example, string "\(12)" in that section references twelfth subexpression of regular-expression. scour(1): Added blank line to top of scour(1) script to allow user's with non-conforming shell to execute script directly. rtstats(1): Default feedtype returned to ANY from ANY-EXP. Pseudo-random amount of time added to reporting interval to prevent convergence of TCP connections. Logging: Removed "<file>@<line>" field from "error" module log messages unless logging-level is DEBUG. Log messages are now prefixed with priority-level (e.g., NOTE, INFO). Slightly modified some log messages. Portability: Replaced use of non-standard C macro EPFNOSUPPORT in rpc(3) subpackage with EAFNOSUPPORT and EPROTONOSUPPORT. Necessary to support building under Tiger version of MAC OS X. Replaced use of non-standard "h_addr" member of "hostent" structure with use of "h_addr_list[0]" to increase portability. Added "-lxnet" to LIBS on HP-UX 11 systems when in 64-bit mode. 6.3.1.0 Removed the ldmprods(1) utility from the package because it uses the *.stats files produced by the (now nonexistant) pqbinstats(1) utility. User's should use the rtstats(1) utility for reporting statistics. *Really* removed pqbinstats(1) directory from the distribution. Fixed bug in pqact(1) that prevented decoders from writing to the logfile specified by the "-l" option. 6.3.0 2005-03-18 Added "-I ip_addr" option to LDM server. This allows the user to specify what network interface the server should use and enables 1. Construction of director/server clusters. 2. Running two LDM servers on the same host simultaneously. Added $ip_addr variable to ldmadmin(1) configuration-file, ldmadmin-pl.conf, and modified ldmadmin(1) accordingly. Added "--enable-logging=localn" option to configure(1) script to support the use of a different logging facility and permit the running of two LDM-s simultaneously. Removed sending of final statistics from rtstats(1)'s cleanup handler to avoid hanging the program if the remote host is unavailable. Added printing of IP address to "ldmadmin config" command. Removed "pqbinstats" directory from distribution and eliminated "ldmadmin dostats" command. Added "-P port" option to pqing(1) manual-page. Added "ulogger" to GARBAGE macro in ulog/Makefile so that the program will be removed by a "make clean" or "make distclean". Corrected misspelling in ldmadmin-pl.conf. The standard error stream of child processes executed by pqact(1) PIPE actions is directed to "/dev/null" in the child processes if it was closed in the pqact(1) process. 6.2.1 2005-02-18 Added "1;" to the end of the ldmadmin(1) configuration-file, ldmadmin-pl.conf, so that setting $log_rotate to zero wouldn't cause the "require" statement in ldmadmin(1) to abort. Added RELEASE_NOTES to the source-distribution. Modified LDM configuration-file parser to prevent invalid entries like REQUEST IDS/DDPLUS .* host.domain from being misinterpreted as requesting data-products of feedtype "IDS" that match the regular-expression "/DDPLUS". Such entries are now detected as being invalid. Fixed the (deprecated) command "ldmadmin dostats" by correcting the invocation of the "mailpqstats" utility. Fixed extraneous memory-freeing in rtstats(1) that caused SIGABRT on Linux 2.6.10 system if the receiving LDM didn't want the data-products. 6.2.0 2005-02-01 Added "rpc" subpackage -- replacing use of the native RPC library -- to work-around a bug in the AIX 5.1 ONC RPC 4.0 implementation, which fails when receiving large (~10 MB) RPC messages (i.e., most NIMAGE data wasn't being received). Modified product-queue (pq) module: Corrected bug in pq(3) module when inserting a data-product that has the same insertion-time as an already existing data-product. The insertion-time in now incremented by one microsecond to ensure unique keys in the time-map rather than using the byte-offset of the data-product. Hopefully, this will eliminate the rare occurrence in which a data-product is missed by a product-queue reader because it has the same insertion-time as the previous data-product in the product-queue but has a smaller byte-offset. Corrected fClr() and fMask() macros in file "pq/fbits.h" so that they correctly handle the case where the "flag" variable is smaller than the variable in question. This removes a problem creating product-queues with data-sections larger than (2^32)-1 bytes on systems where sizeof(size_t) == 8 and sizeof(unsigned) == 4. Made all programs that use regular-expressions convert all externally-specified pathological regular-expressions into non-pathological ones. Modified top-level LDM server: Removed latent bug that caused file-descriptor table to fill-up -- preventing additional connections -- if fork(2)s failed for a while. Corrected bug in LDM configuration-file parser. The LDM will now log an error-message and terminate if it encounters an invalid feedtype expression. Modified downstream (i.e., receiving) LDM: Changed the way the "last" data-product creation-time is saved. Before, the creation-time of the most recently received data-product was used. Now, that time is used only if it is more recent than the saved time. This should reduce problems caused by the sequential arrival of data-products with creation-times that are non-monotonic. Modified down6_get_last_arrival() to accomodate Gilda's c89(1). Improved error-messages when the LDM can't connect to an upstream LDM. Modified programs to reduce artificially-induced latencies: Modified the toClients() function in the "pqing" module so that the "arrival" argument is ignored and the creation-time of the data-product is set within the function itself. This should reduce the (apparent) latency on systems doing data-product ingestion. Modified the pqinsert(1) utility so that the data-product creation- time is set just prior to inserting the data-product into the product-queue. This should reduce any (apparent) latency. Modified pqact(1). A configuration-file with no entries is now logged as such rather than as having a syntax error. Modified rtstats(1): A warning-level error-message is logged if it can't connect to the remote LDM. The latency field in the data-product it creates is now formatted "%g" from a floating-point value. Modified pqcheck(1). Added support for logging debug-level messages (-x option). Modified scour(1) utility to work-around bug in OSF1's find(1) utility. Ensured that all utilities log messages of level LOG_WARNING. Modified ldmadmin(1) script: Moved the configuration section of ldmadmin(1) into a separate file (etc/ldmadmin-pl.conf). A consequence of this is that if the environment variable LDMHOME is not set, then $HOME is used. Removed setting of UDUNITS_PATH because it doesn't have anything to do with running the LDM. User's who need this environment variable set in order for the gribtonc(1) decoder to work properly should set it in the profile-file of the LDM user's user-shell. Corrected default value of $surf_size variable. Previous value of "2M" caused command "ldmadmin mksurfqueue" to hang. Fixed bug in ldmadmin(1) so that "ldmadmin watch -f 'IDS|DDPLUS'" now works. Made "ldmadmin clean" abort if the LDM system is running. Corrected use of "$?". Corrected some error-messages. Added scouring of ~ldm/logs/*.stats files to example scour(1) configuration-file. Ported package to Darwin (alias Mac OS X) SunOS 5.10 (alias Solaris 10) The package has poor performance under SunOS 5.10. Sun is investigating. Modified configure(1) script: Made the script try to create an LDM system that supports product-queue sizes up to (2^32)-1 bytes. Added "--disable-max-size" option so that the user can ensure that the resulting LDM only supports smaller product-queue sizes (in order to use a previously-existing product-queue, for example). Corrected test for non-socket /dev/log. Now augments, rather than replaces, a user-specified CPPFLAGS. Modified makefiles: Modified top-level makefile to get libldm.a(ldm_version.o) updated when VERSION is modified. "make clean" no longer removes *.log files; "make distclean" does. Removed files INSTALL and INSTALL.bin from distribution after moving their information to file README. Renamed this file (HISTORY) to CHANGE_LOG. 6.1.0 2004-08-25 Modified the product-queue module (pq): Made available 4 data-product slots that were, otherwise, unvailable. This means that the minimum number of empty slots can now go to 0. Added a writer-counter variable to the product-queue file. Opening the product-queue for writing increments the on-disk value and closing the product-queue decrements it. This allows for a fast determination of whether the product-queue was properly closed and, consequently, self-consistent. As a consequence, the script for starting the LDM system at boot-time has changed significantly (see the pqcheck(1) utility). Furthermore, ALL INGESTERS MUST BE RELINKED AGAINST THE NEW LDM LIBRARY FOR THE NEW CONSISTENCY-TEST TO BE RELIABLE. Creation of a product-queue file now fails if the requested size of the file (which is contained in an "off_t") is too large to be represented by variables of type "size_t". Modified the LDM server (rpc.ldmd): Modified setting of "from" time in downstream LDM for the data-product selection criteria. Now, it will not ever request any products that are older than the "time offset" argument of the "-o" option if it was specified or the "maximum latency" argument of the the "-m" option (default 1 hour) otherwise. Before this change, a downstream LDM could request data-products that were much older than this if the upstream LDM was unavailable for a long time. Added a 1 second pause before an upstream LDM first starts sending data-products or notifications to a downstream LDM. This prevents, for example, a HEREIS packet arriving contiguously with a FEEDME reply and works around the poor RPC implementations of some operating systems. Modified the pqact(1) utility: Added a work-around for the non-conformance of OSF/1 regarding the SA_RESTART option of sigaction(). On such an operating-system, a write to a pipe by pqact(1) could be terminated by a signal (e.g., SIGCHLD) causing the data-product to be incompletely processed. Increased the maximum number of file descriptors that can be simultaneously open from "32" to something based on the output of "getconf OPEN_MAX". Corrected examples in configuration-file (pqact.conf). Modified the pqcreate(1) utility: it now interprets the specification of the size of the product-queue by pqcreate(1) differently. Previously, a "K", "M", or "G" suffix would mean "kibi", "mibi", or "gibi" (powers of two nearest 1e3, 1e6, or 1e9); now it means "kilo", "mega", or "giga". This now makes "4000M" equal to "4G", whereas before they were different. Modified the ldmadmin(1) script: Added the command "restart". Added the options "-m maxLatency" and "-o offset" to the "start" command (the "restart" command also has these options). Added the variable $pq_slots. This variable sets the number of data-product slots in the LDM product-queue. Modified the interpretation of the specification of the size of the product-queue to be consistent with the pqcreate(1) modification, above. Greatly increased the performance of the "ldmadmin queuecheck" command by switching from use of pqcat(1) to use of pqcheck(1). Removed the "ps" command because there are just too many ps(1) implementations out there that differ from the UNIX standard and from each other (and the same computer can have incompatible versions). The "watch" and "queuecheck" commands now first check that the LDM system is running. Added printing of $numlogs and $log_rotate to the "ldmadmin config" command. Modified the scour(1) utility: Greatly improved performance -- mostly by using xargs(1). Removed package-specificity from examples in configuration-file (scour.conf). Modified the ulog(3) module: it no longer appends an ASCII NUL to messages when logging to a file. Changed the feedtype-string that is printed for NEXRAD Level II data-products from CRAFT to NEXRAD2. The strings CRAFT, NEXRD2, and NEXRAD2 can all be used to specify this feedtype in configuration-files, however. Increased the maximum number of statistical-reporting bins in the "binstats" module (which is used by rtstats(1) and pqbinstats(1)) from 96 to 4000 to eliminate underreporting problem now that more than 96 CRAFT radars exist. Corrected manual pages. Removed all references to the LDM 5 "Site Manager's Guide". Replaced references to "http://www.unidata.ucar.edu" with references to "http://www.unidata.ucar.edu/software/ldm/" 6.0.15 2004-03-31 Added code to work-around TCP bug introduced by patch APAR IY38541 for the AIX operating-system. This patch is included in maintenance-level 11 of AIX 4.3 and maintenance-level 5 of AIX 5.1. The bug makes TCP connection non-blocking, causing upstream LDM to exit due to "resource temporarily unavailable". With this work-around, LDM6-s running on the above AIX systems will be able to send data-products to requesting downstream LDM6-s. They will not, however, be able to satisfy requests by downstream LDM5-s. Also, the same O/S upgrades introduced an, apparently, related bug in the TCP layer that causes the connection from a downstream LDM running on the upgraded O/S to an upstream LDM to episodically dissapear. The upstream LDM reports a "broken pipe" and the downstream LDM reports that the connection to the upstream LDM "closed". This problem will be reported to IBM. The above bug also causes a connection from a downstream LDM running on the upgraded AIX system to episodically close for no apparent reason. Consequently, the reconnection strategy of a downstream LDM-6 has been modified to be more aggressive (i.e., to try to reconnect earlier) but with an exponential backoff to the default maximum of 30 seconds. 6.0.14 2003-07-21 6.0.14.7 Made test of pqact(1) configuration-file upon LDM startup conditional upon its existance. 6.0.14.6 Fixed bug in downstream LDM 6 introduced in version 6.0.4: under some circumstances, a failed FEEDME or NOTIFY request wouldn't cause the connection to be closed and, consequently, the socket and client-handle resources to be released -- leading to a blocked, upstream LDM process with a read-lock on a product. Fixed latent bug in module "up6". Too few arguments passed to udebug(3) when a product-queue lock is encountered. 6.0.14.5 Fixed error-reporting bug. Receiving LDM-s will no longer attempt to unregister from the portmapper -- eliminating the possibility of disconcerting (but harmless) "pmap_unset()" failure messages. Modified the LDM so that a SIGUSR1 causes the pseudo-random number generator in the product-queue module to be reset. Improved robustness of the rtstats(1) utility in the face of bad clock times (e.g., CRAFT data). This should prevent rtstats(1) from opening multiple connections in the same minute. THIS IS A BIG DEAL. 6.0.14.4 Ported package to HP-UX B.11.11 U. Changed the effect of a SIGTERM to the top-level LDM process: it now sends a SIGINT to all child processes in order to exit in a more timely manner. Eliminated use of the word "class" as a variable name to accomodate C++. Modified LDM 6 product-sending code so that it checks the connection if it hasn't sent anything for 30 seconds. This should help prevent the buildup of upstream processes. Added a check of the syntactic validity of the pqact(1) configuration-file to the "ldmadmin start" command to help the user who changes the configuration-file without checking it. 6.0.14.3 Partially ported package to HP-UX B.11.11 U. Added observance of "done" flag to module ldm_clnt -- resulting in more responsive termination of an LDM system that is attempting to connect to an upstream LDM. Modified module acl accordingly. 6.0.14.2 Made the IS_ALIVE check on the upstream LDM more tolerant of connection failures. This should reduce the number of unnecessary reconnections. Improved error-logging of LDM 6 connection attempts. If an attempt fails, a error-message will be logged at the ERROR level. The reason or reasons behind the failures of the port 388 and portmapper attempts are logged at the INFO level. 6.0.14.1 Fixed memory-leak in receiving LDM process. When receiving from a sending LDM 6, the memory-usage of the receiving process would sometimes jump by about 250 kilobytes if the connection was broken and then re-established. 6.0.13 Fixed a small memory-leak bug in the utility rtstats(1). If the destination LDM was version 5, then it would leak about 37 bytes per transmission. Modified the file-existance tests in ldmadmin script so that they will work on systems (e.g., Linux) that would, otherwise, require a perl utility with compiled-in support for large-files. 6.0.12 Modified strategy for determining which program version is used when connecting to an upstream LDM (version 5 or 6): a downstream LDM will now connect using version 5 if and only if a previous version 6 connection attempt receives a program version mismatch indication (RPC_PROGVERSMISMATCH). This should eliminate the possibility of a downstream LDM-6 connecting to an upstream LDM-6 using LDM-5 protocols during the "window of vulnerability" that exists when the upstream LDM system is started. Changed downstream LDM code so that it doesn't sleep before reconnecting to the upstream LDM when the connection is closed due to a timeout. This will reduce the magnitude of product latencies due to connection timeouts at the cost of more log messages. Synchronous checks have been added in several places to make the LDM more responsive to a termination request (such as from an "ldmadmin stop"). To work around a bug in Unisys ingest systems, the program pqing(1) has been modified to allow an extraneous newline between the end-of-product and beginning-of-product delimiters. 6.0.11 Requesting LDM process will no longer terminate if the connection to the upstream host is so bad that it can't connect in any fashion or if an LDM isn't running on that host. Instead, it will continue to retry. 6.0.10 Corrected bug in make_request() in module requester that caused "wanted" and "allowed" product-class specifications in diagnostic RECLASS message to be the same. Corrected bug in feed_or_notify() in module ldm6_server that caused "wanted" and "allowed" product-class specifications in diagnostic "Restricting request" message to be the same. Demoted logging-level of rtstats(1) "couldn't connect" message from ERR_FAILURE, to ERR_WARNING to lessen user anxiety. 6.0.9 Corrected bug in make_request() that caused assertion failure in xdr_timestampt() because the timestamp was part of the RECLASS reply and the product-class of the reply had been XDR freed (setting its timstamps to TV_NONE). 6.0.8 Replaced premature return from ldm_clnt_create_vers() use of NULLPROC for RPC error-code not being a program version mismatch to being a time-out. 6.0.7 Fixed SIGSEGV bug in ldm_clnttcp_create_vers() and improved error messages. 6.0.6 Reimplemented ldm_clnt() to solve rtstats(1) connection problem. 6.0.5 Fixed slight memory-leak bug in rtstats(1) and ldmsend(1). 6.0.4 Corrected use of hereis_6() and comingsoon_6() by programs rtstats(1) and ldmsend(1). They should now be able to send to an LDM 6. 6.0.3 Improved diagnostic messages in which_version(). Made "ldmadmin pqactcheck" return a failure exit-status if the configuration file contains a syntax error. Generalized receiving LDM: now accepts multiple BLKDATA messages for a product. A downstream LDM no longer adjusts the time-interval of acceptible data products when replying to a HIYA. Duplicate product detection is still in effect. This prevents rejection of data products sent using ldmsend(1) by a host with an inaccurate clock. It also places the burden of knowing what to send on the upstream HIYA- initiating LDM. Fixed bug that prevented the maximum hereis size field of ACCEPT entries in the LDM configuration-file from having an effect. Ported the ldmsend(1) and rtstats(1) utilities to LDM-6 protocols: they can now send to a version 6 LDM. Added HTML documentation as a separate distribution. 6.0.2 Restored use of "done" flag and removed atexit() registration of down6_destroy(). Removed child-process-termination loop from ldmd.c in attempt to keep product-queue consistent (pqcat -s). Eliminated excessive delay caused by portmapper-access functions on a FreeBSD system than isn't running a portmapper. Fixed bug due to copying HEREIS product identifier to garbage pointer in down6 module. 6.0.1 Ensured release of COMINGSOON_6-reserved space in product-queue upon normal termination by modifying down6 module: 1) made down6_destroy() idempotent; and 2) registered down6_destroy() with atexit(). Hopefully, this will fix the "pqcat -s" failures. 6.0 Changed default CFLAGS from "-g" to "-O". Reworked build procedure. No more Makefile.in-s. Added commentary about pathological regular expressions to template "ldmd.conf" file. Added sync(1) invocation to "ldmadmin stop". Regularized compiler-command word-order. Made module child_process_set a singleton and made free(3)ing of pid_t element more robust (it might have been causing a SIGSEGV under Linux). Have duplicate products update the most-recent-product time of a connection in both LDM-6 and LDM-5 receivers. 6.0.0.18 Fixed incorporation of regex/ subdirectory into build procedure. 6.0.0.17 Added regex(1) utility. Rearranged blocked-signals reversion steps in pq::ctl_get() to maintain invariants. Changed RPC timeout from default 25 s to 60 s. 6.0.0.16 Added warning message if flushing NULLPROC-6 fails in "up6" module. 6.0.0.15 Added "tags" target to pq/Makefile.in. Replaced 7 d timeout of non-batched (i.e., blocking) LDM-6 RPC messages with default, 25 s timeout to avoid situation in which a sending LDM is trying to read the reply of a flushing NULLPROC call and the receiving LDM is in select() waiting for an incoming RPC message. This "netlock" situation was seen on 2003-02-7 between two sending LDMs on Jackie and two receiving LDMs on Thelma for the IDS|DDPLUS and NNEXRAD feeds. (Bad RPC! No doughnut!) 6.0.0.14 Ported to OSF/1. Added an additional criterium to the function is_upstream_alive() for assuming that the sending LDM is still alive: if the client-side handle can't be created due to a time-out of the connection attempt (RPC error == RPC_SYSTEMERROR && system error == ETIMEDOUT). 6.0.0.13 Simplified xdr_data module and its use based on assumption of valid client-usage. It was this or find every error-condition where xd_free() or xd_unset_buf() wouldn't be invoked. Corrected use of xdr_data module. 6.0.0.12 Corrected use of "xdr_data" module. Problem. 6.0.0.11 Increased use of "xdr_data" module: Modified modules "down6" and "svc5" to use "xdr_data" module for COMINGSOON/BLKDATA messages. Modified file "ldm.x": replaced generation of xdr_dbuf() by rpcgen(1) with explicit definition that uses the "xdr_data" module. Problem. 6.0.0.10 Added module "xdr_data" and modified xdr_product() to use it. 6.0.0.9 Made SIGTERM handling the same as SIGINT. 6.0.0.8 Made updating of timestamp of most recently received HEREIS product by LDM-5 subsystem not depend on whether logging level is verbose. 6.0.0.7 Tried to reduce backward searches through product queue when connecting to upstream LDM: Added tracking of last-received product to both LDM-5 and LDM-6 receiving subsystems and the use of this information when requesting data from an upstream LDM. Moved backward search through product queue, looking for most recent matching product -- from inside connection-loop of acl::prog_requester() to before connection-loop. Added dummy feedTime module and invocations. Changed connection strategy to favor port LDM_PORT over the portmapper. Corrected ldmsend(1) and LDM-6 HIYA behavior. 6.0.0.6 Removed indictment of upstream LDM from LDM-6 ECONNRESET error-message. Added debug-printing of time from product-creation to insertion into the product-queue to pq_sequence(...). 6.0.0.5 Reduced logging-level of initial and final messages of upstream LDM. 6.0.0.4 Added "CRAFT" and "CONDUIT" to the list of feedtypes and made them the default string specifications for output. 6.0.0.3 Changed SIGTERM logging-level from udebug() to unotice() to reveal cause of "Terminating process group" messages. 6.0.0.2 Corrected setting of _mode in down6 regarding IGNORE_BLKDATA.
ldm-users
archives: