On Feb 23, 2007, at 2:38 PM, Rob Ross wrote:
Wow, I didn't think that this stuff would come up again soon :).
The current implementation (a) tracks what is free and (b) what is
recently used, (c) lets the server choose the handle to return, and
(d) keeps a global handle space (a handle is unique across all
servers).
the point of (a) was to avoid having to hit storage to find a free
handle. i agree that this is perhaps not that big a deal now that
we have a better handle on how to efficiently use berkeley db.
(a) and (c) together mean that clients never have to retry to get a
handle. i agree that in itself isn't all that valuable.
(b) ensures that clients caching metadata on some file don't end up
accessing some newly created file's data, or deleting some new
file's object, or some similar thing. this is an important part of
allowing clients to cache file metadata (specifically datafile
handles) without coordination.
(c) also allows us to precreate objects if we wanted to, although
we don't do that right now. this would be less important if/when
server-to-server communication is in place and we move file
creation over to the server side.
(d) eventually allows us to move objects around without updating
the file's metadata, assuming that we come up with a different
mechanism for determining where a file resides. A bloom filter sort
of approach might work, as an example. Or if server-to-server were
working the servers could just figure out where things are with
some aggregate comm.
walt's idea seems to allow us to map a collection of objects (a
"segment") to a given server, then a client could pick values in
that segment. my feeling is that this hamstrings our ability to
move objects around, because we would then need to move entire
segments around, as at the very least it could take a very long
time to reach a consistent state again (think of many large objects
needing to be moved; how do clients know where to contact?). this
idea is a generalization of pete's idea to have a server id be part
of the object handle; pete's approach makes it impossible to
migrate without changing file metadata. more on this below.
pete's idea of speeding up creates by guessing at free handles, is
ok, but the right way to speed up creates is to precreate. then the
latency can be hidden in the mix of other operations. lustre
already does this, and i believe it is every effective for them.
Can I try to clarify what precreate means for PVFS? There are
different pieces that can might benefit separately from pre-creation.
1. create metadata handle. requires:
a. client message to md server
b. new dspace db entry
c. new keyval db entry
2. create datafile handles. requires:
a. client message to each IO server
b. new db entry in IO server
3. setattr of datafile handles array to metadata
a. client message to md server
b. modify keyval db entry
4. crdirent to 2nd metadata server (potentially the same)
a. client message to md server 2
b. create keyval db entry
5. create bstream file (this happens on first write)
With PVFS right now (no server-to-server, etc) it should be easy to
get rid of 2a, and move 2b to the first write (with the bstream
create). All we need to do is partition the datafile handles of each
IO server to the metadata servers in the fs.conf (a sort of pre-
create). This allows the md server to pick datafile handles and do
1,2, and 3 all in one message.
If its still necessary to maintain ledgers for the datafile handles,
they can be kept on the md servers (one for each IO server), and at
initialization, we can pull the handles out from the keyval entries
to populate the ledger.
Usually when I hear pre-create I think of trying to get rid of all
those client->IOserver messages. But there's still the cost of
adding the db entries and bstream files. My guess would be that this
cost is negligible compared to the latency of sending all those
messages, but maybe on fast networks its not. We could certainly
populate the db with a bunch of entries, and keep a ledger of unused
handles, but that requires making the ledger persistent. I don't
think keeping placeholder db entries that have to be filled-in for
setattr and crdirent will be much faster than creating new ones.
There's also still the cost of the crdirent, which is a keyval db
entry create. That can't really be precreated, and its got to be
synchronous with the other creation bits.
As a first pass, partitioning the datafile handles for each IO server
up amongst the metadata servers seems like an obvious improvement,
and then when server-to-server is in place, making that partitioning
process more dynamic would be an easy add-on. My gut feeling is that
placeholder entries in the db would be significant effort to code and
isn't worth the benefit.
he is correct that randomly picking values would lead towards nasty
data structures in the ledger.
I don't see the point of keeping the ledger around (in its range
style data structure form) if we're picking values randomly.
i'd be happy to see the "free" list part of the leder disappear if
that helps. i do think that the "recently freed" list has to stay
for the reason listed above, although it could be implemented
differently perhaps -- maybe just leave an entry in the DB noting
when the object was freed, and if it is referenced again after the
appropriate time we consider it up for grabs? this has a nice side-
effect of keeping the object "off limits" even if a server is
restarted.
That sounds nice!
-sam
i don't understand why it is difficult to get a value in a
particular range in the OSD work. can you clarify this pete? can't
you just "guess" a value in the range until you get one?
one thing that we could discuss is the relative merit of migration
using this sort of approach. maybe in fact this idea that i have
that we want to keep a FS-wide object handle space is flawed, that
changing file metadata can be addressed in a reasonable way that
simplifies the overall system, allows for migration, and doesn't
have a negative impact on our caching of metadata.
overall i think that changing how we reference objects, with the
exception of perhaps redoing how we keep up with free/recently-
freed objects, is something that should perhaps wait until we have
server-to-server working. we're likely to want to make some changes
at that point anyway, once the system has more control over the
construction of files and directories. maybe we can discuss how
we'd like things to work in that context and concentrate on getting
there, rather than torquing things now and then perhaps messing
with things again?
thanks everyone! it's fun to get to sit and think about this stuff,
especially after many days of travel and meetings :).
regards,
rob
Walter B. Ligon III wrote:
I don't understand this. Is there a scheme whereby there is no
mapping of the handle ID to a server? If not, then what we are
talking about, I think, is whether the server mapping is fixed or
not. The idea behind the current scheme was to make the mapping
of servers to handles flexible. That said, the specific
implementation might could be better. For example, using 128 bits
we could have a 64 bit segment tag and a 64 bit handle ID. The
segment tag would map the handle to a server via the tables, and
the ID would be unique within that segment. This might simplify
some things without losing the flexibility we have.
As it is, the server can still randomly pick an ID, or a client
could randomly pick an ID, they just have to do it within a range,
which isn't particularly hard. With this suggested modification
we could "eliminate" the range by giving all "handle ranges" a
built-in extent of 64 bits, which I think is the same as what you
were suggesting.
If I'm not being clear, let me know and I'll try again. Or, if I
don't understand the problem, let me know that.
Walt
Pete Wyckoff wrote:
For create scalability, you may want the client to pick handle IDs
and offer those to the server, so that you can optimistically create
a metafile assuming there are no collisions on the server. These
guessed handle IDs can be random though. We did not implement this
as it would be quite expensive if implemented in terms of the
existing extent/extentlist/ledger data structures.
In the OSD work, we have to do painful things to return a handle ID
in a particular range. I would much rather have the server pick a
random ID and give it to the client. Or for the client to try to
pick a particular ID and hope there is no collision at the server.
So I'd like to discard the idea of pre-assigned per-server handle
ranges and augment our notion of PVFS_handle to include some sort of
"server identifier" as well as the 64-bit ID that is private to the
particular device on which the object sits.
Various distributed FS implementations for wide-area use seem to be
happy with 128-bit handles and assume collisions will never happen.
This always struck me as wildly reckless, but maybe it is time to
accept the fact that these number spaces are really big.
-- Pete
_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers
_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers
_______________________________________________
Pvfs2-developers mailing list
[email protected]
http://www.beowulf-underground.org/mailman/listinfo/pvfs2-developers