[thin_show_dups] get the backup break working in the rolling hash

This commit is contained in:
Joe Thornber 2015-09-04 10:10:41 +01:00
parent 750ce0f47b
commit 5d383c0293
3 changed files with 8 additions and 37 deletions

View File

@ -82,7 +82,6 @@ content_based_hash::reset()
optional<unsigned> optional<unsigned>
content_based_hash::step(uint8_t byte) content_based_hash::step(uint8_t byte)
{ {
#if 0
optional<unsigned> r; optional<unsigned> r;
rhash_.step(byte); rhash_.step(byte);
@ -114,28 +113,6 @@ content_based_hash::step(uint8_t byte)
} }
return r; return r;
#else
optional<unsigned> r;
rhash_.step(byte);
len_++;
if (len_ < min_len_)
return r;
if (hit_break(div_)) {
// found a break
r = len_;
len_ = 0;
backup_break_.reset();
} else if (len_ >= max_len_) {
r = len_;
len_ = 0;
}
return r;
#endif
} }
bool bool

View File

@ -80,7 +80,7 @@ variable_chunk_stream::next_big_chunk()
return false; return false;
big_chunk_ = &stream_.get(); big_chunk_ = &stream_.get();
little_b_ = little_e_ = big_chunk_->mem_.front().begin; little_b_ = little_e_ = last_hashed_ = big_chunk_->mem_.front().begin;
h_.reset(); h_.reset();
return true; return true;
@ -95,6 +95,7 @@ variable_chunk_stream::advance_one()
big_e = big_chunk_->mem_.front().end; big_e = big_chunk_->mem_.front().end;
little_b_ = little_e_; little_b_ = little_e_;
little_e_ = last_hashed_;
if (little_b_ == big_e) { if (little_b_ == big_e) {
if (next_big_chunk()) if (next_big_chunk())
@ -105,35 +106,28 @@ variable_chunk_stream::advance_one()
assert(little_e_ >= big_chunk_->mem_.front().begin); assert(little_e_ >= big_chunk_->mem_.front().begin);
assert(little_b_ >= big_chunk_->mem_.front().begin); assert(little_b_ >= big_chunk_->mem_.front().begin);
#if 1
if (little_e_ > big_e) {
cerr << "before -- little_e_: " << (void *) little_e_ << ", big_e: " << (void *) big_e << "\n";
}
#endif
assert(little_e_ <= big_e); assert(little_e_ <= big_e);
assert(little_b_ <= big_e); assert(little_b_ <= big_e);
while (little_e_ != big_e) { while (little_e_ != big_e) {
optional<unsigned> maybe_break = h_.step(*little_e_); optional<unsigned> maybe_break = h_.step(*little_e_);
little_e_++;
if (maybe_break) { if (maybe_break) {
// The break is not neccessarily at the current // The break is not neccessarily at the current
// byte. // byte.
last_hashed_ = little_e_;
little_e_ = little_b_ + *maybe_break; little_e_ = little_b_ + *maybe_break;
break; break;
} }
little_e_++;
} }
if (little_e_ == big_e)
last_hashed_ = little_e_;
assert(little_e_ >= big_chunk_->mem_.front().begin); assert(little_e_ >= big_chunk_->mem_.front().begin);
assert(little_b_ >= big_chunk_->mem_.front().begin); assert(little_b_ >= big_chunk_->mem_.front().begin);
#if 1
if (little_e_ > big_e) {
cerr << "after -- little_e_: " << (void *) little_e_ << ", big_e: " << (void *) big_e << "\n";
}
#endif
assert(little_e_ <= big_e); assert(little_e_ <= big_e);
assert(little_b_ <= big_e); assert(little_b_ <= big_e);

View File

@ -32,7 +32,7 @@ namespace thin_provisioning {
chunk_stream &stream_; chunk_stream &stream_;
chunk const *big_chunk_; chunk const *big_chunk_;
uint8_t *little_b_, *little_e_; uint8_t *little_b_, *little_e_, *last_hashed_;
chunk little_chunk_; chunk little_chunk_;
}; };
} }