MOO-cows Mailing List Archive
[Prev][Next][Index][Thread]
ALPHA release of LambdaMOO server 1.7.9
I have just released version 1.7.9alpha1 of the LambdaMOO server to the usual
location:
ftp://ftp.parc.xerox.com/pub/MOO/LambdaMOO-1.7.9alpha1.tar.Z
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.
Pavel
-------------------------------------------------------------------------------
>From the README file:
-------------------------------------------------------------------------------
***WARNING***
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
$server_options.max_stack_depth.
-- 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)
return;
endif
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.
-------------------------------------------------------------------------------
Follow-Ups:
Home |
Subject Index |
Thread Index