mirror of https://github.com/BOINC/boinc.git
svn path=/trunk/boinc/; revision=25382
This commit is contained in:
parent
810bc735cf
commit
86db0cfd5a
|
@ -0,0 +1,190 @@
|
|||
things we need to do:
|
||||
- decide what nodes to decode and encode
|
||||
- of the resulting (and existing) chunks,
|
||||
decide which to keep on the server
|
||||
- decide what uploads and downloads to start
|
||||
|
||||
1) classify nodes as PRESENT/RECOVERABLE/UNRECOVERABLE,
|
||||
and compute recovery sets and recovery cost
|
||||
|
||||
2) decide which nodes we eventually want to reconstruct
|
||||
|
||||
3) decide which nodes we're going to reconstruct right now
|
||||
--------------------------------
|
||||
// decide
|
||||
// - which metachunks should be reconstructed right now
|
||||
// (i.e. decoded from some of their children),
|
||||
// META_CHUNK::need_reconstruct
|
||||
//
|
||||
// - of those, which should then be encoded
|
||||
// (to create other children)
|
||||
// META_CHUNK::need_expand
|
||||
//
|
||||
// - which metachunks are needed to reconstruct their parent,
|
||||
// and hence should not be deleted immediately
|
||||
// META_CHUNK::needed_by_parent
|
||||
|
||||
|
||||
First: clear all need_ flags.
|
||||
|
||||
META_CHUNK::decide_reconstruct()
|
||||
if not bottom-level
|
||||
for each child C
|
||||
C.decide_reconstruct()
|
||||
if !need_reconstruct and status = PRESENT
|
||||
if there children C with status = UNRECOVERABLE
|
||||
need_reconstruct = true
|
||||
if not bottom-level
|
||||
for all such C
|
||||
C.need_expand = true
|
||||
|
||||
if need_reconstruct and not bottom-level
|
||||
a = # of children C with C.need_reconstruct
|
||||
if a < N
|
||||
for (N-a) children C with C.status = PRESENT
|
||||
C.need_reconstruct = true
|
||||
C.decide_reconstruct()
|
||||
for N children C such that C.need_reconstruct
|
||||
C.needed_by_parent = true
|
||||
|
||||
// reconstruct and expand metachunks as needed
|
||||
//
|
||||
META_CHUNK::do_reconstruct()
|
||||
if not bottom-level
|
||||
for each child C
|
||||
do_reconstruct(C)
|
||||
if need_reconstruct
|
||||
decode this data unit
|
||||
if bottom-level
|
||||
if some child C has status UNRECOVERABLE
|
||||
encode this data unit
|
||||
else
|
||||
if some child C has C.need_expand
|
||||
encode this data unit
|
||||
for each child C with C.need_expand
|
||||
expand(C)
|
||||
if !needed_by_parent
|
||||
delete this data unit
|
||||
for each child C
|
||||
delete C.data unit
|
||||
|
||||
// expand (encode) a metachunk
|
||||
//
|
||||
META_CHUNK::expand()
|
||||
encode this data unit
|
||||
for each child C with C.need_expand
|
||||
expand(C)
|
||||
delete this data unit
|
||||
|
||||
|
||||
==============================
|
||||
scenario 1:
|
||||
|
||||
0: REC
|
||||
0.0: REC
|
||||
0.0.0: REC
|
||||
0.0.1: REC
|
||||
0.0.2: REC
|
||||
0.1: PRES
|
||||
0.1.0: PRES
|
||||
0.1.1: PRES
|
||||
0.1.2: UNREC
|
||||
0.2: UNREC
|
||||
0.2.0: REC
|
||||
0.2.1: UNREC
|
||||
0.2.2: UNREC
|
||||
|
||||
- decode 0.1
|
||||
- delete 0.1.0 or 0.1.1
|
||||
- start upload of 2 of (0.0.*)
|
||||
- start download of 0.1.2
|
||||
|
||||
scenario 2:
|
||||
|
||||
0: REC
|
||||
0.0: PRES
|
||||
0.0.0: PRES
|
||||
0.0.1: PRES
|
||||
0.0.2: UNREC
|
||||
0.1: REC
|
||||
0.1.0: REC
|
||||
0.1.1: REC
|
||||
0.1.2: REC
|
||||
0.2: REC
|
||||
0.2.0: REC
|
||||
0.2.1: REC
|
||||
0.2.2: REC
|
||||
|
||||
- decode 0.0
|
||||
- encode 0.0
|
||||
- delete 0.0.0, 0.0.1
|
||||
|
||||
scenario 3:
|
||||
|
||||
0: PRES
|
||||
0.0: PRES
|
||||
0.0.0: PRES
|
||||
0.0.1: PRES
|
||||
0.0.2: REC
|
||||
0.1: PRES
|
||||
0.1.0: PRES
|
||||
0.1.1: PRES
|
||||
0.1.2: UNREC
|
||||
0.2: UNREC
|
||||
0.2.0: REC
|
||||
0.2.1: UNREC
|
||||
0.2.2: UNREC
|
||||
|
||||
- decode 0.0
|
||||
- delete 0.0.0, 0.0.1
|
||||
- decode 0.1
|
||||
- encode 0.1
|
||||
- delete 0.1.0, 0.1.1
|
||||
- decode 0
|
||||
- encode 0
|
||||
- delete 0.0, 0.1
|
||||
- encode 0.2
|
||||
- delete 0.2.0
|
||||
- delete 0.2
|
||||
==============================
|
||||
|
||||
MC::decide_recon
|
||||
if some child is UNREC
|
||||
if PRESENT
|
||||
need_recon = true
|
||||
mark N PRESENT children as needed_by_parent
|
||||
else
|
||||
mark all PRESENT children as keep_present
|
||||
if keep_present
|
||||
mark N PRESENT children as keep_present
|
||||
|
||||
recurse
|
||||
|
||||
MC::do_recon
|
||||
recurse
|
||||
if need_recon
|
||||
decode
|
||||
delete all non-UNREC children
|
||||
for each UNREC child C
|
||||
expand(C)
|
||||
delete C
|
||||
if !needed_by_parent
|
||||
delete this
|
||||
|
||||
MC::expand
|
||||
encode
|
||||
delete this
|
||||
for each child C
|
||||
if C.need_reconstruct
|
||||
expand(C)
|
||||
delete C
|
||||
|
||||
MC::start_xfers
|
||||
if bottom level
|
||||
for each child C
|
||||
if C.present and need more replicas
|
||||
start downloads of C
|
||||
if C.keep_present and not present
|
||||
start upload(s) of C
|
||||
else
|
||||
recurse
|
|
@ -0,0 +1,17 @@
|
|||
"recovery pass"
|
||||
the processing of a dfile by the vdad
|
||||
|
||||
DATA_UNIT
|
||||
int status (PRESENT, RECOVERABLE, UNRECOVERABLE)
|
||||
|
||||
META_CHUNK
|
||||
bool need_reconstruct
|
||||
decode this unit during this pass
|
||||
bool needed_by_parent
|
||||
this unit is needed to reconstruct parent.
|
||||
(don't delete it after reconstructing)
|
||||
bool keep_present
|
||||
keep enough descendant chunks on server so that
|
||||
this unit will be in PRESENT state after this pass
|
||||
CHUNK
|
||||
bool present
|
Loading…
Reference in New Issue