Re: [ovs-dev] [PATCH v9] ovsdb-tool: Convert clustered db to standalone db.
Thanks Han. Addressed the minor comment in v10. On Thu, Aug 29, 2019 at 10:31 PM Han Zhou wrote: > Thanks for the update. > > On Thu, Aug 29, 2019 at 6:20 PM wrote: > > > > From: Aliasgar Ginwala > > > > Add support in ovsdb-tool for migrating clustered dbs to standalone dbs. > > E.g. usage to migrate nb/sb db to standalone db from raft: > > ovsdb-tool cluster-to-standalone ovnnb_db.db ovnnb_db_cluster.db > > > > Signed-off-by: Aliasgar Ginwala > > --- > > Documentation/ref/ovsdb.7.rst | 3 + > > NEWS | 3 + > > ovsdb/ovsdb-tool.1.in | 8 +++ > > ovsdb/ovsdb-tool.c| 101 +- > > tests/ovsdb-tool.at | 43 +++ > > 5 files changed, 157 insertions(+), 1 deletion(-) > > > > diff --git a/Documentation/ref/ovsdb.7.rst > b/Documentation/ref/ovsdb.7.rst > > index cd1c63d64..b12d8066c 100644 > > --- a/Documentation/ref/ovsdb.7.rst > > +++ b/Documentation/ref/ovsdb.7.rst > > @@ -514,6 +514,9 @@ standalone database from the contents of a running > clustered database. > > When the cluster is down and cannot be revived, ``ovsdb-client backup`` > will > > not work. > > > > +Use ``ovsdb-tool cluster-to-standalone`` to convert clustered database > to > > +standalone database when the cluster is down and cannot be revived. > > + > > Upgrading or Downgrading a Database > > --- > > > > diff --git a/NEWS b/NEWS > > index c5caa13d6..a02f9f1a6 100644 > > --- a/NEWS > > +++ b/NEWS > > @@ -49,6 +49,9 @@ v2.12.0 - xx xxx > > quickly after a brief disconnection, saving bandwidth and CPU > time. > > See section 4.1.15 of ovsdb-server(7) for details of related > OVSDB > > protocol extension. > > + * Support to convert from cluster database to standalone database > is now > > + available when clustered is down and cannot be revived using > ovsdb-tool > > + . Check "Database Migration Commands" in ovsdb-tool man section. > > - OVN: > > * IPAM/MACAM: > > - select IPAM mac_prefix in a random manner if not provided by > the user > > diff --git a/ovsdb/ovsdb-tool.1.in b/ovsdb/ovsdb-tool.1.in > > index ec85e14c4..31a918d90 100644 > > --- a/ovsdb/ovsdb-tool.1.in > > +++ b/ovsdb/ovsdb-tool.1.in > > @@ -147,6 +147,14 @@ avoid this possibility, specify > \fB\-\-cid=\fIuuid\fR, where > > \fIuuid\fR is the cluster ID of the cluster to join, as printed by > > \fBovsdb\-tool get\-cid\fR. > > . > > +.SS "Database Migration Commands" > > +This commands will convert cluster database to standalone database. > > +. > > +.IP "\fBcluster\-to\-standalone\fI db clusterdb" > > +Use this command to convert to standalone database from clustered > database > > +when the cluster is down and cannot be revived. It creates new > standalone > > +\fIdb\fR file from the given cluster \fIdb\fR file. > > +. > > .SS "Version Management Commands" > > .so ovsdb/ovsdb-schemas.man > > .PP > > diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c > > index 438f97590..3bbf4c8bc 100644 > > --- a/ovsdb/ovsdb-tool.c > > +++ b/ovsdb/ovsdb-tool.c > > @@ -173,6 +173,9 @@ usage(void) > > " compare-versions A OP B compare OVSDB schema version > numbers\n" > > " query [DB] TRNS execute read-only transaction on > DB\n" > > " transact [DB] TRNS execute read/write transaction on > DB\n" > > + " cluster-to-standalone DB DBConvert clustered DB to\n" > > + " standalone DB when cluster is down and cannot be\n" > > + "revived\n" > > " [-m]... show-log [DB] print DB's log entries\n" > > "The default DB is %s.\n" > > "The default SCHEMA is %s.\n", > > @@ -942,6 +945,55 @@ print_raft_record(const struct raft_record *r, > > } > > } > > > > +static void > > +raft_header_to_standalone_log(const struct raft_header *h, > > + struct ovsdb_log *db_log_data) > > +{ > > +if (h->snap_index) { > > +if (!h->snap.data || json_array(h->snap.data)->n != 2) { > > +ovs_fatal(0, "Incorrect raft header data array length"); > > +} > > + > > +struct json *schema_json = json_array(h->snap.data)->elems[0]; > > +if (schema_json->type != JSON_NULL) { > > +struct ovsdb_schema *schema; > > +check_ovsdb_error(ovsdb_schema_from_json(schema_json, > )); > > +ovsdb_schema_destroy(schema); > > +check_ovsdb_error(ovsdb_log_write_and_free(db_log_data, > > + schema_json)); > > +} > > + > > +struct json *data_json = json_array(h->snap.data)->elems[1]; > > +if (!data_json || data_json->type != JSON_OBJECT) { > > +ovs_fatal(0, "Invalid raft header data"); > > +} > > +if (data_json->type != JSON_NULL) { > > +
Re: [ovs-dev] [PATCH v9] ovsdb-tool: Convert clustered db to standalone db.
Thanks for the update. On Thu, Aug 29, 2019 at 6:20 PM wrote: > > From: Aliasgar Ginwala > > Add support in ovsdb-tool for migrating clustered dbs to standalone dbs. > E.g. usage to migrate nb/sb db to standalone db from raft: > ovsdb-tool cluster-to-standalone ovnnb_db.db ovnnb_db_cluster.db > > Signed-off-by: Aliasgar Ginwala > --- > Documentation/ref/ovsdb.7.rst | 3 + > NEWS | 3 + > ovsdb/ovsdb-tool.1.in | 8 +++ > ovsdb/ovsdb-tool.c| 101 +- > tests/ovsdb-tool.at | 43 +++ > 5 files changed, 157 insertions(+), 1 deletion(-) > > diff --git a/Documentation/ref/ovsdb.7.rst b/Documentation/ref/ovsdb.7.rst > index cd1c63d64..b12d8066c 100644 > --- a/Documentation/ref/ovsdb.7.rst > +++ b/Documentation/ref/ovsdb.7.rst > @@ -514,6 +514,9 @@ standalone database from the contents of a running clustered database. > When the cluster is down and cannot be revived, ``ovsdb-client backup`` will > not work. > > +Use ``ovsdb-tool cluster-to-standalone`` to convert clustered database to > +standalone database when the cluster is down and cannot be revived. > + > Upgrading or Downgrading a Database > --- > > diff --git a/NEWS b/NEWS > index c5caa13d6..a02f9f1a6 100644 > --- a/NEWS > +++ b/NEWS > @@ -49,6 +49,9 @@ v2.12.0 - xx xxx > quickly after a brief disconnection, saving bandwidth and CPU time. > See section 4.1.15 of ovsdb-server(7) for details of related OVSDB > protocol extension. > + * Support to convert from cluster database to standalone database is now > + available when clustered is down and cannot be revived using ovsdb-tool > + . Check "Database Migration Commands" in ovsdb-tool man section. > - OVN: > * IPAM/MACAM: > - select IPAM mac_prefix in a random manner if not provided by the user > diff --git a/ovsdb/ovsdb-tool.1.in b/ovsdb/ovsdb-tool.1.in > index ec85e14c4..31a918d90 100644 > --- a/ovsdb/ovsdb-tool.1.in > +++ b/ovsdb/ovsdb-tool.1.in > @@ -147,6 +147,14 @@ avoid this possibility, specify \fB\-\-cid=\fIuuid\fR, where > \fIuuid\fR is the cluster ID of the cluster to join, as printed by > \fBovsdb\-tool get\-cid\fR. > . > +.SS "Database Migration Commands" > +This commands will convert cluster database to standalone database. > +. > +.IP "\fBcluster\-to\-standalone\fI db clusterdb" > +Use this command to convert to standalone database from clustered database > +when the cluster is down and cannot be revived. It creates new standalone > +\fIdb\fR file from the given cluster \fIdb\fR file. > +. > .SS "Version Management Commands" > .so ovsdb/ovsdb-schemas.man > .PP > diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c > index 438f97590..3bbf4c8bc 100644 > --- a/ovsdb/ovsdb-tool.c > +++ b/ovsdb/ovsdb-tool.c > @@ -173,6 +173,9 @@ usage(void) > " compare-versions A OP B compare OVSDB schema version numbers\n" > " query [DB] TRNS execute read-only transaction on DB\n" > " transact [DB] TRNS execute read/write transaction on DB\n" > + " cluster-to-standalone DB DBConvert clustered DB to\n" > + " standalone DB when cluster is down and cannot be\n" > + "revived\n" > " [-m]... show-log [DB] print DB's log entries\n" > "The default DB is %s.\n" > "The default SCHEMA is %s.\n", > @@ -942,6 +945,55 @@ print_raft_record(const struct raft_record *r, > } > } > > +static void > +raft_header_to_standalone_log(const struct raft_header *h, > + struct ovsdb_log *db_log_data) > +{ > +if (h->snap_index) { > +if (!h->snap.data || json_array(h->snap.data)->n != 2) { > +ovs_fatal(0, "Incorrect raft header data array length"); > +} > + > +struct json *schema_json = json_array(h->snap.data)->elems[0]; > +if (schema_json->type != JSON_NULL) { > +struct ovsdb_schema *schema; > +check_ovsdb_error(ovsdb_schema_from_json(schema_json, )); > +ovsdb_schema_destroy(schema); > +check_ovsdb_error(ovsdb_log_write_and_free(db_log_data, > + schema_json)); > +} > + > +struct json *data_json = json_array(h->snap.data)->elems[1]; > +if (!data_json || data_json->type != JSON_OBJECT) { > +ovs_fatal(0, "Invalid raft header data"); > +} > +if (data_json->type != JSON_NULL) { > +check_ovsdb_error(ovsdb_log_write_and_free(db_log_data, > + data_json)); > +} > +} > +} > + > +static void > +raft_record_to_standalone_log(const struct raft_record *r, > + struct ovsdb_log *db_log_data) > +{ > +if (r->type == RAFT_REC_ENTRY) { > +if (!r->entry.data) { > +
[ovs-dev] [PATCH v9] ovsdb-tool: Convert clustered db to standalone db.
From: Aliasgar Ginwala Add support in ovsdb-tool for migrating clustered dbs to standalone dbs. E.g. usage to migrate nb/sb db to standalone db from raft: ovsdb-tool cluster-to-standalone ovnnb_db.db ovnnb_db_cluster.db Signed-off-by: Aliasgar Ginwala --- Documentation/ref/ovsdb.7.rst | 3 + NEWS | 3 + ovsdb/ovsdb-tool.1.in | 8 +++ ovsdb/ovsdb-tool.c| 101 +- tests/ovsdb-tool.at | 43 +++ 5 files changed, 157 insertions(+), 1 deletion(-) diff --git a/Documentation/ref/ovsdb.7.rst b/Documentation/ref/ovsdb.7.rst index cd1c63d64..b12d8066c 100644 --- a/Documentation/ref/ovsdb.7.rst +++ b/Documentation/ref/ovsdb.7.rst @@ -514,6 +514,9 @@ standalone database from the contents of a running clustered database. When the cluster is down and cannot be revived, ``ovsdb-client backup`` will not work. +Use ``ovsdb-tool cluster-to-standalone`` to convert clustered database to +standalone database when the cluster is down and cannot be revived. + Upgrading or Downgrading a Database --- diff --git a/NEWS b/NEWS index c5caa13d6..a02f9f1a6 100644 --- a/NEWS +++ b/NEWS @@ -49,6 +49,9 @@ v2.12.0 - xx xxx quickly after a brief disconnection, saving bandwidth and CPU time. See section 4.1.15 of ovsdb-server(7) for details of related OVSDB protocol extension. + * Support to convert from cluster database to standalone database is now + available when clustered is down and cannot be revived using ovsdb-tool + . Check "Database Migration Commands" in ovsdb-tool man section. - OVN: * IPAM/MACAM: - select IPAM mac_prefix in a random manner if not provided by the user diff --git a/ovsdb/ovsdb-tool.1.in b/ovsdb/ovsdb-tool.1.in index ec85e14c4..31a918d90 100644 --- a/ovsdb/ovsdb-tool.1.in +++ b/ovsdb/ovsdb-tool.1.in @@ -147,6 +147,14 @@ avoid this possibility, specify \fB\-\-cid=\fIuuid\fR, where \fIuuid\fR is the cluster ID of the cluster to join, as printed by \fBovsdb\-tool get\-cid\fR. . +.SS "Database Migration Commands" +This commands will convert cluster database to standalone database. +. +.IP "\fBcluster\-to\-standalone\fI db clusterdb" +Use this command to convert to standalone database from clustered database +when the cluster is down and cannot be revived. It creates new standalone +\fIdb\fR file from the given cluster \fIdb\fR file. +. .SS "Version Management Commands" .so ovsdb/ovsdb-schemas.man .PP diff --git a/ovsdb/ovsdb-tool.c b/ovsdb/ovsdb-tool.c index 438f97590..3bbf4c8bc 100644 --- a/ovsdb/ovsdb-tool.c +++ b/ovsdb/ovsdb-tool.c @@ -173,6 +173,9 @@ usage(void) " compare-versions A OP B compare OVSDB schema version numbers\n" " query [DB] TRNS execute read-only transaction on DB\n" " transact [DB] TRNS execute read/write transaction on DB\n" + " cluster-to-standalone DB DBConvert clustered DB to\n" + " standalone DB when cluster is down and cannot be\n" + "revived\n" " [-m]... show-log [DB] print DB's log entries\n" "The default DB is %s.\n" "The default SCHEMA is %s.\n", @@ -942,6 +945,55 @@ print_raft_record(const struct raft_record *r, } } +static void +raft_header_to_standalone_log(const struct raft_header *h, + struct ovsdb_log *db_log_data) +{ +if (h->snap_index) { +if (!h->snap.data || json_array(h->snap.data)->n != 2) { +ovs_fatal(0, "Incorrect raft header data array length"); +} + +struct json *schema_json = json_array(h->snap.data)->elems[0]; +if (schema_json->type != JSON_NULL) { +struct ovsdb_schema *schema; +check_ovsdb_error(ovsdb_schema_from_json(schema_json, )); +ovsdb_schema_destroy(schema); +check_ovsdb_error(ovsdb_log_write_and_free(db_log_data, + schema_json)); +} + +struct json *data_json = json_array(h->snap.data)->elems[1]; +if (!data_json || data_json->type != JSON_OBJECT) { +ovs_fatal(0, "Invalid raft header data"); +} +if (data_json->type != JSON_NULL) { +check_ovsdb_error(ovsdb_log_write_and_free(db_log_data, + data_json)); +} +} +} + +static void +raft_record_to_standalone_log(const struct raft_record *r, + struct ovsdb_log *db_log_data) +{ +if (r->type == RAFT_REC_ENTRY) { +if (!r->entry.data) { +return; +} +if (json_array(r->entry.data)->n != 2) { +ovs_fatal(0, "Incorrect raft record array length"); +} + +struct json *data_json = json_array(r->entry.data)->elems[1]; +if (data_json->type != JSON_NULL) { +