MOO-cows Mailing List Archive


ALPHA release of LambdaMOO server 1.7.9

I have just released version 1.7.9alpha1 of the LambdaMOO server to the usual

Please note that there are a number of places in the ChangeLog.txt file,
reproduced below, that describe changes you must make to your database BEFORE
upgrading to this one; these changes are all marked with the string `NOTE'.

Also, please note that this is an ALPHA release of the software, as described
in the README file.


>From the README file:

This is an ALPHA release of version 1.7.9 of the LambdaMOO server.  It was
intended to be a normal release, but in the very last stages of our testing we
ran into some bugs in RX, the new implementation of the match() and rmatch()
built-in functions.  We fixed the bugs we found, but this has sufficiently
shaken our confidence in the new code that we would like to get a lot of field
testing before making a real release.

We do *not* recommend that you use this release in a production setting at the
current time.  We *do* request that you try out as many as possible of your
existing uses of match() and rmatch() under this release and let us know (via
the MOO-Cows@Xerox.Com mailing list) of any problems you encounter.  With luck,
no problems will come up and, after waiting a few weeks, we can re-release this
code as a normal, non-alpha release.

Thanks for your assistance.

>From the ChangeLog.txt file:
Version 1.7.9alpha1, 25 September 1995
-- Fixed a few minor configuration and portability problems.
-- Fixed a potentially server-crashing bug in subrange assignments.
-- Renamed the internal server function `log()', to avoid name conflicts with
   the logarithm function in the math library.
-- Changed the name-lookup subsystem to be more optimistic about the chances of
   eventually recovering from an earlier failure to restart the lookup process.
   Also bullet-proofed it against problems with its read() calls getting
   interrupted by the checkpoint timer.
-- Added a paragraph to `README' explaining how to boost the limit on the
   number of connections a server can support.
-- Added two new built-in functions enabling faster case-sensitive tests:
	equal(X, Y) returns true iff the values X and Y are completely equal,
          including the case of any strings they might contain; this is just
	  a case-sensitive version of the `==' expression.
	is_member(X, L) is a similarly case-sensitive version of `X in L'.
-- Made the `.program' built-in command wiz-only if
   $server_options.protect_set_verb_code exists and is true.
