ubik: add uvote_HaveSyncAndVersion
[openafs.git] / src / ubik / ubik.p.h
index 7851896..109c766 100644 (file)
@@ -340,13 +340,23 @@ extern int ubik_amSyncSite;       /* sleep on this waiting to be sync site */
 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
@@ -411,6 +421,20 @@ struct addr_data {
 #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);
@@ -494,6 +518,7 @@ extern int ubeacon_InitServerListByInfo(afs_uint32 ame,
                                        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;
 
@@ -541,6 +566,7 @@ extern void ubik_dprint_25(const char *format, ...)
 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 */
@@ -591,6 +617,7 @@ extern int ubik_GetVersion(struct ubik_trans *atrans,
 extern int ubik_CheckCache(struct ubik_trans *atrans,
                            ubik_updatecache_func check,
                            void *rock);
+extern struct version_data version_globals;
 /*\}*/
 
 /*! \name ubikclient.c */