* PGLog.{cc,h} review request
@ 2013-05-19 8:33 Loic Dachary
2013-05-22 13:37 ` Loic Dachary
0 siblings, 1 reply; 3+ messages in thread
From: Loic Dachary @ 2013-05-19 8:33 UTC (permalink / raw)
To: Samuel Just; +Cc: Ceph Development
[-- Attachment #1: Type: text/plain, Size: 4947 bytes --]
Hi Sam,
I would be grateful if you could review https://github.com/dachary/ceph/commit/eeb8854a41409ef4224bf42101a19de70916573c ( compiles ok + make check runs but did not go thru teuthology or any manual tests ). It is a large patch but I expect the followups to be smaller. I did not send a pull request because it is a first attempt and you may want me to rethink what was done. It moves about 1000 lines out of the PG.{cc,h} ( i.e. 10% ). One of the benefits is that reading PGLog.h gives a synthetic view of what services the future PGLog API should provide.
Cheers
move log, ondisklog, missing from PG to PGLog
PG::log, PG::ondisklog, PG::missing are moved from PG to a new PGLog
class and are made protected data members. It is a preliminary step
before writing unit tests to cover the methods that have side effects
on these data members and define a clean PGLog API. It improves
encapsulation and does not change any of the logic already in
place.
Possible issues :
* an additional reference (PG->PGLog->IndexedLog instead of
PG->IndexedLog for instance) is introduced : is it optimized ?
* pg_log_t::splice converts its const_iterator into an iterator using
std::advance which goes thru each element of the logs up to the
position of the const_iterator. If the log is long and the call is
too frequent, there will be a noticeable performance penalty. Is it
called frequently enough to be a problem ?
* rewriting log.log into pg_log.get_log().log affects the readability
but should be optimized and have no impact on performances
The guidelines followed for this patch are:
* const access to the data members are preserved, no attempt is made
to define accessors
* all non const methods are in PGLog, no access to non const methods of
PGLog::log, PGLog::logondisk and PGLog::missing are provided
* when methods are moved from PG to PGLog the change to their
implementation is restricted to the minimum.
* the PG::OndiskLog and PG::IndexedLog sub classes are moved
to PGLog sub classes unmodified and remain public
A const version of the pg_log_t::find_entry method was added.
A const accessor is provided for PGLog::get_log, PGLog::get_missing,
PGLog::get_ondisklog but no non-const accessor.
Arguments are added to most of the methods moved from PG to PGLog so
that they can get access to PG data members such as info or log_oid.
A bound method pointer to PG::remove_snap_mapped_object is provided to
the merge_log, rewind_divergent_log and merge_old_entry. These additions
are not repeated in the method notes below.
The PGLog method are sorted according to the data member they modify.
//////////////////// missing ////////////////////
* The pg_missing_t::{got,have,need,add,rm} methods are wrapped as
PGLog::missing_{got,have,need,add,rm}
//////////////////// log ////////////////////
* PGLog::get_tail, PGLog::get_head getters are created
* PGLog::set_tail, PGLog::set_head, PGLog::set_last_requested setters are created
* PGLog::index, PGLog::unindex, PGLog::add wrappers, PGLog::reset_recovery_pointers are created
* PGLog::splice is a wrapper for pg_log_t::splice that converts its
const_iterator into an iterator
* PGLog::clear_info_log replaces PG::clear_info_log
* PGLog::trim replaces PG::trim
//////////////////// log & missing ////////////////////
* PGLog::claim_log is created with code extracted from
PG::RecoveryState::Stray::react.
* PGLog::split_into is created with code extracted from
PG::split_into.
* PGLog::recover_got is created with code extracted from
ReplicatedPG::recover_got.
* PGLog::activate_not_complete is created with code extracted
from PG::active
* PGLog:proc_replica_log is created with code extracted from
PG::proc_replica_log
* PGLog:write_log is created with code extracted from
PG::write_log
* PGLog::merge_old_entry replaces PG::merge_old_entry
* PGLog::rewind_divergent_log replaces PG::rewind_divergent_log
* PGLog::merge_log replaces PG::merge_log
* PGLog:write_log is created with code extracted from PG::write_log. A
non-static version is created for convenience but is a simple
wrapper.
* PGLog:read_log replaces PG::read_log. A non-static version is
created for convenience but is a simple wrapper.
* PGLog:read_log_old replaces PG::read_log_old.
--
Loïc Dachary, Artisan Logiciel Libre
All that is necessary for the triumph of evil is that good people do nothing.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: PGLog.{cc,h} review request
2013-05-19 8:33 PGLog.{cc,h} review request Loic Dachary
@ 2013-05-22 13:37 ` Loic Dachary
2013-05-25 11:50 ` Loic Dachary
0 siblings, 1 reply; 3+ messages in thread
From: Loic Dachary @ 2013-05-22 13:37 UTC (permalink / raw)
To: Samuel Just; +Cc: Ceph Development
[-- Attachment #1: Type: text/plain, Size: 5553 bytes --]
Hi Sam,
The patch was amended with your recommendations and rebased against today's master. I submitted a pull request at https://github.com/ceph/ceph/pull/308
For the record, the previous patch, including your comments is located at https://github.com/dachary/ceph/commit/7267244bf0775442d445407e55b7fbb9935a404a
Cheers
On 05/19/2013 10:33 AM, Loic Dachary wrote:
> Hi Sam,
>
> I would be grateful if you could review https://github.com/dachary/ceph/commit/eeb8854a41409ef4224bf42101a19de70916573c ( compiles ok + make check runs but did not go thru teuthology or any manual tests ). It is a large patch but I expect the followups to be smaller. I did not send a pull request because it is a first attempt and you may want me to rethink what was done. It moves about 1000 lines out of the PG.{cc,h} ( i.e. 10% ). One of the benefits is that reading PGLog.h gives a synthetic view of what services the future PGLog API should provide.
>
> Cheers
>
> move log, ondisklog, missing from PG to PGLog
>
> PG::log, PG::ondisklog, PG::missing are moved from PG to a new PGLog
> class and are made protected data members. It is a preliminary step
> before writing unit tests to cover the methods that have side effects
> on these data members and define a clean PGLog API. It improves
> encapsulation and does not change any of the logic already in
> place.
>
> Possible issues :
>
> * an additional reference (PG->PGLog->IndexedLog instead of
> PG->IndexedLog for instance) is introduced : is it optimized ?
>
> * pg_log_t::splice converts its const_iterator into an iterator using
> std::advance which goes thru each element of the logs up to the
> position of the const_iterator. If the log is long and the call is
> too frequent, there will be a noticeable performance penalty. Is it
> called frequently enough to be a problem ?
>
> * rewriting log.log into pg_log.get_log().log affects the readability
> but should be optimized and have no impact on performances
>
> The guidelines followed for this patch are:
>
> * const access to the data members are preserved, no attempt is made
> to define accessors
>
> * all non const methods are in PGLog, no access to non const methods of
> PGLog::log, PGLog::logondisk and PGLog::missing are provided
>
> * when methods are moved from PG to PGLog the change to their
> implementation is restricted to the minimum.
>
> * the PG::OndiskLog and PG::IndexedLog sub classes are moved
> to PGLog sub classes unmodified and remain public
>
> A const version of the pg_log_t::find_entry method was added.
>
> A const accessor is provided for PGLog::get_log, PGLog::get_missing,
> PGLog::get_ondisklog but no non-const accessor.
>
> Arguments are added to most of the methods moved from PG to PGLog so
> that they can get access to PG data members such as info or log_oid.
> A bound method pointer to PG::remove_snap_mapped_object is provided to
> the merge_log, rewind_divergent_log and merge_old_entry. These additions
> are not repeated in the method notes below.
>
> The PGLog method are sorted according to the data member they modify.
>
> //////////////////// missing ////////////////////
>
> * The pg_missing_t::{got,have,need,add,rm} methods are wrapped as
> PGLog::missing_{got,have,need,add,rm}
>
> //////////////////// log ////////////////////
>
> * PGLog::get_tail, PGLog::get_head getters are created
>
> * PGLog::set_tail, PGLog::set_head, PGLog::set_last_requested setters are created
>
> * PGLog::index, PGLog::unindex, PGLog::add wrappers, PGLog::reset_recovery_pointers are created
>
> * PGLog::splice is a wrapper for pg_log_t::splice that converts its
> const_iterator into an iterator
>
> * PGLog::clear_info_log replaces PG::clear_info_log
>
> * PGLog::trim replaces PG::trim
>
> //////////////////// log & missing ////////////////////
>
> * PGLog::claim_log is created with code extracted from
> PG::RecoveryState::Stray::react.
>
> * PGLog::split_into is created with code extracted from
> PG::split_into.
>
> * PGLog::recover_got is created with code extracted from
> ReplicatedPG::recover_got.
>
> * PGLog::activate_not_complete is created with code extracted
> from PG::active
>
> * PGLog:proc_replica_log is created with code extracted from
> PG::proc_replica_log
>
> * PGLog:write_log is created with code extracted from
> PG::write_log
>
> * PGLog::merge_old_entry replaces PG::merge_old_entry
>
> * PGLog::rewind_divergent_log replaces PG::rewind_divergent_log
>
> * PGLog::merge_log replaces PG::merge_log
>
> * PGLog:write_log is created with code extracted from PG::write_log. A
> non-static version is created for convenience but is a simple
> wrapper.
>
> * PGLog:read_log replaces PG::read_log. A non-static version is
> created for convenience but is a simple wrapper.
>
> * PGLog:read_log_old replaces PG::read_log_old.
>
>
>
--
Loïc Dachary, Artisan Logiciel Libre
All that is necessary for the triumph of evil is that good people do nothing.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: PGLog.{cc,h} review request
2013-05-22 13:37 ` Loic Dachary
@ 2013-05-25 11:50 ` Loic Dachary
0 siblings, 0 replies; 3+ messages in thread
From: Loic Dachary @ 2013-05-25 11:50 UTC (permalink / raw)
To: Samuel Just; +Cc: Ceph Development
[-- Attachment #1: Type: text/plain, Size: 5930 bytes --]
Hi Sam,
While expecting your review, I kept reading the code to better understand it. Since the next step involves modifying / defining the PGLog API, that will help me get it right ;-)
Cheers
On 05/22/2013 03:37 PM, Loic Dachary wrote:
> Hi Sam,
>
> The patch was amended with your recommendations and rebased against today's master. I submitted a pull request at https://github.com/ceph/ceph/pull/308
>
> For the record, the previous patch, including your comments is located at https://github.com/dachary/ceph/commit/7267244bf0775442d445407e55b7fbb9935a404a
>
> Cheers
>
> On 05/19/2013 10:33 AM, Loic Dachary wrote:
>> Hi Sam,
>>
>> I would be grateful if you could review https://github.com/dachary/ceph/commit/eeb8854a41409ef4224bf42101a19de70916573c ( compiles ok + make check runs but did not go thru teuthology or any manual tests ). It is a large patch but I expect the followups to be smaller. I did not send a pull request because it is a first attempt and you may want me to rethink what was done. It moves about 1000 lines out of the PG.{cc,h} ( i.e. 10% ). One of the benefits is that reading PGLog.h gives a synthetic view of what services the future PGLog API should provide.
>>
>> Cheers
>>
>> move log, ondisklog, missing from PG to PGLog
>>
>> PG::log, PG::ondisklog, PG::missing are moved from PG to a new PGLog
>> class and are made protected data members. It is a preliminary step
>> before writing unit tests to cover the methods that have side effects
>> on these data members and define a clean PGLog API. It improves
>> encapsulation and does not change any of the logic already in
>> place.
>>
>> Possible issues :
>>
>> * an additional reference (PG->PGLog->IndexedLog instead of
>> PG->IndexedLog for instance) is introduced : is it optimized ?
>>
>> * pg_log_t::splice converts its const_iterator into an iterator using
>> std::advance which goes thru each element of the logs up to the
>> position of the const_iterator. If the log is long and the call is
>> too frequent, there will be a noticeable performance penalty. Is it
>> called frequently enough to be a problem ?
>>
>> * rewriting log.log into pg_log.get_log().log affects the readability
>> but should be optimized and have no impact on performances
>>
>> The guidelines followed for this patch are:
>>
>> * const access to the data members are preserved, no attempt is made
>> to define accessors
>>
>> * all non const methods are in PGLog, no access to non const methods of
>> PGLog::log, PGLog::logondisk and PGLog::missing are provided
>>
>> * when methods are moved from PG to PGLog the change to their
>> implementation is restricted to the minimum.
>>
>> * the PG::OndiskLog and PG::IndexedLog sub classes are moved
>> to PGLog sub classes unmodified and remain public
>>
>> A const version of the pg_log_t::find_entry method was added.
>>
>> A const accessor is provided for PGLog::get_log, PGLog::get_missing,
>> PGLog::get_ondisklog but no non-const accessor.
>>
>> Arguments are added to most of the methods moved from PG to PGLog so
>> that they can get access to PG data members such as info or log_oid.
>> A bound method pointer to PG::remove_snap_mapped_object is provided to
>> the merge_log, rewind_divergent_log and merge_old_entry. These additions
>> are not repeated in the method notes below.
>>
>> The PGLog method are sorted according to the data member they modify.
>>
>> //////////////////// missing ////////////////////
>>
>> * The pg_missing_t::{got,have,need,add,rm} methods are wrapped as
>> PGLog::missing_{got,have,need,add,rm}
>>
>> //////////////////// log ////////////////////
>>
>> * PGLog::get_tail, PGLog::get_head getters are created
>>
>> * PGLog::set_tail, PGLog::set_head, PGLog::set_last_requested setters are created
>>
>> * PGLog::index, PGLog::unindex, PGLog::add wrappers, PGLog::reset_recovery_pointers are created
>>
>> * PGLog::splice is a wrapper for pg_log_t::splice that converts its
>> const_iterator into an iterator
>>
>> * PGLog::clear_info_log replaces PG::clear_info_log
>>
>> * PGLog::trim replaces PG::trim
>>
>> //////////////////// log & missing ////////////////////
>>
>> * PGLog::claim_log is created with code extracted from
>> PG::RecoveryState::Stray::react.
>>
>> * PGLog::split_into is created with code extracted from
>> PG::split_into.
>>
>> * PGLog::recover_got is created with code extracted from
>> ReplicatedPG::recover_got.
>>
>> * PGLog::activate_not_complete is created with code extracted
>> from PG::active
>>
>> * PGLog:proc_replica_log is created with code extracted from
>> PG::proc_replica_log
>>
>> * PGLog:write_log is created with code extracted from
>> PG::write_log
>>
>> * PGLog::merge_old_entry replaces PG::merge_old_entry
>>
>> * PGLog::rewind_divergent_log replaces PG::rewind_divergent_log
>>
>> * PGLog::merge_log replaces PG::merge_log
>>
>> * PGLog:write_log is created with code extracted from PG::write_log. A
>> non-static version is created for convenience but is a simple
>> wrapper.
>>
>> * PGLog:read_log replaces PG::read_log. A non-static version is
>> created for convenience but is a simple wrapper.
>>
>> * PGLog:read_log_old replaces PG::read_log_old.
>>
>>
>>
>
--
Loïc Dachary, Artisan Logiciel Libre
All that is necessary for the triumph of evil is that good people do nothing.
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2013-05-25 11:51 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-05-19 8:33 PGLog.{cc,h} review request Loic Dachary
2013-05-22 13:37 ` Loic Dachary
2013-05-25 11:50 ` Loic Dachary
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.