-- Added the built-in function `set_connection_option(CONN, OPTION, VALUE)',
   for controlling various optional behaviors on the connection CONN.  The only
   allowed values for OPTION in this release are as follows:
	"hold-input" -- if VALUE is true, then input received on CONN will
	    never be treated as a command; instead, it will remain in the queue
	    until retrieved by a call to read().
	"client-echo" -- (NP_TCP configurations only) sends the Telnet Protocol
	    WON'T ECHO or WILL ECHO commands (depending on whether VALUE is
	    true or false, respectively).  For clients that support the Telnet
	    Protocol, this should toggle whether or not the client echoes
	    locally the characters typed by the user.  Note that the server
	    never echoes input characters under any circumstances.
-- Fixed stupid bug that let people lose by setting $server_options.fg_ticks
   and company to negative values.
-- Added an optional second argument to the `read()' built-in function.  If it
   is provided and true, then this call to `read()' will not suspend the
   calling task under any circumstances.  If there is input currently
   available, it will be returned immediately; otherwise, `read()' returns 0.
   (As before, if no input is available and no more is coming, `read()' raises
   E_INVARG as an end-of-input indicator.)
-- Added flow-control to the server's input-handling: if more than a reasonable
   amount of unprocessed input accumulates for any connection, the server will
   temporarily stop trying to read from that connection at all, until the
   backlog drops down substantially.
-- Fixed a longstanding bug in match() that could make it return garbage in
   certain circumstances.  More bugs in match() almost certainly still exist.
   (Thanks to Judy Anderson for finding this.)
-- Fixed a minor memory leak in the case where #0:do_command() exists and
   returns a list or string value.  (Thanks to Ian Macintosh for finding this.)
-- Fixed a possible race condition in the TCP networking code, where a timer
   could go off before we've installed the exception handler.  (Thanks to Alex
   Stewart for finding this.)
-- Officially deprecated the USE_GNU_MALLOC option in options.h, since it's not
   aging very well.
-- Completely replaced the regular-expression matching implementation that
   underlies match() and rmatch(); it used to be the GNU `regex' package and is
   now the GNU `RX' package shipped with GNU `sed'.  This may not eliminate all
   bugs in match(), but it almost certainly has moved them around a bit.
   ********** The old GNU regex package had a bug in its handling of certain
   ** NOTE ** patterns with parentheses in them, and it is reasonably likely
   ********** that many MOO programmers have, perhaps unconsciously, come to
   depend upon this buggy behavior.  Unfortunately for such programmers, RX
   does not have this bug, so you will want to fix your regular expressions
   before upgrading to this release; the fixed patterns will work correctly on
   both releases.
     The old bug concerns patterns of the form `%( ... %)*', that is, a starred
   parenthesized sub-pattern; for example, consider the MOO expression
	match("foo", "%(o%)*")
   Using the old regex package, this returns
	{2, 3, {{2, 3}, {0, -1}, ...}, "foo"}
   which is *wrong*; the last successful match of the parenthesized sub-pattern
   covered just the third character, not the second and third ones.  Using the
   new RX package, this expression returns the proper value:
	{2, 3, {{3, 3}, {0, -1}, ...}, "foo"}
   To get the effect of the old bug, you need another set of parentheses around
   the whole starred sub-pattern:
	match("foo", "%(%(o%)*%)")
   Under both GNU regex and RX, if M is the result of this expression, we have
	M[3][1] == {2, 3}
   You should look carefully at your uses of match() and rmatch() before
   upgrading to this release, fixing those places where your code depends on
   the old, buggy behavior.
-- Added an optional third argument to the built-in function notify(); if it is
   provided and true, and if there isn't enough room left in the given user's
   output buffer to hold the given line, then notify() will return false and
   the line will not have been queued for output.  In all other circumstances,
   notify() now returns true.  If the new optional argument is false or not
   provided, then the old behavior is invoked, in which some of the
   already-queued output is discarded to make room for the new line.
-- Made it possible to change the maximum verb-call depth from inside the DB.
   The MAX_VERB_DEPTH constant in options.h was replaced by
   DEFAULT_MAX_STACK_DEPTH, which can be overridden by
   $server_options.max_stack_depth.  The maximum stack depth for any task is
   set at the time that task is created and cannot be changed thereafter.  This
   implies that suspended tasks, even after being saved in and restored from
   the DB, are not affected by later changes to
-- The task scheduler is now guaranteed never to assign a task_id() of zero.
-- The built-in functions notify(), connected_players(), connected_seconds(),
   idle_seconds(), connection_name(), and set_connection_option() now treat
   connections on which boot_player() has been called as if they did not exist.
-- A number of the messages printed to a connection by the server under various
   circumstances can now be customized or eliminated from within the DB.  In
   each case, a property on $server_options is checked at the time the message
   would be printed.  If the property does not exist, the standard message is
   printed.  If the property exists and its value is not a string, then no
   message is printed at all.  Otherwise, the string is printed in place of the
   standard message.  The following list covers all of the newly customizable
   messages, showing for each the name of the relevant property on
   $server_options, the default/standard message, and the circumstances under
   which the message is printed:
	timeout_msg	      "*** Timed-out waiting for login. ***"
		This in-bound network connection was idle and un-logged-in for
		at least CONNECT_TIMEOUT seconds (as defined in options.h).
	recycle_msg	      "*** Recycled ***"
		The logged-in user of this connection has been recycled.
	boot_msg	      "*** Disconnected ***"
		The function boot_player() was called on this connection.
	redirect_from_msg     "*** Redirecting connection to new port ***"
		The logged-in user of this connection has just logged in on
		some other connection.
	redirect_to_msg	      "*** Redirecting old connection to this port ***"
		The user who just logged in on this connection was already
		logged in on some other connection.
	create_msg	      "*** Created ***"
		The user object that just logged in on this connection did not
		exist before #0:do_login_command() was called.
	connect_msg	      "*** Connected ***"
		The user object that just logged in on this connection existed
		before #0:do_login_command() was called.
-- The `for VAR in [EXPR..EXPR]' looping construct can now be used with either
   numbers or object numbers.  That is, the construct `for o in [#0..#100]' is
   now legal and does the obvious thing.  NOTE that in the example `o' will
   take on each of 101 object numbers in the specified range, regardless of
   whether or not those object numbers are valid.
-- By popular request, added the built-in function `value_bytes(VALUE)', which
   returns the number of bytes of memory required to store the given value.  [I
   was also asked to provide an `object_bytes(OBJ)' function, to give the total
   memory required to store the given valid object, but I wanted to think
   longer about possible interactions with 1.8.0's new modularity wall between
   the DB implementation and the rest of the server.]
