extern struct ubik_stats { /* random stats */
afs_int32 escapes;
} ubik_stats;
-extern afs_int32 ubik_epochTime; /* time when this site started */
extern afs_int32 urecovery_state; /* sync site recovery process state */
extern struct ubik_trans *ubik_currentTrans; /* current trans */
extern afs_int32 ubik_debugFlag; /* ubik debug flag */
extern int ubikPrimaryAddrOnly; /* use only primary address */
-/* this extern gives the sync site's db version, with epoch of 0 if none yet */
+/*
+ * Lock ordering
+ *
+ * Any of the locks may be acquired singly; when acquiring multiple locks, they
+ * should be acquired in the listed order:
+ * application cache lock (dbase->cache_lock)
+ * database lock DBHOLD/DBRELE
+ * beacon lock UBIK_BEACON_LOCK/UNLOCK
+ * vote lock UBIK_VOTE_LOCK/UNLOCK
+ * version lock UBIK_VERSION_LOCK/UNLOCK
+ * server address lock UBIK_ADDR_LOCK/UNLOCK
+ */
/*!
* \brief Global beacon data. All values are protected by beacon_lock
#define UBIK_ADDR_LOCK MUTEX_ENTER(&addr_globals.addr_lock)
#define UBIK_ADDR_UNLOCK MUTEX_EXIT(&addr_globals.addr_lock)
+/*!
+ * \brief The version lock protects the structure member, as well as
+ * the database version, flags, tidCounter, writeTidCounter
+ */
+struct version_data {
+#ifdef AFS_PTHREAD_ENV
+ pthread_mutex_t version_lock;
+#endif
+ afs_int32 ubik_epochTime; /* time when this site started */
+};
+
+#define UBIK_VERSION_LOCK MUTEX_ENTER(&version_globals.version_lock)
+#define UBIK_VERSION_UNLOCK MUTEX_EXIT(&version_globals.version_lock)
+
/* phys.c */
extern int uphys_stat(struct ubik_dbase *adbase, afs_int32 afid,
struct ubik_stat *astat);
char clones[]);
extern int ubeacon_InitServerList(afs_uint32 ame, afs_uint32 aservers[]);
extern void *ubeacon_Interact(void *);
+extern int ubeacon_updateUbikNetworkAddress(afs_uint32 ubik_host[]);
extern struct beacon_data beacon_globals;
extern struct addr_data addr_globals;
extern struct vote_data vote_globals;
extern void uvote_set_dbVersion(struct ubik_version);
extern int uvote_eq_dbVersion(struct ubik_version);
+extern int uvote_HaveSyncAndVersion(struct ubik_version);
/*\}*/
#endif /* UBIK_INTERNALS */
extern int ubik_CheckCache(struct ubik_trans *atrans,
ubik_updatecache_func check,
void *rock);
+extern struct version_data version_globals;
/*\}*/
/*! \name ubikclient.c */