[comp.sys.isis] Process groups as network-level objects

abbott@aero.org (Russell J. Abbott) (04/30/91)

In developing a mental model for myself of what ISIS provides, I came up
with the following.  I haven't seen this in any of the ISIS literature,
although that may simply mean that I haven't read enough of it.

A nice conceptual model for a process group would seem to be
network-level object.  ("Distributed object" is an alternative term, but
I prefer "network-level object" or perhaps just "network object.")

The term "object" seems appropriate since process groups include
processes that define responses to messages.  In addition, each process
group has (or may be built so that it has) a single internal state.

The term "network-level" also seems appropriate since process groups are
not defined in terms of their residence on any particular processor.
Instead they (are able to) use the resources of whichever processors are
available.

Network-level objects differ from traditional objects in another way
also.  They are capable of internal concurrency.  Notwithstanding their
internal concurrency, however, they (are able to) maintain a consistent
state.

It seems to me that the notion of a network-level object would be quite
attractive to anyone interested in implementing network level services.
Most network resource servers (as distinct from something like an X
server on a particular display) can probably be conceptualized quite
nicely as a network object.  The ISIS claim that virtual synchrony is
central to much of what goes on in distributed computing would be made
very concrete in this way.

Since I have done nothing to help in the conceptualization or
development of ISIS, I suppose it is gratutious of me make the following
suggestion, but here it is anyway.  (I guess "gratuitous" applies in
both senses.)

It seems to me that the term "process group" is misleading and
unsuggestive for potential ISIS users.  It would be better to present
ISIS as providing a network-level object capability as suggested above.
Process groups may then be seen as the (internal) mechanism that allows
for this capability.

With the preceding in mind, I would also recommend that ISIS do more to
enforce (or at least strongly recommend) consistency among processes
within process groups so that a process group will (unless explicitly
defined otherwise by a user) consist of processes that implement
network-level objects.  I imagine, though, that the issue of
intra-process group consistency is one that the ISIS group must have
debated.  I wonder why you made the decision not to go in that
direction.

-- Russ Abbott@itro3.aero.org

rcbc@cs.cornell.edu (Robert Cooper) (04/30/91)

In article <1991Apr29.205624.17754@aero.org>, abbott@aero (Russell J. Abbott) writes:

>With the preceding in mind, I would also recommend that ISIS do more to
>enforce (or at least strongly recommend) consistency among processes
>within process groups so that a process group will (unless explicitly
>defined otherwise by a user) consist of processes that implement
>network-level objects.  I imagine, though, that the issue of
>intra-process group consistency is one that the ISIS group must have
>debated.  I wonder why you made the decision not to go in that
>direction.
>
>-- Russ Abbott@itro3.aero.org

Russ has some good points. I've always thought that Isis programs were a
bit prone to errors of inconsistency between group members. E.g. where one
group member joins the group specifying PG_LOGGED (to enable logging for
total resiliency) but another member neglects to do so. Another example is
where an entry must be called using abcast to ensure correct semantics of
the application.

One idea we've been bouncing around for a while without actually
implementing it is the following:

(1) Entry numbers are on a per-group basis. Currently entry numbers
a global, or at least process-wide, rather like RPC procedure numbers.
Instead, entry numbers would be unique only within a group. Among other
things this would make management and allocation of entry numbers easier
for programmers. There would continue to be a process-wide entry numbers
for compatability purposes though.

(2) Associated with a group entry number would be some attributes,
including "Ordering" which would specify ABCAST or CBCAST (or either I
suppose). Other attributes would include something I call "Extent" which
says how many group members the bcast should be sent to (e.g. all,
majority, one), and "Replies" which says how many replies should received
before considering the bcast to have succeeded (e.g. all, one etc.).

(3) Groups would also have attributes specifying options such as 
PG_LOGGED that are currently specified as arguments to the group join
operation. Other attributes come to mind, such as a minimal and optimal
number of group members.

These attributes would be enforced as follows:

Group attributes would be defined by the first process to join the group,
in its arguments to the pg_join operation. Also there would be
an isis_group_entry routine that would take a list of entry attributes.
These group and entry attributes would be bundled up into a piece of group
state that would be transferred to other group members as they join. If
those members violated these attributes, i.e. they specified incompatible
arguments to their own pg_join and isis_group_entry operations, then they
would be prevented from completing their join to the group. 

These group and entry attributes would perhaps be specified in some group
interface language. However, the above proposal does not rely on any
one interface language, leaving us free to fit in with different interface
languages. One example language is the IDL language developed by 
ANSA/ISA project in Cambridge England. Currently we have a visitor at our
group from that project, so you may see some activity in this area.

                         -- Robert Cooper

jyl@noam.Eng.Sun.COM (Jacob Levy) (04/30/91)

Russell

Robert Cooper at Cornell has been working on this issue and I
have also spent some time thinking about it. Robert has done an
initial implementation of his ideas - I'll defer to him to
describe what he has obtained so far. Here is what I've been
thinking about:

Similar to your reasoning, I also think of ISIS pgs as network
objects. There is a problem of efficiency, however. The PG
mechanism does not scale well as the number of pgs grows into
thousands. Specifically, the problem is located in the pg view
update code. Consider a process which is member of several
thousand pgs. When such a process fails, several thousand
invocations of the pg view update protocol will be run. This is a
globally synchronous (abcast) type protocol. Clearly the cost
would be prohibitive.

The solution which Robert came up with and which I embellish here
is that each process is member of several (a fixed number) of
ISIS pgs. Networked objects are mapped onto these fixed pgs and
used as a kind of "lightweight" pg. A "name service" manages the
lightweight pg namespace. As you suggest, it is important that
consistency among processes participating in a lightweight pg be
enforced so that each process indeed implements that network
object abstraction. To achieve this, we have processes register
with the name service the types of network objects they are able
to implement. The name service creates heavyweight pgs from those
processes implementing each network object, and maps network
objects to the appropriate "type" of heavyweight pg.

A lightweight pg (serving as a network object) thus consists of
the following information:

struct lightweight_pg {
	/*
	 * Where in the heavyweight pg name space is the object?
	 */
	address		heavyweight_pg;
	/*
	 * A token to identify the lightweight pg
	 */
	char		*name;
};

The problem with this solution is that it is still not scalable,
due to the presence of the name service. In order to make it
scalable, we must allow a name service to store names managed by
other name services. Thus, we store, in the lightweigth pg
structure an additional address, that of the heavyweight pg
which provides the namespace management for this network object:

struct lightweight_pg {
	address		heavyweight_pg;
	char		*name;
	address		namespace_manager;
};

The advantages are:

a. The namespace manager is the natural place to implement
   replication, persistence, storage, activation, deactivation
   etc. policies. 
b. The namespace manager can be used as a transparent fallback if
   communication with the heavyweight pg hosting the object is
   lost. The namespace server could then reactivate the object in
   another heavyweight pg.
c. Namespace managers can store names managed by other namespace
   managers. This provides scalability and allows the construction 
   of a general graph of name spaces.
d. We can hide the notion of heavyweight pgs entirely beneath
   this layer.
  
Does all this sound familiar?

--JYL