-- At long last, there is a DB-settable limit on the number of queued tasks any
   single user can have at once.  If $server_utils.user_task_limit exists and
   is a non-negative number, then that is the `task limit' for normal users;
   otherwise, the task limit is infinite.  For wizards, the task limit is
   controlled similarly by $server_utils.wizard_task_limit.  Whenever a `fork'
   statement or `suspend()' call are executed, the server checks whether or not
   the current verb's owner (really, the current task perms) is already at or
   above their task limit; if so, E_QUOTA is raised instead of either forking
   or suspending.  Reading tasks are not affected by the task limit.
-- The result of `tostr(E_QUOTA)' has been changed to the string
   "Resource limit exceeded".
-- Applied Alex Stewart's pAS4 patch, which modifies the result of the
   built-in function `connection_name()' on TCP networking configurations to
   contain the remote port of the connection as well as the host name, in the
   following format:
		"99 from FOO.BAR.COM, port 9999"
   As before, the first number in the result is pretty useless to MOO
   programmers (it's the server's file descriptor for the connection) but can,
   believe it or not, occasionally be useful to the maintainer.
   ******** Before upgrading an existing MOO to use this version of the server,
   * NOTE * you should modify the verb $string_utils:connection_hostname_bsd as
   ******** follows:
		@chmod $string_utils:connection_hostname_bsd -d
		@program $string_utils:connection_hostname_bsd
		s = args[1];
		return strsub($string_utils:explode(s)[3], ",", "") || "";
   This code should work compatibly with either version of the server.
-- Applied the key part of Alex Stewart's pAS7 patch, which fixes a problem
   with the server occasionally hanging under Sun's Solaris 2.X system.  [I
   just removed the (useless) call to `shutdown()'; the SO_LINGER setting
   didn't seem necessary or very useful.]
-- Added a new item to options.h, UNFORKED_CHECKPOINTS (off by default), that
   prevents the server from forking a separate process to make checkpoints;
   instead, the main server process performs the checkpoints itself, halting
   all user interaction and MOO task execution for the duration.
-- Made the server's log output during the initial database load *slightly*
   easier to understand.
-- Removed perhaps the last hard limit in the server; you can now have input
   lines with more than 500 words on them.  (Thanks to Bill Drury for sending
   the message to MOO-Cows that finally got me to fix this longstanding bug.)
-- Disallowed empty verb names and those made up only of spaces.
-- Added a new built-in function `toliteral(VALUE)' such that
	eval("return " + toliteral(VALUE) + ";") == {1, VALUE}
   for all MOO values.
-- The `create()' built-in function will now create children of #-1.
-- Added an `emergency wizard mode' to the server's start-up sequence; if you
   give an initial `-e' option on the command line, then after loading in the
   database but *before* running #0:server_started(), the server will use its
   standard input and output streams to allow execution of wizardly `eval'
   commands and re-programming of verbs.  For more details, type `help' from
   inside the mode.
-- The verbs #0:user_disconnected() and #0:user_client_disconnected() are now
   called for un-logged-in and outbound connections, too, just as they are for
   logged-in ones.
   ******** Before upgrading an existing MOO to use this version of the server,
   * NOTE * you should check your versions of these verbs to ensure that they
   ******** will work appropriately when passed negative (and therefore
   invalid) object numbers.  In most cases, it is probably sufficient to add
   the following lines to the top of these verbs:
		if (args[1] < #0)
   This code should work compatibly with either version of the server, since
   these verbs weren't being called with such object numbers before.
-- The server now saves, in the DB file, a list of all users with active
   connections at the time of the checkpoint, shutdown, or panic that made the
   file.  Upon server start-up, if such a list is present in the DB file, a
   call is made to #0:user_disconnected() for each formerly active connection.
   These calls are made *before* the call to #0:server_started().  In this way,
   there are no longer any discontinuities across a server reboot; from the
   point of view of code in the DB, the only evidence of a reboot is that,
   first, a relatively long time has passed since the last task execution,
   second, all connections to the server (in-bound or out, logged-in or not)
   have simultaneously been closed, and third, #0:server_started() has been
   called by the server.
-- Fixed RX to do reverse-searching properly, so now rmatch() works again.
   Also added a abort-check in the searching inner loop for the MOO interpreter
   having run out of seconds.


Home | Subject Index | Thread Index