mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 01:51:26 +00:00
Compaction thread supposed to not change anything in the database it is working on, since the same data can be accessed by the main thread at the same time. However, while converting database rows to JSON objects, strings in the datum will be cloned using json_clone(), which is a shallow copy, and that will change the reference counter for the JSON string object. If both the main thread and the compaction thread will clone/destroy the same object at the same time we may end up with a broken reference counter leading to a memory leak or use-after free. Adding a new argument to the database to JSON conversion to prevent use of shallow copies from the compaction thread. This way all the database operations will be truly read-only avoiding the race. 'ovsdb_atom_to_json' and 'ovsdb_datum_to_json' are more widely used, so creating separate variant for these functions instead of adding a new argument, to avoid changing a lot of existing code. Other solution might be to use atomic reference counters, but that will require API/ABI break, because counter is exposed in public headers. Also, we can not easily expose atomic functions, so we'll need to un-inline reference counting with the associated performance cost. Fixes: 3cd2cbd684e0 ("ovsdb: Prepare snapshot JSON in a separate thread.") Reported-at: https://bugzilla.redhat.com/2133431 Acked-by: Dumitru Ceara <dceara@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
48 lines
1.8 KiB
C
48 lines
1.8 KiB
C
/* Copyright (c) 2009, 2010, 2011, 2016, 2017 Nicira, Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef OVSDB_FILE_H
|
|
#define OVSDB_FILE_H 1
|
|
|
|
#include <stdbool.h>
|
|
#include "compiler.h"
|
|
|
|
struct ovsdb;
|
|
struct ovsdb_schema;
|
|
struct ovsdb_txn;
|
|
|
|
void ovsdb_file_column_diff_disable(void);
|
|
|
|
struct json *ovsdb_to_txn_json(const struct ovsdb *, const char *comment,
|
|
bool allow_shallow_copies);
|
|
struct json *ovsdb_file_txn_to_json(const struct ovsdb_txn *);
|
|
struct json *ovsdb_file_txn_annotate(struct json *, const char *comment);
|
|
struct ovsdb_error *ovsdb_file_txn_from_json(struct ovsdb *,
|
|
const struct json *,
|
|
bool converting,
|
|
struct ovsdb_txn **)
|
|
OVS_WARN_UNUSED_RESULT;
|
|
|
|
struct ovsdb *ovsdb_file_read(const char *filename, bool rw);
|
|
struct ovsdb *ovsdb_file_read_as_schema(const char *filename,
|
|
struct ovsdb_schema *);
|
|
|
|
struct ovsdb_error *ovsdb_convert(const struct ovsdb *src,
|
|
const struct ovsdb_schema *new_schema,
|
|
struct ovsdb **dstp)
|
|
OVS_WARN_UNUSED_RESULT;
|
|
|
|
#endif /* ovsdb/file.h */
|