[SCM] CTDB repository - branch master updated - ctdb-1.12-86-g8281bb2

ronnie sahlberg ronniesahlberg at gmail.com
Tue Dec 6 00:21:30 MST 2011


I see,

Good work, thanks.

I fixed the breakage in libctdb.

regards
ronnie sahlberg


On Tue, Dec 6, 2011 at 6:17 PM, Michael Adam <obnox at samba.org> wrote:
> Hi Ronnie,
>
> this commit re-establishes the original wire-format.
> The previous commit ddc5da3a0df7701934404192a0a0aa659a806acb
> broke it by adding a variable to the struct. I noticed
> by smbstatus failing to traverse the dbs... :-}
>
> So this commit brings back the original format for TRAVERSE_START.
> The only things that change are the more internal controls.
> (look at ddc5da3a0df7701934404192a0a0aa659a806acb).
>
> agreed?
>
> Cheers - Michael
>
> ronnie sahlberg wrote:
>> Michael
>> Are you sure about this change?
>>
>> It changes the wire format and size of the CTDB_CONTROL_TRAVERSE_START payload
>> which breaks backward compatibility.
>>
>> Older versions of samba that use the old, different structure will now
>> get an error on this control
>> since the payload is wrong.
>>
>> regards
>> ronnie sahlberg
>>
>>
>> On Sat, Dec 3, 2011 at 12:21 PM, Michael Adam <obnox at samba.org> wrote:
>> > The branch, master has been updated
>> >       via  8281bb210858ed04992eacea7f6d02261e0fc1b1 (commit)
>> >      from  6489d0d9b8ec14c7764a1865618faf659800bcc3 (commit)
>> >
>> > http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master
>> >
>> >
>> > - Log -----------------------------------------------------------------
>> > commit 8281bb210858ed04992eacea7f6d02261e0fc1b1
>> > Author: Michael Adam <obnox at samba.org>
>> > Date:   Sat Dec 3 02:15:30 2011 +0100
>> >
>> >    traverse: fix traversing with empty records by adding a new (internal) control CTDB_CONTROL_TRAVERSE_START_EXT
>> >
>> >    By this, the original CTDB_CONTROL_TRAVERSE_START control that is
>> >    used by e.g. samba's smbstatus, is not changed, so that samba
>> >    continues working without code change.
>> >
>> >    The  CTDB_CONTROL_TRAVERSE_START currently just adds the "withemptyrecords"
>> >    flag to the state and processon on as CTDB_CONTROL_TRAVERSE_START_EXT.
>> >
>> > -----------------------------------------------------------------------
>> >
>> > Summary of changes:
>> >  client/ctdb_client.c    |    4 ++--
>> >  include/ctdb_private.h  |    5 +++++
>> >  include/ctdb_protocol.h |    7 +++++++
>> >  server/ctdb_control.c   |    4 ++++
>> >  server/ctdb_traverse.c  |   39 ++++++++++++++++++++++++++++++++++-----
>> >  5 files changed, 52 insertions(+), 7 deletions(-)
>> >
>> >
>> > Changeset truncated at 500 lines:
>> >
>> > diff --git a/client/ctdb_client.c b/client/ctdb_client.c
>> > index 75ad0e1..224cdc0 100644
>> > --- a/client/ctdb_client.c
>> > +++ b/client/ctdb_client.c
>> > @@ -2059,7 +2059,7 @@ static int ctdb_traverse_ext(struct ctdb_db_context *ctdb_db,
>> >                             void *private_data)
>> >  {
>> >        TDB_DATA data;
>> > -       struct ctdb_traverse_start t;
>> > +       struct ctdb_traverse_start_ext t;
>> >        int32_t status;
>> >        int ret;
>> >        uint64_t srvid = (getpid() | 0xFLL<<60);
>> > @@ -2085,7 +2085,7 @@ static int ctdb_traverse_ext(struct ctdb_db_context *ctdb_db,
>> >        data.dptr = (uint8_t *)&t;
>> >        data.dsize = sizeof(t);
>> >
>> > -       ret = ctdb_control(ctdb_db->ctdb, CTDB_CURRENT_NODE, 0, CTDB_CONTROL_TRAVERSE_START, 0,
>> > +       ret = ctdb_control(ctdb_db->ctdb, CTDB_CURRENT_NODE, 0, CTDB_CONTROL_TRAVERSE_START_EXT, 0,
>> >                           data, NULL, NULL, &status, NULL, NULL);
>> >        if (ret != 0 || status != 0) {
>> >                DEBUG(DEBUG_ERR,("ctdb_traverse_all failed\n"));
>> > diff --git a/include/ctdb_private.h b/include/ctdb_private.h
>> > index 4155bac..f545eaa 100644
>> > --- a/include/ctdb_private.h
>> > +++ b/include/ctdb_private.h
>> > @@ -955,6 +955,11 @@ struct ctdb_client_call_state {
>> >  };
>> >
>> >
>> > +int32_t ctdb_control_traverse_start_ext(struct ctdb_context *ctdb,
>> > +                                       TDB_DATA indata,
>> > +                                       TDB_DATA *outdata,
>> > +                                       uint32_t srcnode,
>> > +                                       uint32_t client_id);
>> >  int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb, TDB_DATA indata,
>> >                                    TDB_DATA *outdata, uint32_t srcnode, uint32_t client_id);
>> >  int32_t ctdb_control_traverse_all(struct ctdb_context *ctdb, TDB_DATA data, TDB_DATA *outdata);
>> > diff --git a/include/ctdb_protocol.h b/include/ctdb_protocol.h
>> > index 99e3f4f..c71bafa 100644
>> > --- a/include/ctdb_protocol.h
>> > +++ b/include/ctdb_protocol.h
>> > @@ -374,6 +374,7 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS          = 0,
>> >                    CTDB_CONTROL_SCHEDULE_FOR_DELETION   = 128,
>> >                    CTDB_CONTROL_SET_DB_READONLY         = 129,
>> >                    CTDB_CONTROL_CHECK_SRVIDS            = 130,
>> > +                   CTDB_CONTROL_TRAVERSE_START_EXT      = 131,
>> >  };
>> >
>> >  /*
>> > @@ -582,6 +583,12 @@ struct ctdb_traverse_start {
>> >        uint32_t db_id;
>> >        uint32_t reqid;
>> >        uint64_t srvid;
>> > +};
>> > +
>> > +struct ctdb_traverse_start_ext {
>> > +       uint32_t db_id;
>> > +       uint32_t reqid;
>> > +       uint64_t srvid;
>> >        bool withemptyrecords;
>> >  };
>> >
>> > diff --git a/server/ctdb_control.c b/server/ctdb_control.c
>> > index 602e994..060f2c5 100644
>> > --- a/server/ctdb_control.c
>> > +++ b/server/ctdb_control.c
>> > @@ -247,6 +247,10 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb,
>> >                CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_traverse_start));
>> >                return ctdb_control_traverse_start(ctdb, indata, outdata, srcnode, client_id);
>> >
>> > +       case CTDB_CONTROL_TRAVERSE_START_EXT:
>> > +               CHECK_CONTROL_DATA_SIZE(sizeof(struct ctdb_traverse_start_ext));
>> > +               return ctdb_control_traverse_start_ext(ctdb, indata, outdata, srcnode, client_id);
>> > +
>> >        case CTDB_CONTROL_TRAVERSE_ALL:
>> >                return ctdb_control_traverse_all(ctdb, indata, outdata);
>> >
>> > diff --git a/server/ctdb_traverse.c b/server/ctdb_traverse.c
>> > index d719f6f..da5a548 100644
>> > --- a/server/ctdb_traverse.c
>> > +++ b/server/ctdb_traverse.c
>> > @@ -557,13 +557,17 @@ static void traverse_start_callback(void *p, TDB_DATA key, TDB_DATA data)
>> >  }
>> >
>> >
>> > -/*
>> > -  start a traverse_all - called as a control from a client
>> > +/**
>> > + * start a traverse_all - called as a control from a client.
>> > + * extended version to take the "withemptyrecords" parameter.
>> >  */
>> > -int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb, TDB_DATA data,
>> > -                                   TDB_DATA *outdata, uint32_t srcnode, uint32_t client_id)
>> > +int32_t ctdb_control_traverse_start_ext(struct ctdb_context *ctdb,
>> > +                                       TDB_DATA data,
>> > +                                       TDB_DATA *outdata,
>> > +                                       uint32_t srcnode,
>> > +                                       uint32_t client_id)
>> >  {
>> > -       struct ctdb_traverse_start *d = (struct ctdb_traverse_start *)data.dptr;
>> > +       struct ctdb_traverse_start_ext *d = (struct ctdb_traverse_start_ext *)data.dptr;
>> >        struct traverse_start_state *state;
>> >        struct ctdb_db_context *ctdb_db;
>> >        struct ctdb_client *client = ctdb_reqid_find(ctdb, client_id, struct ctdb_client);
>> > @@ -615,3 +619,28 @@ int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb, TDB_DATA data,
>> >
>> >        return 0;
>> >  }
>> > +
>> > +/**
>> > + * start a traverse_all - called as a control from a client.
>> > + */
>> > +int32_t ctdb_control_traverse_start(struct ctdb_context *ctdb,
>> > +                                   TDB_DATA data,
>> > +                                   TDB_DATA *outdata,
>> > +                                   uint32_t srcnode,
>> > +                                   uint32_t client_id)
>> > +{
>> > +       struct ctdb_traverse_start *d = (struct ctdb_traverse_start *)data.dptr;
>> > +       struct ctdb_traverse_start_ext d2;
>> > +       TDB_DATA data2;
>> > +
>> > +       ZERO_STRUCT(d2);
>> > +       d2.db_id = d->db_id;
>> > +       d2.reqid = d->reqid;
>> > +       d2.srvid = d->srvid;
>> > +       d2.withemptyrecords = false;
>> > +
>> > +       data2.dsize = sizeof(d2);
>> > +       data2.dptr = (uint8_t *)&d2;
>> > +
>> > +       return ctdb_control_traverse_start_ext(ctdb, data2, outdata, srcnode, client_id);
>> > +}
>> >
>> >
>> > --
>> > CTDB repository
>


More information about the samba-technical mailing list