ubik: Clarify UBIK_VERSION_LOCK semantics
[openafs.git] / src / ubik / ubik.p.h
index 23a6a0d..66c03a8 100644 (file)
 #include <lwp.h>
 #endif
 
+/*! Sanity check: This macro represents an arbitrary date in the past
+ * (Tue Jun 20 15:36:43 2017). The database epoch must be greater or
+ * equal to this value. */
+#define        UBIK_MILESTONE      1497987403
+
 /*!
  * \brief per-client structure for ubik
  */
@@ -118,14 +123,9 @@ struct ubik_trunc {
 
 struct ubik_stat {
     afs_int32 size;
-    afs_int32 mtime;
 };
 
-#if defined(UKERNEL)
-#include "afs/lock.h"
-#else /* defined(UKERNEL) */
 #include <lock.h>              /* just to make sure we've got this */
-#endif /* defined(UKERNEL) */
 
 /*!
  * \brief representation of a ubik database.
@@ -139,11 +139,9 @@ struct ubik_dbase {
     struct ubik_version version;       /*!< version number */
 #ifdef AFS_PTHREAD_ENV
     pthread_mutex_t versionLock;       /*!< lock on version number */
-#elif defined(UKERNEL)
-    struct afs_lock versionLock;       /*!< lock on version number */
-#else                          /* defined(UKERNEL) */
+#else
     struct Lock versionLock;   /*!< lock on version number */
-#endif                         /* defined(UKERNEL) */
+#endif
     afs_int32 tidCounter;      /*!< last RW or RO trans tid counter */
     afs_int32 writeTidCounter; /*!< last write trans tid counter */
     afs_int32 flags;           /*!< flags */
@@ -161,15 +159,11 @@ struct ubik_dbase {
     int (*setlabel) (struct ubik_dbase * adbase, afs_int32 afile, struct ubik_version * aversion);     /*!< set the version label */
     int (*getlabel) (struct ubik_dbase * adbase, afs_int32 afile, struct ubik_version * aversion);     /*!< retrieve the version label */
     int (*getnfiles) (struct ubik_dbase * adbase);     /*!< find out number of files */
+    int (*buffered_append)(struct ubik_dbase *adbase, afs_int32 afid, void *adata, afs_int32 alength);
     short readers;             /*!< number of current read transactions */
     struct ubik_version cachedVersion; /*!< version of caller's cached data */
-#ifdef UKERNEL
-    struct afs_lock cache_lock;
-#else
     struct Lock cache_lock; /*!< protects cached application data */
-#endif
 #ifdef AFS_PTHREAD_ENV
-    pthread_cond_t version_cond;    /*!< condition variable to manage changes to version */
     pthread_cond_t flags_cond;      /*!< condition variable to manage changes to flags */
 #endif
 };
@@ -372,6 +366,7 @@ struct beacon_data {
 #endif
     int ubik_amSyncSite;               /*!< flag telling if I'm sync site */
     afs_int32 syncSiteUntil;           /*!< valid only if amSyncSite */
+    int ubik_syncSiteAdvertised;       /*!< flag telling if remotes are aware we have quorum */
 };
 
 #define UBIK_BEACON_LOCK opr_mutex_enter(&beacon_globals.beacon_lock)
@@ -422,7 +417,9 @@ struct addr_data {
 
 /*!
  * \brief The version lock protects the structure member, as well as
- * the database version, flags, tidCounter, writeTidCounter
+ * the database version, flags, tidCounter, writeTidCounter. Reading these
+ * values can be done while holding either UBIK_VERSION_LOCK or DBHOLD. Writing
+ * these requires holding both locks.
  */
 struct version_data {
 #ifdef AFS_PTHREAD_ENV
@@ -453,6 +450,8 @@ extern int uphys_setlabel(struct ubik_dbase *adbase, afs_int32 afile,
 extern int uphys_sync(struct ubik_dbase *adbase, afs_int32 afile);
 extern void uphys_invalidate(struct ubik_dbase *adbase,
                             afs_int32 afid);
+extern int uphys_buf_append(struct ubik_dbase *adbase, afs_int32 afid,
+                            void *buf, afs_int32 alength);
 
 /*! \name recovery.c */
 extern int urecovery_ResetState(void);
@@ -467,31 +466,6 @@ extern int DoProbe(struct ubik_server *server);
 /*\}*/
 
 /*! \name ubik.c */
-extern afs_int32 ContactQuorum_NoArguments(afs_int32 (*proc)
-                                                      (struct rx_connection *,
-                                                       ubik_tid *),
-                                          struct ubik_trans *atrans,
-                                          int aflags);
-
-extern afs_int32 ContactQuorum_DISK_Lock(struct ubik_trans *atrans,
-                                        int aflags,
-                                        afs_int32 file, afs_int32 position,
-                                        afs_int32 length, afs_int32 type);
-
-extern afs_int32 ContactQuorum_DISK_Write(struct ubik_trans *atrans,
-                                         int aflags,
-                                         afs_int32 file, afs_int32 position,
-                                         bulkdata *data);
-
-extern afs_int32 ContactQuorum_DISK_Truncate(struct ubik_trans *atrans,
-                                            int aflags,
-                                            afs_int32 file, afs_int32 length);
-
-extern afs_int32 ContactQuorum_DISK_WriteV(struct ubik_trans *atrans,
-                                          int aflags,
-                                          iovec_wrt * io_vector,
-                                          iovec_buf *io_buffer);
-
 extern afs_int32 ContactQuorum_DISK_SetVersion(struct ubik_trans *atrans,
                                               int aflags,
                                               ubik_version *OldVersion,
@@ -512,6 +486,7 @@ extern void ubeacon_InitSecurityClass(void);
 extern void ubeacon_ReinitServer(struct ubik_server *ts);
 extern void ubeacon_Debug(struct ubik_debug *aparm);
 extern int ubeacon_AmSyncSite(void);
+extern int ubeacon_SyncSiteAdvertised(void);
 extern int ubeacon_InitServerListByInfo(afs_uint32 ame,
                                        struct afsconf_cell *info,
                                        char clones[]);
@@ -551,17 +526,6 @@ extern void ulock_Debug(struct ubik_debug *aparm);
 extern int uvote_ShouldIRun(void);
 extern afs_int32 uvote_GetSyncSite(void);
 extern int uvote_Init(void);
-extern void ubik_vprint(const char *format, va_list ap)
-    AFS_ATTRIBUTE_FORMAT(__printf__, 1, 0);
-
-extern void ubik_print(const char *format, ...)
-    AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
-
-extern void ubik_dprint(const char *format, ...)
-    AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
-
-extern void ubik_dprint_25(const char *format, ...)
-    AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
 extern struct vote_data vote_globals;
 extern void uvote_set_dbVersion(struct ubik_version);
 extern int uvote_eq_dbVersion(struct ubik_version);
@@ -609,10 +573,6 @@ extern int ubik_Truncate(struct ubik_trans *transPtr,
                         afs_int32 length);
 extern int ubik_SetLock(struct ubik_trans *atrans, afs_int32 apos,
                        afs_int32 alen, int atype);
-extern int ubik_WaitVersion(struct ubik_dbase *adatabase,
-                           struct ubik_version *aversion);
-extern int ubik_GetVersion(struct ubik_trans *atrans,
-                          struct ubik_version *avers);
 extern int ubik_CheckCache(struct ubik_trans *atrans,
                            ubik_updatecache_func check,
                            void *rock);
@@ -627,6 +587,15 @@ extern int ubik_ClientInit(struct rx_connection **serverconns,
                           struct ubik_client **aclient);
 extern afs_int32 ubik_ClientDestroy(struct ubik_client *aclient);
 extern struct rx_connection *ubik_RefreshConn(struct rx_connection *tc);
+
+struct ubik_callrock_info {
+    struct rx_connection *conn;
+};
+typedef afs_int32 (*ubik_callrock_func)(struct ubik_callrock_info *info, void *rock);
+extern afs_int32 ubik_CallRock(struct ubik_client *aclient, afs_int32 aflags,
+                              ubik_callrock_func proc, void *rock)
+                              AFS_NONNULL((3));
+
 #ifdef UBIK_LEGACY_CALLITER
 extern afs_int32 ubik_CallIter(int (*aproc) (), struct ubik_client *aclient,
                               afs_int32 aflags, int *apos, long p1, long p2,
@@ -650,6 +619,7 @@ extern int ubik_ParseServerList(int argc, char **argv, afs_uint32 *ahost,
 
 struct rx_securityClass;
 struct afsconf_dir;
+typedef int (*ugen_secproc_func)(struct rx_securityClass *, afs_int32);
 extern int ugen_ClientInitCell(struct afsconf_dir *dir,
                               struct afsconf_cell *info,
                               int secFlags,
@@ -663,15 +633,13 @@ extern int ugen_ClientInitServer(const char *confDir, char *cellName,
                                 afs_uint32 port);
 extern int ugen_ClientInitFlags(const char *confDir, char *cellName,
                                int secFlags, struct ubik_client **uclientp,
-                               int (*secproc) (struct rx_securityClass *,
-                                               afs_int32),
+                               ugen_secproc_func secproc,
                                int maxservers, char *serviceid,
                                int deadtime);
 extern afs_int32 ugen_ClientInit(int noAuthFlag, const char *confDir,
                                 char *cellName, afs_int32 sauth,
                                 struct ubik_client **uclientp,
-                                int (*secproc) (struct rx_securityClass *sc,
-                                                afs_int32 scIndex),
+                                ugen_secproc_func secproc,
                                 char *funcName,
                                 afs_int32 gen_rxkad_level,
                                 afs_int32 maxservers, char *serviceid,