[sheepdog] [PATCH] journal: refactor the journaling subsystem
Hitoshi Mitake
mitake.hitoshi at gmail.com
Tue Jun 25 03:44:08 CEST 2013
At Tue, 25 Jun 2013 09:41:05 +0800,
Kai Zhang wrote:
>
> [1 <text/plain; us-ascii (quoted-printable)>]
>
> On Jun 24, 2013, at 11:54 PM, Hitoshi Mitake <mitake.hitoshi at gmail.com> wrote:
>
> > At Mon, 24 Jun 2013 02:20:59 -0700,
> > Kai Zhang wrote:
> >>
> >> Hitoshi Mitake <mitake.hitoshi at gmail.com> writes:
> >>
> >>> At Mon, 24 Jun 2013 01:31:41 -0700,
> >>> Kai Zhang wrote:
> >>>>
> >>>> Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp> writes:
> >>>>
> >>>>> Current journaling subsystem has some dirty parts because of its old
> >>>>> journal descriptor types (epoch and config). This patch cleans them.
> >>>>>
> >>>>> Signed-off-by: Hitoshi Mitake <mitake.hitoshi at lab.ntt.co.jp>
> >>>>> ---
> >>>>> sheep/journal.c | 31 +++++++++++++++----------------
> >>>>> 1 files changed, 15 insertions(+), 16 deletions(-)
> >>>>>
> >>>>> diff --git a/sheep/journal.c b/sheep/journal.c
> >>>>> index 50783f2..f1f94da 100644
> >>>>> --- a/sheep/journal.c
> >>>>> +++ b/sheep/journal.c
> >>>>> @@ -137,21 +137,18 @@ static bool journal_entry_full_write(struct journal_descriptor *jd)
> >>>>>
> >>>>> static void journal_get_path(struct journal_descriptor *jd, char *path)
> >>>>> {
> >>>>> - switch (jd->flag) {
> >>>>> - case JF_STORE:
> >>>>> - case JF_REMOVE_OBJ:
> >>>>> - snprintf(path, PATH_MAX, "%s/%016"PRIx64,
> >>>>> - md_get_object_path(jd->oid), jd->oid);
> >>>>> - if (jd->flag == JF_STORE)
> >>>>> - sd_iprintf("%s, size %"PRIu64", off %"PRIu64", %d",
> >>>>> - path, jd->size, jd->offset, jd->create);
> >>>>> - else /* JF_REMOVE_OBJ */
> >>>>> - sd_iprintf("%s (remove)", path);
> >>>>> - break;
> >>>>> - default:
> >>>>> - panic("unknown type of journal flag: %d", jd->flag);
> >>>>> - break;
> >>>>> - }
> >>>>> + snprintf(path, PATH_MAX, "%s/%016"PRIx64,
> >>>>> + md_get_object_path(jd->oid), jd->oid);
> >>>>> +
> >>>>> + if (jd->flag == JF_STORE)
> >>>>> + sd_iprintf("%s, size %"PRIu64", off %"PRIu64", %d",
> >>>>> + path, jd->size, jd->offset, jd->create);
> >>>>> + else if (jd->flag == JF_REMOVE_OBJ)
> >>>>> + sd_iprintf("%s (remove)", path);
> >>>>> + else
> >>>>> + panic("unknown type of journal flag,"
> >>>>> + " the journal flag seems to be corrupted: %d",
> >>>>> + jd->flag);
> >>>>> }
> >>>>>
> >>>>> static int replay_journal_entry(struct journal_descriptor *jd)
> >>>>> @@ -168,6 +165,8 @@ static int replay_journal_entry(struct journal_descriptor *jd)
> >>>>> return 0;
> >>>>> }
> >>>>>
> >>>>> + assert(jd->flag == JF_STORE);
> >>>>> +
> >>>>
> >>>> Because journal_get_path(jd, patch) is needed whenever jd->flag is
> >>>> JF_REMOVE_OBJ or JF_STORE, I think we can put it to the top to clean the code.
> >>>> And because the value of jd->flag will be checked by both journal_get_path(),
> >>>> and this assert, so it would be better to check it in one place.
> >>>> The modifide code would be like:
> >>>>
> >>>> journal_get_path(jd, path); // no check
> >>>> if (jd->flag == JF_REMOVE_OBJ) {
> >>>> unlink(path);
> >>>> return 0;
> >>>> } else if (jd->flag == JF_RESTORE) {
> >>>> /* restore logic here */
> >>>
> >>> Do you mean STORE?
> >>>
> >>
> >> Sorry, my mistake. It should be STORE.
> >>
> >>>> } else {
> >>>> panic(...);
> >>>> }
> >>>>
> >>>> A switch case is also a good choice.
> >>>
> >>> Because current journal entry has only two types, the above
> >>> indentation of /* restore logic here */ or switch statements would be
> >>> too flowery.
> >>>
> >>
> >> How about a helper function to wrap them up?
> >> Anyway, maybe this is not a big issue.
> >
> > Do you mean implementing functions for each types of journal entry? I
> > feel it is an over abstraction.
> >
> >> But what I stressed is that journal_get_path() and the logic of checking
> >> jd->flag were duplicated. And there is a way to clean them.
> >>
> >
> > IIUC, you think that the assert(jd->flag == JF_STORE); is
> > redundant. Of course we can remove the assert practically. But I added
> > the assert mainly for documentation. And it produces no runtime
> > overhead. I believe this would be helpful for understanding of other
> > developers.
>
>
> I see.
> Maybe it's just a matter of taste.
> And because I'm not a maintainer currently, please ignore my comments and
> wait for Yuan or Kazutaka to merge this patch.
>
Thanks for your opinion. Let's wait for their review.
Thanks,
Hitoshi
More information about the sheepdog
mailing list