|
|
About
TODO
Blog
RSS
Old blog
Projects
Gallery
Notes
Wed, 12 Dec 2007
Shame on me or how complex are design bugs...
I have to admit, that mirroring in DST is not currently well supported.
First, because of a bug I made in the early development stage: in DST there
are two objects, which represent a part of the storage, first one is a node,
this object contains information about type of the storage and pointers to
structure, which represents low level device itself (like block device or network
connection). Network connection in turn is represented as a state structure,
which contains socket, state machine for transferred data and so on.
Nodes are used when block io request comes from the higher layer and
states are used when data is transfeerred via network. The former uses
fain grained reference counters: when node is being operated on (request is processed),
its reference counter is increased, if operations become asynchronous
(for example sending queue is full and thus block can not be sent right now),
then block request is queued into state's request list and reference counter for
the node is dropped. If it reaches zero, node is being freed, which in turn
calls exit callback for the state, which flushes the queue of requests.
Things seem simple and correct, but devil is in details - async processing thread
can enter at any point into the game and process state too, which leads to bugs.
Second, DST mirroring can ate all your memory during resync, since it does not check
amount of free ram in the system and tries to allocate new pages until all memory is used.
This is already fixed in the private tree though.
And the last (known) problem is mirror bitmap - it uses single bit for single sector
of the device, and although uses vmalloc(), it is still too much of RAM.
Back to fixing.
/devel/dst :: Link / Comments (0)
Please solve this captcha to be allowed to post (need to reload in a minute): 65 * 13
|