X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ovsdb%2Ffile.c;h=43fcb95643e93f387e69a2fb21887099a2a97f5e;hb=5c7f58830a25520f7e18225b79de2774b9e9e012;hp=bf72316ccf19c01f5e20b86ef180062370fe7160;hpb=f7c21036f9cc592727b791f9e7bee8bc75ed7285;p=openvswitch diff --git a/ovsdb/file.c b/ovsdb/file.c index bf72316c..43fcb956 100644 --- a/ovsdb/file.c +++ b/ovsdb/file.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira Networks +/* Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -215,6 +215,7 @@ ovsdb_file_open__(const char *file_name, &date, &txn); json_destroy(json); if (error) { + ovsdb_log_unread(log); break; } @@ -223,14 +224,18 @@ ovsdb_file_open__(const char *file_name, oldest_commit = date; } - ovsdb_txn_commit(txn, false); + error = ovsdb_txn_commit(txn, false); + if (error) { + ovsdb_log_unread(log); + break; + } } if (error) { /* Log error but otherwise ignore it. Probably the database just got * truncated due to power failure etc. and we should use its current * contents. */ char *msg = ovsdb_error_to_string(error); - VLOG_WARN("%s", msg); + VLOG_ERR("%s", msg); free(msg); ovsdb_error_destroy(error); @@ -328,10 +333,9 @@ ovsdb_file_txn_row_from_json(struct ovsdb_txn *txn, struct ovsdb_table *table, error = ovsdb_file_update_row_from_json(new, converting, json); if (error) { ovsdb_row_destroy(new); + } else { + ovsdb_txn_row_insert(txn, new); } - - ovsdb_txn_row_insert(txn, new); - return error; } } @@ -527,11 +531,14 @@ ovsdb_file_create(struct ovsdb *db, struct ovsdb_log *log, { long long int now = time_msec(); struct ovsdb_file *file; + char *deref_name; char *abs_name; /* Use the absolute name of the file because ovsdb-server opens its * database before daemonize() chdirs to "/". */ - abs_name = abs_file_name(NULL, file_name); + deref_name = follow_symlinks(file_name); + abs_name = abs_file_name(NULL, deref_name); + free(deref_name); if (!abs_name) { *filep = NULL; return ovsdb_io_error(0, "could not determine current " @@ -595,7 +602,7 @@ ovsdb_file_commit(struct ovsdb_replica *replica, /* If it has been at least COMPACT_MIN_MSEC millseconds since the last time * we compacted (or at least COMPACT_RETRY_MSEC since the last time we * tried), and if there are at least 100 transactions in the database, and - * if the database is at least 1 MB, then compact the database. */ + * if the database is at least 10 MB, then compact the database. */ if (time_msec() >= file->next_compact && file->n_transactions >= 100 && ovsdb_log_get_offset(file->log) >= 10 * 1024 * 1024) @@ -605,7 +612,8 @@ ovsdb_file_commit(struct ovsdb_replica *replica, char *s = ovsdb_error_to_string(error); ovsdb_error_destroy(error); VLOG_WARN("%s: compacting database failed (%s), retrying in " - "60 seconds", file->file_name, s); + "%d seconds", + file->file_name, s, COMPACT_RETRY_MSEC / 1000); free(s); file->next_compact = time_msec() + COMPACT_RETRY_MSEC; @@ -641,7 +649,7 @@ ovsdb_file_compact(struct ovsdb_file *file) /* Lock temporary file. */ tmp_name = xasprintf("%s.tmp", file->file_name); - retval = lockfile_lock(tmp_name, 0, &tmp_lock); + retval = lockfile_lock(tmp_name, &tmp_lock); if (retval) { error = ovsdb_io_error(retval, "could not get lock on %s", tmp_name); goto exit;