#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
*/
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.
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 */
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
};
#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)
/*!
* \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
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);
/*\}*/
/*! \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,
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[]);
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);
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);
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,
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,
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,