Coda Distributed File System
venusvol.h
Go to the documentation of this file.
1/* BLURB gpl
2
3 Coda File System
4 Release 8
5
6 Copyright (c) 1987-2025 Carnegie Mellon University
7 Additional copyrights listed below
8
9This code is distributed "AS IS" without warranty of any kind under
10the terms of the GNU General Public Licence Version 2, as shown in the
11file LICENSE. The technical and financial contributors to Coda are
12listed in the file CREDITS.
13
14 Additional copyrights
15 none currently
16
17#*/
18
19#ifndef _VENUS_VOLUME_H_
20#define _VENUS_VOLUME_H_ 1
21
22/*
23 *
24 * Specification of the Venus Volume abstraction.
25 *
26 */
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
32#include <stdarg.h>
33#include <stdio.h>
34#include <rpc2/errors.h>
35#include <rpc2/rpc2.h>
36#include <rpc2/se.h>
37
38/* For VENUS_CallBackFetch prototype */
39#include <callback.h>
40#include <codadir.h>
41
42#ifdef __cplusplus
43}
44#endif
45
46/* interfaces */
47#include <vice.h>
48
49/* from util */
50#include <dlist.h>
51#include <rec_dlist.h>
52#include <olist.h>
53#include <rec_olist.h>
54#include <ohash.h>
55#include <rec_ohash.h>
56
57/* from vol */
58#include <voldefs.h>
59
60/* from venus */
61#include "comm.h"
62#include "venusrecov.h"
63#include "realmdb.h"
64#include "venus.private.h"
65#include "vsg.h"
66
67/* Forward declarations. */
68class ClientModifyLog;
69class cmlent;
70class cml_iterator;
71class cmlstats;
72
73class connent; /* needed because of circular includes! */
74class mgrpent;
75class vdb;
76class volent;
77class cop2ent;
78class resent;
79
80/* volume pgid locking type */
81/* Was: EXCLUSIVE, *SHARED*: name clash on Solaris */
83{
86};
87
88/* ***** Constants ***** */
89
90#define VDB (rvg->recov_VDB)
91const int VDB_MagicNumber = 6820348;
92const int VDB_NBUCKETS = 512;
93const int VOLENT_MagicNumber = 3614246;
94const int MLENT_MagicNumber = 5214113;
95const int MLENTMaxFreeEntries = 32;
96
97const int UNSET_TID = -1;
98
99const unsigned V_UNSETAGE = (unsigned)-1; /* huge */
100const unsigned V_UNSETREINTLIMIT = (unsigned)-1; /* huge */
101
102/* Volume-User modes. */
103#define VM_MUTATING 0x1
104#define VM_OBSERVING 0x2
105#define VM_RESOLVING 0x4
106#define VM_NDELAY \
107 0x8 /* this is really a flag! it is not
108 exclusive with the others!
109 Indicates the caller doesn't want
110 to be put to sleep if the volume is
111 already locked. It's necessary to
112 keep daemons from getting ``stuck''
113 on volumes already in use. */
115/* Define for 'no ASR running' */
116#define NO_ASR 0
118/* ***** Types ***** */
120class cmlstats {
121public:
122 int store_count; /* number of store records */
123 float store_size; /* size (in bytes) of store records, excluding contents */
124 float store_contents_size; /* size (in bytes) of store record contents */
125 int other_count; /* number of records other than stores */
126 float other_size; /* size (in bytes) of non-stores */
127
128 cmlstats() { clear(); }
129
130 void clear()
131 {
132 store_count = 0;
135 other_count = 0;
136 other_size = 0.0;
137 }
138
139 void operator+=(cmlstats &addend)
140 {
141 store_count += addend.store_count;
142 store_size += addend.store_size;
144 other_count += addend.other_count;
149/* Log containing records of partitioned operations performed at the client. */
150/* This type is persistent! */
151class ClientModifyLog {
152 friend class cmlent;
153 friend class cml_iterator;
154 friend class repvol;
155 friend class reintvol;
156 friend class volent; /* ::Enter(int, uid_t); */
157 /* ::Exit(int, uid_t) */
158
159 rec_dlist list; /* link to cmlents */
160 /*T*/ uid_t owner; /* writer of all entries in Log */
161 /*T*/ long entries; /* number of records in the CML */
162 /*T*/ long entriesHighWater; /* reset when count == zero */
163 /*T*/ long bytes; /* number of bytes used by CML */
164 /*T*/ long bytesHighWater; /* reset when size == 0 */
165 /*T*/ char cancelFrozenEntries; /* flag indicating whether it's safe to
166 * auto-thaw and cancel frozen entries */
167 cmlstats cancellations;
168
169 /* Size of the Log -- private, because it is only called
170 * to reset the tranients bytes and bytesHighWater
171 */
172 long _bytes();
173
174public:
176 ~ClientModifyLog() { CODA_ASSERT(count() == 0); }
177 void ResetTransient();
178 void ResetHighWater()
179 {
180 entriesHighWater = entries;
181 bytesHighWater = bytes;
182 }
184
185 /* Log optimization routines. */
188
189 /* Reintegration routines. */
191 int COP1(char *, int, ViceVersionVector *,
192 int outoforder) EXCLUDES_TRANSACTION;
193 int COP1_NR(char *buf, int bufsize, ViceVersionVector *,
194 int outoforder) EXCLUDES_TRANSACTION;
195 void UnLockObjs(int);
196 void MarkFailedMLE(int);
203
204 int GetReintegrateable(int, unsigned long *, int *) EXCLUDES_TRANSACTION;
206
207 /* Call to set/clear flags for whether it's safe to cancel frozen entries */
208 void cancelFreezes(char flag) { cancelFrozenEntries = flag; }
209
210 /* Routines for handling inconsistencies and safeguarding against catastrophe! */
211 void MakeUsrSpoolDir(char *);
215
216 long logBytes() { return bytes; }
217 long logBytesHighWater() { return bytesHighWater; }
218 int count() { return list.count(); }
219 long countHighWater() { return entriesHighWater; }
220 uid_t Owner() { return owner; }
221
222 void print() { print(stdout); }
223 void print(FILE *fp)
224 {
225 fflush(fp);
226 print(fileno(fp));
227 }
228 void print(int);
229
230 /* local-repair methods */
231 void IncThread(int); /*N*/
232 void IncPack(char **, int *, int); /*N*/
233 int OutOfOrder(int tid); /*N*/
234 void IncCommit(ViceVersionVector *, int) EXCLUDES_TRANSACTION; /*U*/
235 void IncAbort(int = UNSET_TID) EXCLUDES_TRANSACTION; /*U*/
236 void IncGetStats(cmlstats &, cmlstats &, int = UNSET_TID); /*N*/
238 int HaveElements(int) EXCLUDES_TRANSACTION; /*N*/
242 void CheckCMLHead(char *msg) EXCLUDES_TRANSACTION; /*U*/
243 int ListCML(FILE *) EXCLUDES_TRANSACTION; /*N*/
246/* local-repair addition */
247struct CmlFlags {
248 unsigned to_be_repaired : 1;
249 unsigned unused : 1;
250 unsigned frozen : 1; /* do not cancel */
251 unsigned cancellation_pending : 1; /* once unfrozen */
252 /*T*/ unsigned failed : 1; /* offending record */
253 /*T*/ unsigned committed : 1; /* committed at server */
254 unsigned prepended : 1;
255 unsigned reserved : 25;
256};
257
258/*
259 BEGIN_HTML
260 <a name="cmlent"><strong> class definition for logged mutation operation entry </strong></a>
261 END_HTML
263/* local-repair modification */
264/* Entries representing partitioned operations performed at the client. */
265/* This type is persistent! */
266class cmlent {
267 friend class ClientModifyLog;
268 friend class cml_iterator;
269 friend class volent;
270 friend class repvol;
271 friend class reintvol;
272 friend class fsobj;
273 friend int PathAltered(VenusFid *, char *, ClientModifyLog *, cmlent *);
274
275 ClientModifyLog *log;
276 rec_dlink handle;
277
278 ViceStoreId sid; /* transaction identifier */
279 Date_t time; /* mtime of operation */
280 UserId uid; /* author of operation */
281 int tid; /* local-repair addition */
282 CmlFlags flags; /* local-repair addition */
283 /*T*/ int expansions;
285 /* Discriminant and sub-type specific members. */
286 int opcode;
287 RPC2_String Name, NewName;
288 union {
289 struct {
292 /* T */ ViceVersionVector VV;
293 RPC2_Unsigned Offset; /* for partial reintegration */
294 ViceReintHandle RHandle;
295 struct in_addr ReintPH; /* chosen primaryhost & index */
296 int ReintPHix; /* for the partial reint. */
297 } u_store;
298 struct {
301 /* T */ ViceVersionVector VV;
302 } u_truncate;
303 struct {
305 Date_t Date;
306 /* T */ ViceVersionVector VV;
307 } u_utimes;
308 struct {
310 UserId Owner;
311 /* T */ ViceVersionVector VV;
312 } u_chown;
313 struct {
316 /* T */ ViceVersionVector VV;
318 struct {
322 /* T */ ViceVersionVector PVV;
324 struct {
327 int LinkCount;
328 /* T */ ViceVersionVector PVV;
329 /* T */ ViceVersionVector CVV;
331 struct {
334 /* T */ ViceVersionVector PVV;
335 /* T */ ViceVersionVector CVV;
337 struct {
341 /* T */ ViceVersionVector SPVV;
342 /* T */ ViceVersionVector TPVV;
343 /* T */ ViceVersionVector SVV;
345 struct {
349 /* T */ ViceVersionVector PVV;
351 struct {
354 /* T */ ViceVersionVector PVV;
355 /* T */ ViceVersionVector CVV;
357 struct {
361 /* T */ ViceVersionVector PVV;
362 } u_symlink;
363 struct {
366 Date_t Date;
367 UserId Owner;
369 ViceVersionVector OVV;
370 } u_repair;
371 } u;
372
373 /*T*/ dlist *
374 fid_bindings; /* list of (bindings to) fids referenced by this record */
375
376 /*T*/ dlist *pred; /* list of (bindings to) predecessor cmlents */
377 /*T*/ dlist *succ; /* list of (bindings to) successor cmlents */
378
379public:
380 void *operator new(size_t) REQUIRES_TRANSACTION;
381 cmlent(ClientModifyLog *, time_t, uid_t, int,
382 int...) REQUIRES_TRANSACTION; /* local-repair modification */
383 void ResetTransient();
385 void operator delete(void *) REQUIRES_TRANSACTION;
386
387 /* Size of an entry */
388 long bytes();
389
390 /* Log optimization routines. */
392
393 /* Reintegration routines. */
396 void thread();
397 int size();
398 void pack(BUFFER *);
399 void commit(ViceVersionVector *) REQUIRES_TRANSACTION;
401 int Aged();
402 unsigned long ReintTime(unsigned long bw);
403 unsigned long ReintAmount(unsigned long *reint_time);
404
406 int IsReintegrating();
407 int IsFrozen() { return flags.frozen; }
409
410 /* for partial reintegration */
413 int DoneSending();
416 int
417 WriteReintegrationHandle(unsigned long *reint_time) EXCLUDES_TRANSACTION;
418 int CloseReintegrationHandle(char *, int,
419 ViceVersionVector *) EXCLUDES_TRANSACTION;
420
421 /* Routines for handling inconsistencies and safeguarding against catastrophe! */
423 int checkpoint(FILE *);
424 void writeops(FILE *);
426 void getfids(VenusFid fid[3]);
427
430
431 void print() { print(stdout); }
432 void print(FILE *fp)
433 {
434 fflush(fp);
435 print(fileno(fp));
436 }
437 void print(int);
439 /* local-repair addition */
440 int GetTid() { return tid; } /*N*/
441 void SetTid(int) EXCLUDES_TRANSACTION; /*U*/
443 int ContainLocalFid(); /*N*/
445 void CheckRepair(char *, int *, int *) EXCLUDES_TRANSACTION; /*N*/
446 int DoRepair(char *, int) EXCLUDES_TRANSACTION; /*U*/
447 void GetLocalOpMsg(char *); /*N*/
449 void SetRepairMutationFlag(); /*U*/
450 int IsToBeRepaired() { return flags.to_be_repaired; } /*N*/
451 int IsExpanded() { return expansions; } /*T*/
452 void GetVVandFids(ViceVersionVector *[3], VenusFid *[3]); /*N*/
453 void GetAllFids(VenusFid *[3]); /*N*/
455
456#define CmlIterOrder DlIterOrder
457#define CommitOrder DlAscending
458#define AbortOrder DlDescending
459
460class cml_iterator {
461 ClientModifyLog *log;
462 CmlIterOrder order;
463 const VenusFid *fidp;
464 VenusFid fid;
465 cmlent *prelude; /* start iteration after this element */
466 dlist_iterator *next;
467 rec_dlist_iterator *rec_next;
468
469public:
471 const VenusFid * = NULL, cmlent * = 0);
474};
475
476/* used to be member of class vdb (Satya 3/31/95) */
478
479/* used to be in class vdb (Satya 5/20/95) */
481
482class fsobj;
484/* Volume Database. Dictionary for volume entries (volents). */
485class vdb {
486 friend void VolInit(void);
487 friend void VOLD_Init(void);
488 friend void VolDaemon(void);
489 friend class cmlent;
490 friend class volrep; /* for hashtab insert/remove */
491 friend class repvol; /* for hashtab insert/remove */
492 friend class nonrepvol_iterator;
493 friend class repvol_iterator;
494 friend class volrep_iterator;
495 friend class fsobj;
496 friend void RecovInit();
497
498 friend class Realm;
499
500 int MagicNumber;
501
502 /* Size parameters. */
503 int MaxMLEs; /* Limit on number of MLE's over _all_ volumes */
504 int AllocatedMLEs;
505
506 /* The hash tables for replicated volumes and volume replicas. */
507 rec_ohashtab volrep_hash;
508 rec_ohashtab repvol_hash;
509
510 /* The mle free list. */
511 rec_dlist mlefreelist;
512
513 /* Constructors, destructors. */
514 void *operator new(size_t) REQUIRES_TRANSACTION;
515 vdb();
516 void ResetTransient();
517 ~vdb() { abort(); }
518 void operator delete(void *);
519
520 /* Allocation/Deallocation routines. */
521 volent *Create(Realm *realm, VolumeInfo *,
522 const char *) EXCLUDES_TRANSACTION;
523
524 /* Daemon functions. */
525 void GetDown() EXCLUDES_TRANSACTION;
526 void FlushCOP2() EXCLUDES_TRANSACTION;
527 void CheckPoint(unsigned long) EXCLUDES_TRANSACTION;
528 void CheckLocalSubtree();
529
530public:
531 volent *Find(Volid *);
532 volent *Find(Realm *, const char *);
533 int Get(volent **, Volid *) EXCLUDES_TRANSACTION;
534 int Get(volent **, Realm *, const char *, fsobj *f) EXCLUDES_TRANSACTION;
535 void Put(volent **);
536
537 void DownEvent(struct in_addr *host);
538 void UpEvent(struct in_addr *host);
539
540 void AttachFidBindings(void) REQUIRES_TRANSACTION;
541 int
542 WriteDisconnect(unsigned int age = V_UNSETAGE,
543 unsigned int time = V_UNSETREINTLIMIT) EXCLUDES_TRANSACTION;
544 int SyncCache(void) EXCLUDES_TRANSACTION;
545 void GetCmlStats(cmlstats &, cmlstats &);
546
547 int CallBackBreak(Volid *) EXCLUDES_TRANSACTION;
548 void TakeTransition() EXCLUDES_TRANSACTION; /* also a daemon function */
549
550 void print() { print(stdout); }
551 void print(FILE *fp)
552 {
553 fflush(fp);
554 print(fileno(fp));
555 }
556 void print(int, int = 0);
558 void ListCache(FILE *, int long_format = 1, unsigned int valid = 3);
559 int FreeMLECount(void) { return MaxMLEs - AllocatedMLEs; }
562/* A volume is in exactly one of these states. */
563typedef enum
564{
565 Unreachable = 1,
566 Reachable,
567 Resolving,
570/* We save some space by packing booleans into a bit-vector. */
571/* R - replicated volumes */
572/* V - volume replicas */
573/* T - transients */
574struct VolFlags {
575 unsigned replicated : 1; /* is this a replicated vol or a vol replica */
576 /* T*/ unsigned transition_pending : 1;
577 /* T*/ unsigned demotion_pending : 1;
578 /*R */ unsigned unused1 : 1;
579 /*RT*/ unsigned allow_asrinvocation : 1; /* asr's allowed in this volume */
580 /*RT*/ unsigned asr_running : 1; /* only 1 ASR allowed per volume at a time */
581 /*R */ unsigned
582 has_local_subtree : 1; /* indicating whether this volume contains local subtrees */
583 /*RT*/ unsigned
584 unused2 : 1; /* used to be 'reintegration waiting for tokens */
585 /*RT*/ unsigned reintegrating : 1; /* are we reintegrating now? */
586 /*RT*/ unsigned repair_mode : 1; /* 0 --> normal, 1 --> repair */
587 /*RT*/ unsigned resolve_me : 1; /* resolve reintegrated objects */
588 /* */ unsigned unused3 : 3;
589 /*RT*/ unsigned sync_reintegrate : 1; /* perform reintegration synchronously*/
590 /* */ unsigned unused4 : 2;
591 /*V */ unsigned readonly : 1; /* is this a readonly (backup) volume replica */
592 /*RT*/ unsigned enable_asrinvocation : 1; /* asr's enabled in this volume */
593 /*VT*/ unsigned available : 1; /* is the server for this volume online? */
594 unsigned unused5 : 10;
595 unsigned reint_conflict : 1; /* set when the head of the CML is marked
596 as in conflict, should not be used as
597 authoritative information */
598 unsigned unauthenticated : 1; /* set when reintegration fails due to lack
599 of tokens, should not be used as
600 authoritative information */
602
603/* Descriptor for a range of pre-allocated fids. */
604struct FidRange : public ViceFidRange {
605 unsigned long Unused; /* was unused AllocHost */
606
607 FidRange()
608 {
609 Vnode = 0;
610 this->Unique = 0;
611 Stride = 0;
612 Count = 0;
614};
615
616typedef enum
617{
622class repvol;
624/* local-repair modification */
625/* A volume entry. */
626class volent {
627 friend class fsdb;
628 friend class fsobj;
629 friend class userent;
630 friend class vdb;
631 friend class volent_iterator;
632 friend class vproc; /* End_VFS(int *); wants vol->realm->GetUser() */
633
634 int MagicNumber;
635
636 /* State information. */
637 /*T*/ short waiter_count;
638 /*T*/ short excl_count; /* for volume pgid locking */
639 /*T*/ int excl_pgid; /* pgid for the exclusive lock holder */
640
641 /* Local synchronization state. */
642 /*T*/ char vol_sync;
643 /*T*/ int refcnt; /* count of fsobj's plus active threads */
644
645 /* Constructors, destructors, and private utility routines. */
646 volent(volent &) { abort(); } /* not supported! */
647 void *operator new(size_t) REQUIRES_TRANSACTION;
648 int operator=(volent &)
650 abort();
651 return (0);
652 } /* not supported! */
654protected:
655 char *name;
656 VolumeId vid;
661 Unique_t FidUnique;
662
663 rec_olink handle; /* link for repvol_hash/volrep_hash */
665 /* Fso's. */
666 /*T*/ struct dllist_head fso_list;
668 /* State information. */
669 /*T*/ short mutator_count;
670 /*T*/ short observer_count;
671 /*T*/ short resolver_count;
672 /*T*/ short shrd_count; /* for volume pgid locking */
673 /*T*/ int pgid; /* pgid of ASRLauncher and children (0 if none) */
674
675 void operator delete(void *) REQUIRES_TRANSACTION;
676 volent(Realm *r, VolumeId vid, const char *name) REQUIRES_TRANSACTION;
678 void ResetVolTransients();
679 ViceVolumeType VolStatType(void);
680
681public:
682 /* Volume synchronization. */
683 void hold();
684 void release();
685 int Enter(int, uid_t) EXCLUDES_TRANSACTION;
686 void Exit(int, uid_t) EXCLUDES_TRANSACTION;
690 void Signal();
692 void UnLock(VolLockType);
693 int Collate(connent *, int code, int TranslateEINCOMP = 1);
694
695 /* User-visible volume status. */
696 int GetVolStat(VolumeStatus *, RPC2_BoundedBS *, VolumeStateType *,
697 unsigned int *age, unsigned int *hogtime, int *conflict,
698 int *cml_size, uint64_t *cml_bytes, RPC2_BoundedBS *,
699 RPC2_BoundedBS *, uid_t,
700 int local_only) EXCLUDES_TRANSACTION;
701 int SetVolStat(VolumeStatus *, RPC2_BoundedBS *, RPC2_BoundedBS *,
704 /* Utility routines. */
705 void GetHosts(struct in_addr hosts[VSG_MEMBERS]);
706 void GetVids(VolumeId out[VSG_MEMBERS]);
707 int AVSGsize();
708 int IsBackup() { return (!flags.replicated && flags.readonly); }
709 int IsReplicated() { return flags.replicated; }
711 int IsNonReplicated();
712 int IsReadWrite() { return (IsReplicated() || IsNonReplicated()); }
713 int IsUnreachable() { return (state == Unreachable); }
714 int IsReachable() { return (state == Reachable); }
715 int IsResolving() { return (state == Resolving); }
716 int IsLocalRealm() { return (realm == LocalRealm); }
717 void GetMountPath(char *, int = 1);
718 void GetBandwidth(unsigned long *bw);
719
720 /* local-repair addition */
722 RealmId GetRealmId() { return realm->Id(); } /*N*/
723 VolumeId GetVolumeId() { return vid; } /*N*/
724 const char *GetName() { return name; } /*N*/
725
726 fsobj *NewFakeDirObj(const char *comp) REQUIRES_TRANSACTION;
728 const char *comp) REQUIRES_TRANSACTION;
729 int IsRepairVol(void)
730 {
731 return (realm->Id() == LocalRealm->Id() && vid == FakeRepairVolumeId);
732 }
733
734 void print() { print(stdout); }
735 void print(FILE *fp)
736 {
737 fflush(fp);
738 print(fileno(fp));
740 void print(int);
742 void ListCache(FILE *, int long_format = 1, unsigned int valid = 3);
745class reintvol : public volent {
746 friend class ClientModifyLog;
747 friend class fsobj;
748 friend class volent;
749 friend class cmlent;
750 friend class vdb;
753private:
754protected:
755 /* Preallocated Fids. */
759
760 /* Reintegration stuff. */
762 struct Lock CML_lock; /* for synchronization */
763 int reint_id_gen; /* reintegration id generator */
764 /*T*/ int cur_reint_tid; /* tid of reintegration in progress */
766 unsigned int ReintLimit; /* work limit, in MILLISECONDS */
767 unsigned int AgeLimit; /* min age of log records in SECONDS */
769 /*T*/ int RecordsCancelled;
770 /*T*/ int RecordsCommitted;
771 /*T*/ int RecordsAborted;
772 /*T*/ int FidsRealloced;
774 /*?*/ cmlent *reintegrate_done; /* WriteBack Caching */
775
776 /* Callback stuff */
777 /*T*/ CallBackStatus VCBStatus; /* do we have a volume callback? */
778 /*T*/ int VCBHits; /* # references hitting this callback */
779 ViceVersionVector VVV; /* (maximal) volume version vector */
782
783public:
784 reintvol(Realm *r, VolumeId volid, const char *volname);
786 long LengthOfCML() { return (CML.entries); }
788
789 /* local-repair */
790 void ClearRepairCML(); /*U*/
791 ClientModifyLog *GetCML() { return &CML; } /*N*/
792 int ContainUnrepairedCML(); /*N*/
793 int IsSync(void) { return (flags.sync_reintegrate || ReintLimit == 0); }
794 int
795 WriteDisconnect(unsigned int age = V_UNSETAGE,
797
798 /* Reintegration routines. */
801 int PartialReintegrate(int, unsigned long *reint_time) EXCLUDES_TRANSACTION;
802 int IsReintegrating() { return flags.reintegrating; }
805 void CheckTransition(); /*N*/
806 void IncAbort(int) EXCLUDES_TRANSACTION; /*U*/
808
809 void ReportVolState(void);
811 /* ASR routines */
812 int AllowASR(uid_t);
813 int DisallowASR(uid_t);
814 void EnableASR(uid_t);
815 int DisableASR(uid_t);
817 int IsASREnabled() { return flags.enable_asrinvocation; }
818 void lock_asr();
819 void unlock_asr();
820 int asr_running() { return flags.asr_running; }
821 void asr_pgid(pid_t new_pgid);
822 pid_t asr_pgid() { return pgid; }
823
824 int AllocFid(ViceDataType, VenusFid *, uid_t, int = 0) EXCLUDES_TRANSACTION;
825
827
828 int GetConn(connent **c, uid_t uid, mgrpent **m, int *ph_ix,
829 struct in_addr *phost) EXCLUDES_TRANSACTION;
830
831 /* local-repair modifications to the following methods */
832 /* Modlog routines. */
833 int LogStore(time_t, uid_t, VenusFid *, RPC2_Unsigned,
834 int prepend) REQUIRES_TRANSACTION;
835 int LogSetAttr(time_t, uid_t, VenusFid *, RPC2_Unsigned, Date_t, UserId,
837 int LogTruncate(time_t, uid_t, VenusFid *, RPC2_Unsigned,
838 int prepend) REQUIRES_TRANSACTION;
839 int LogUtimes(time_t, uid_t, VenusFid *, Date_t,
840 int prepend) REQUIRES_TRANSACTION;
841 int LogChown(time_t, uid_t, VenusFid *, UserId,
842 int prepend) REQUIRES_TRANSACTION;
843 int LogChmod(time_t, uid_t, VenusFid *, RPC2_Unsigned,
844 int prepend) REQUIRES_TRANSACTION;
845 int LogCreate(time_t, uid_t, VenusFid *, char *, VenusFid *, RPC2_Unsigned,
846 int prepend) REQUIRES_TRANSACTION;
847 int LogRemove(time_t, uid_t, VenusFid *, char *, const VenusFid *, int,
848 int prepend) REQUIRES_TRANSACTION;
849 int LogLink(time_t, uid_t, VenusFid *, char *, VenusFid *, int prepend);
850 int LogRename(time_t, uid_t, VenusFid *, char *, VenusFid *, char *,
851 VenusFid *, const VenusFid *, int,
852 int prepend) REQUIRES_TRANSACTION;
853 int LogMkdir(time_t, uid_t, VenusFid *, char *, VenusFid *, RPC2_Unsigned,
854 int prepend) REQUIRES_TRANSACTION;
855 int LogRmdir(time_t, uid_t, VenusFid *, char *, const VenusFid *,
856 int prepend) REQUIRES_TRANSACTION;
857 int LogSymlink(time_t, uid_t, VenusFid *, char *, char *, VenusFid *,
859 int LogRepair(time_t, uid_t, VenusFid *, RPC2_Unsigned, Date_t, UserId,
861 /* local-repair modifications to the above methods */
864 int LastMLETime(unsigned long *);
867 /* CML routines */
868 void ListCML(FILE *fp);
870 void PreserveLocalMutation(char *msg);
871 void DiscardAllLocalMutation(char *msg);
872 void DiscardLocalMutation(char *msg);
873
874 /* Callbacks routines */
875 int HaveCallBack() { return (VCBStatus == CallBackSet); }
877 void ClearCallBack();
878 void SetCallBack();
883 CallBackStatus CBStatus) EXCLUDES_TRANSACTION;
884 void PackVS(int, RPC2_CountedBS *);
885 int HaveStamp() { return (VV_Cmp(&VVV, &NullVV) != VV_EQ); }
888class srvent;
889
890/* A volume replica entry. */
891class volrep : public reintvol {
892 friend class vdb;
893 friend class volent;
894 friend void VolInit(void);
895
896 VolumeId replicated; /* replicated `parent' volume */
897 struct in_addr host; /* server that has this volume */
898
899 /*T*/ srvent *volserver; /* srvent of the server hosting this volume */
900
901 /* not yet used */
902 /*T*/ struct dllist_head vollist; /* links volumes to a srvent */
903
904 volrep(Realm *r, VolumeId vid, const char *name, struct in_addr *addr,
905 int readonly, VolumeId parent = 0);
906 ~volrep();
907 void ResetTransient() EXCLUDES_TRANSACTION;
908
909public:
910#ifdef VENUSDEBUG
911 static unsigned int allocs;
912 static unsigned int deallocs;
913#endif
914
915 VolumeId ReplicatedVol() { return replicated; }
916 int IsReadWriteReplica() { return (ReplicatedVol() != 0); }
917
918 int GetConn(connent **, uid_t) EXCLUDES_TRANSACTION;
919 void GetBandwidth(unsigned long *bw);
921 void DownMember(struct in_addr *host);
922 void UpMember(void);
923
924 /* Utility routines. */
925 void Host(struct in_addr *addr) { *addr = host; }
926 int IsAvailable() { return flags.available; }
927 int IsHostedBy(const struct in_addr *addr)
928 {
929 return (addr->s_addr == host.s_addr);
930 }
931 int OnSameHost(const volrep *v) { return volserver == v->volserver; }
933 void print_volrep(int);
936/* A replicated volume entry. */
937class repvol : public reintvol {
938 friend class cmlent;
939 friend class fsobj;
940 friend class reintvol;
941 friend class vdb;
942 friend class volent; /* CML_Lock */
943 friend long VENUS_CallBackFetch(RPC2_Handle, ViceFid *, SE_Descriptor *);
944 friend void Resolve(volent *);
945 friend void Reintegrate(reintvol *);
946 friend void VolInit(void);
947
948 volrep *volreps[VSG_MEMBERS]; /* underlying volume replicas */
949 volrep *ro_replica; /* R/O staging replica for this volume */
950 vsgent *vsg;
951
952 /* Resolution stuff. */
953 /*T*/ olist *res_list;
954
955 /* COP2 stuff. */
956 /*T*/ dlist *cop2_list;
957
958 repvol(Realm *r, VolumeId vid, const char *name, volrep *reps[VSG_MEMBERS]);
959 ~repvol();
960 void ResetTransient() EXCLUDES_TRANSACTION;
961
962public:
963#ifdef VENUSDEBUG
964 static unsigned int allocs;
965 static unsigned int deallocs;
966#endif
967
969 void GetBandwidth(unsigned long *bw);
970
971 void DownMember(struct in_addr *host);
972 void UpMember(void);
973
974 int Collate_NonMutating(mgrpent *, int);
975 int Collate_COP1(mgrpent *, int, ViceVersionVector *);
976 int Collate_Reintegrate(mgrpent *, int, ViceVersionVector *);
977 int Collate_COP2(mgrpent *, int);
978
979 /* Allocation routines. */
980 int AllocFid(ViceDataType, VenusFid *, uid_t, int = 0) EXCLUDES_TRANSACTION;
981
982 /* Utility routines. */
983 void GetHosts(struct in_addr hosts[VSG_MEMBERS]);
984 void GetVids(VolumeId out[VSG_MEMBERS]);
985 int AVSGsize();
986 int IsHostedBy(const struct in_addr *addr); /* XXX not called? */
987 void SetStagingServer(struct in_addr *srvr) EXCLUDES_TRANSACTION;
988 void Reconfigure(void);
989
990 /* Allocation routines. */
992
993 /* Repair routines. */
994 int Repair(VenusFid *, char *, uid_t, VolumeId *,
996 int ConnectedRepair(VenusFid *, char *, uid_t, VolumeId *,
998 int DisconnectedRepair(VenusFid *, char *, uid_t, VolumeId *,
1000 int LocalRepair(fsobj *, ViceStatus *, char *fname,
1003 /* Resolution routines */
1005 void ResSubmit(char **, VenusFid *, resent **requeue = NULL);
1006 int ResAwait(char *) EXCLUDES_TRANSACTION;
1007 int RecResolve(connent *, VenusFid *);
1008 int ResListCount() { return (res_list->count()); }
1009
1010 /* COP2 routines. */
1012 int COP2(mgrpent *, ViceStoreId *, ViceVersionVector *,
1013 int donotpiggy = 0) EXCLUDES_TRANSACTION;
1014 int FlushCOP2(time_t = 0) EXCLUDES_TRANSACTION;
1016 void GetCOP2(RPC2_CountedBS *);
1017 cop2ent *FindCOP2(ViceStoreId *);
1018 void AddCOP2(ViceStoreId *, ViceVersionVector *);
1019 void ClearCOP2(RPC2_CountedBS *);
1020 void ClearCOP2(void);
1021
1023 CallBackStatus *) EXCLUDES_TRANSACTION;
1024
1025 void print_repvol(int);
1026};
1027
1029public:
1030 volent_iterator(rec_ohashtab &hashtab, Volid *key);
1032 volent *operator()();
1033};
1034
1036public:
1037 repvol_iterator(Volid * = (Volid *)-1);
1038 repvol *operator()();
1039};
1040
1042public:
1043 nonrepvol_iterator(Volid * = (Volid *)-1);
1044 reintvol *operator()();
1045};
1046
1048public:
1049 volrep_iterator(Volid * = (Volid *)-1);
1050 volrep *operator()();
1051};
1053class reintvol_iterator {
1054 nonrepvol_iterator non_rep_iterator;
1055 repvol_iterator rep_iterator;
1056
1057public:
1058 reintvol_iterator(Volid *key = (Volid *)-1)
1059 : non_rep_iterator(key)
1060 , rep_iterator(key)
1063 reintvol *operator()();
1064};
1065
1066/* Entries representing pending COP2 events. */
1067class cop2ent : public dlink {
1068 friend class repvol;
1069
1070 ViceStoreId sid;
1071 ViceVersionVector updateset;
1072 time_t time;
1073
1074 void *operator new(size_t);
1075 cop2ent(ViceStoreId *, ViceVersionVector *);
1076 cop2ent(cop2ent &); /* not supported! */
1077 int operator=(cop2ent &); /* not supported! */
1078 ~cop2ent();
1079 void operator delete(void *);
1080
1081public:
1082#ifdef VENUSDEBUG
1083 static int allocs;
1084 static int deallocs;
1085#endif /* VENUSDEBUG */
1086
1087 void print();
1088 void print(FILE *);
1089 void print(int);
1091
1092/* Entries representing fids that need to be resolved. */
1093class resent : public olink {
1094 friend void repvol::Resolve();
1095 friend void repvol::ResSubmit(char **, VenusFid *, resent **requeue);
1096 friend int repvol::ResAwait(char *);
1097
1098 VenusFid fid;
1099 int result;
1100 int refcnt;
1101 int requeues;
1102
1103 resent(VenusFid *);
1104 resent(resent &); /* not supported! */
1105 int operator=(resent &); /* not supported! */
1106 ~resent();
1107
1109
1110public:
1111#ifdef VENUSDEBUG
1112 static int allocs;
1113 static int deallocs;
1114#endif /* VENUSDEBUG */
1115
1116 void print();
1117 void print(FILE *);
1118 void print(int);
1119};
1120
1121/* ***** Variables ***** */
1122extern int MLEs;
1123extern int LogOpts;
1124extern int allow_backfetch;
1125extern int vcbbreaks;
1126extern char voldaemon_sync;
1127extern char VCBEnabled;
1128
1129/* reintegration parameters, see venusvol.cc */
1130extern int default_reintegration_age;
1133/* ***** Functions/Procedures ***** */
1134
1135/* venusvol.c */
1136void VolInit(void) EXCLUDES_TRANSACTION;
1137void VolInitPost(void);
1138int VOL_HashFN(void *);
1139
1140/* vol_COP2.c */
1141const unsigned int COP2SIZE = 1024;
1142
1143/* vol_daemon.c */
1144extern void VOLD_Init(void);
1145
1146/* vol_reintegrate.c */
1147void Reintegrate(reintvol *);
1148
1149/* vol_resolve.c */
1150extern void Resolve(volent *);
1151
1152/* vol_cml.c */
1153extern void RecoverPathName(char *, VenusFid *, ClientModifyLog *, cmlent *);
1154extern int PathAltered(VenusFid *, char *, ClientModifyLog *, cmlent *);
1155
1156#define VOL_ASSERT(v, ex) \
1157 { \
1158 if (!(ex)) { \
1159 (v)->print(logFile); \
1160 CHOKE("Assertion failed: file \"%s\", line %d\n", __FILE__, \
1161 __LINE__); \
1162 } \
1163 }
1165#define PRINT_VOLSTATE(state) \
1166 ((state) == Resolving ? "Resolving" : \
1167 (state) == Unreachable ? "Unreachable" : \
1168 (state) == Reachable ? "Reachable" : \
1169 "???")
1170#define PRINT_VOLMODE(mode) \
1171 ((mode) & VM_OBSERVING ? "Observing" : \
1172 (mode) & VM_MUTATING ? "Mutating" : \
1173 (mode) & VM_RESOLVING ? "Resolving" : \
1174 "???")
1175#define PRINT_MLETYPE(op) \
1176 ((op) == CML_Store_OP ? "Store" : \
1177 (op) == CML_Truncate_OP ? "Truncate" : \
1178 (op) == CML_Utimes_OP ? "Utimes" : \
1179 (op) == CML_Chown_OP ? "Chown" : \
1180 (op) == CML_Chmod_OP ? "Chmod" : \
1181 (op) == CML_Create_OP ? "Create" : \
1182 (op) == CML_Remove_OP ? "Remove" : \
1183 (op) == CML_Link_OP ? "Link" : \
1184 (op) == CML_Rename_OP ? "Rename" : \
1185 (op) == CML_MakeDir_OP ? "Mkdir" : \
1186 (op) == CML_RemoveDir_OP ? "Rmdir" : \
1187 (op) == CML_SymLink_OP ? "Symlink" : \
1188 (op) == CML_Repair_OP ? "Repair" : \
1189 "???")
1190
1191#define FAKEROOTFID(fid) \
1192 ((fid).Vnode == 0xffffffff) /* && ((fid).Unique == 0x80000)) */
1193
1194#endif /* _VENUS_VOLUME_H_ */
Definition: venusvol.h:145
void MarkFailedMLE(int)
Definition: vol_cml.cc:418
void Clear() REQUIRES_TRANSACTION
Definition: vol_cml.cc:114
void TranslateFid(VenusFid *, VenusFid *) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1869
void IncThread(int)
Definition: vol_cml.cc:1878
int DiscardLocalMutation(char *) EXCLUDES_TRANSACTION
Definition: local_repair.cc:80
void MarkCommittedMLE(RPC2_Unsigned)
Definition: vol_cml.cc:457
void ClearToBeRepaired() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:4136
void ResetHighWater()
Definition: venusvol.h:172
long logBytesHighWater()
Definition: venusvol.h:211
~ClientModifyLog()
Definition: venusvol.h:170
int ListCML(FILE *) EXCLUDES_TRANSACTION
Definition: local_repair.cc:232
int COP1_NR(char *buf, int bufsize, ViceVersionVector *, int outoforder) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:2262
void IncCommit(ViceVersionVector *, int) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:2397
long countHighWater()
Definition: venusvol.h:213
void IncGetStats(cmlstats &, cmlstats &, int=UNSET_TID)
Definition: vol_cml.cc:134
void ResetTransient()
Definition: vol_cml.cc:84
void PreserveAllLocalMutation(char *) EXCLUDES_TRANSACTION
Definition: local_repair.cc:183
int count()
Definition: venusvol.h:212
int HaveElements(int) EXCLUDES_TRANSACTION
Definition: local_cml.cc:1264
cmlent * UtimesWriter(VenusFid *)
Definition: vol_cml.cc:1526
void IncPack(char **, int *, int)
Definition: vol_cml.cc:1943
void AttachFidBindings() REQUIRES_TRANSACTION
Definition: vol_cml.cc:3726
void print()
Definition: venusvol.h:216
void UnLockObjs(int)
void ClearPending() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:195
int GetReintegrateable(int, unsigned long *, int *) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:290
void MakeUsrSpoolDir(char *)
int COP1(char *, int, ViceVersionVector *, int outoforder) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:1984
void PreserveLocalMutation(char *) EXCLUDES_TRANSACTION
Definition: local_repair.cc:144
uid_t Owner()
Definition: venusvol.h:214
void CancelPending() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:167
void IncAbort(int=UNSET_TID) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:3656
void CheckCMLHead(char *msg) EXCLUDES_TRANSACTION
Definition: local_repair.cc:50
int IncReallocFids(int) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:1849
void HandleFailedMLE(void) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:477
cmlent * GetFatHead(int) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:369
int OutOfOrder(int tid)
Definition: vol_cml.cc:1923
void CancelStores() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:213
cmlent * LengthWriter(VenusFid *)
Definition: vol_cml.cc:1513
void cancelFreezes(char flag)
Definition: venusvol.h:202
int CheckPoint(char *) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:3538
ClientModifyLog() REQUIRES_TRANSACTION
Definition: venusvol.h:169
long logBytes()
Definition: venusvol.h:210
Definition: realm.h:31
const RealmId Id(void)
Definition: realm.h:62
void print(FILE *f)
Definition: realm.cc:292
void ResetTransient(void)
Definition: realm.cc:111
Definition: venusvol.h:454
cml_iterator(ClientModifyLog &, CmlIterOrder=CommitOrder, const VenusFid *=NULL, cmlent *=0)
Definition: vol_cml.cc:3994
cmlent * operator()()
Definition: vol_cml.cc:4032
~cml_iterator()
Definition: vol_cml.cc:4024
Definition: venusvol.h:260
int ContainLocalFid()
Definition: local_cml.cc:1246
void Thaw() REQUIRES_TRANSACTION
Definition: vol_cml.cc:259
cmlent(ClientModifyLog *, time_t, uid_t, int, int...) REQUIRES_TRANSACTION
Definition: vol_cml.cc:540
struct cmlent::@5::@8 u_utimes
ViceReintHandle RHandle
Definition: venusvol.h:288
VenusFid SFid
Definition: venusvol.h:334
void GetAllFids(VenusFid *[3])
Definition: local_cml.cc:1170
friend int PathAltered(VenusFid *, char *, ClientModifyLog *, cmlent *)
Definition: vol_cml.cc:3165
VenusFid PFid
Definition: venusvol.h:313
struct cmlent::@5::@18 u_repair
unsigned long ReintTime(unsigned long bw)
Definition: vol_cml.cc:3927
struct cmlent::@5::@17 u_symlink
int GetReintegrationHandle() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:2863
int Aged()
Definition: vol_cml.cc:3908
void SetRepairFlag() EXCLUDES_TRANSACTION
Definition: local_cml.cc:1070
VenusFid SPFid
Definition: venusvol.h:332
void AttachFidBindings() REQUIRES_TRANSACTION
Definition: vol_cml.cc:3735
struct cmlent::@5::@13 u_link
struct cmlent::@5::@7 u_truncate
int DoneSending()
Definition: vol_cml.cc:2853
struct cmlent::@5::@14 u_rename
void SetRepairMutationFlag()
int DoRepair(char *, int) EXCLUDES_TRANSACTION
Definition: local_cml.cc:568
void pack(BUFFER *)
Definition: vol_cml.cc:2650
void abort() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:3679
VenusFid TPFid
Definition: venusvol.h:333
Date_t Date
Definition: venusvol.h:299
struct cmlent::@5::@6 u_store
int LinkCount
Definition: venusvol.h:321
ViceVersionVector TPVV
Definition: venusvol.h:336
int checkpoint(FILE *)
Definition: vol_cml.cc:3412
int IsToBeRepaired()
Definition: venusvol.h:444
void SetTid(int) EXCLUDES_TRANSACTION
Definition: local_cml.cc:1238
~cmlent() REQUIRES_TRANSACTION
Definition: vol_cml.cc:758
int ReintReady() EXCLUDES_TRANSACTION
Definition: vol_reintegrate.cc:688
int ValidateReintegrationHandle() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:2928
void print()
Definition: venusvol.h:425
ViceVersionVector PVV
Definition: venusvol.h:316
ViceVersionVector SPVV
Definition: venusvol.h:335
int IsFrozen()
Definition: venusvol.h:401
struct cmlent::@5::@16 u_rmdir
int WriteReintegrationHandle(unsigned long *reint_time) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:2976
int cancelstore() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:1823
int Freeze() REQUIRES_TRANSACTION
Definition: vol_cml.cc:228
void commit(ViceVersionVector *) REQUIRES_TRANSACTION
Definition: vol_cml.cc:2739
ViceVersionVector SVV
Definition: venusvol.h:337
int size()
Definition: vol_cml.cc:2639
void ClearReintegrationHandle() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:2840
int ReintPHix
Definition: venusvol.h:290
ViceVersionVector VV
Definition: venusvol.h:286
void GetLocalOpMsg(char *)
Definition: local_cml.cc:993
struct cmlent::@5::@12 u_remove
VenusFid CFid
Definition: venusvol.h:314
RPC2_Unsigned Length
Definition: venusvol.h:285
void TranslateFid(VenusFid *, VenusFid *)
ViceVersionVector OVV
Definition: venusvol.h:363
long bytes()
Definition: vol_cml.cc:804
int CloseReintegrationHandle(char *, int, ViceVersionVector *) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:3075
struct cmlent::@5::@9 u_chown
RPC2_Unsigned Mode
Definition: venusvol.h:309
int cancel() REQUIRES_TRANSACTION
Definition: vol_cml.cc:1573
struct cmlent::@5::@10 u_chmod
int IsReintegrating()
Definition: vol_cml.cc:3975
ViceVersionVector CVV
Definition: venusvol.h:323
void translatefid(VenusFid *, VenusFid *) REQUIRES_TRANSACTION
Definition: vol_cml.cc:2487
void GetVVandFids(ViceVersionVector *[3], VenusFid *[3])
Definition: local_cml.cc:1082
void ResetTransient()
Definition: vol_cml.cc:681
void DetachFidBindings() REQUIRES_TRANSACTION
Definition: vol_cml.cc:3764
void thread()
Definition: vol_cml.cc:2612
int HaveReintegrationHandle()
Definition: vol_cml.cc:2834
int realloc() EXCLUDES_TRANSACTION
Definition: vol_cml.cc:2432
struct cmlent::@5::@15 u_mkdir
void CheckRepair(char *, int *, int *) EXCLUDES_TRANSACTION
Definition: local_cml.cc:237
VenusFid Fid
Definition: venusvol.h:284
void writeops(FILE *)
Definition: vol_cml.cc:3834
struct cmlent::@5::@11 u_create
UserId Owner
Definition: venusvol.h:304
int GetTid()
Definition: venusvol.h:434
int IsExpanded()
Definition: venusvol.h:445
void getfids(VenusFid fid[3])
Definition: vol_cml.cc:3781
unsigned long ReintAmount(unsigned long *reint_time)
Definition: vol_cml.cc:3947
RPC2_Unsigned Offset
Definition: venusvol.h:287
struct in_addr ReintPH
Definition: venusvol.h:289
Definition: venusvol.h:114
cmlstats()
Definition: venusvol.h:122
int store_count
Definition: venusvol.h:116
float other_size
Definition: venusvol.h:120
int other_count
Definition: venusvol.h:119
void clear()
Definition: venusvol.h:124
float store_contents_size
Definition: venusvol.h:118
void operator+=(cmlstats &addend)
Definition: venusvol.h:133
float store_size
Definition: venusvol.h:117
Definition: comm.h:121
Definition: venusvol.h:1061
Definition: dlist.h:80
Definition: dlist.h:50
Definition: fso.h:121
Definition: fso.h:343
Definition: mgrp.h:75
Definition: venusvol.h:1035
Definition: olist.h:47
int count()
Definition: olist.cc:170
Definition: rec_dlist.h:85
Definition: rec_dlist.h:49
Definition: rec_ohash.h:85
Definition: rec_ohash.h:47
Definition: venusvol.h:1047
Definition: venusvol.h:739
int LastMLETime(unsigned long *)
Definition: vol_cml.cc:3355
int LogChown(time_t, uid_t, VenusFid *, UserId, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1092
int PartialReintegrate(int, unsigned long *reint_time) EXCLUDES_TRANSACTION
Definition: vol_reintegrate.cc:506
int asr_running()
Definition: venusvol.h:814
int IsASREnabled()
Definition: venusvol.h:811
int GetReintId() EXCLUDES_TRANSACTION
Definition: local_vol.cc:61
int IncReintegrate(int) EXCLUDES_TRANSACTION
Definition: vol_reintegrate.cc:289
ClientModifyLog * GetCML()
Definition: venusvol.h:785
int RecordsAborted
Definition: venusvol.h:765
int LogMkdir(time_t, uid_t, VenusFid *, char *, VenusFid *, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1304
ClientModifyLog CML
Definition: venusvol.h:755
int GetVolAttr(uid_t) EXCLUDES_TRANSACTION
Definition: vol_vcb.cc:80
int reint_id_gen
Definition: venusvol.h:757
void PreserveLocalMutation(char *msg)
int LogStore(time_t, uid_t, VenusFid *, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:981
int SyncCache(VenusFid *fid=NULL) EXCLUDES_TRANSACTION
Definition: venusvol.cc:1533
long LengthOfCML()
Definition: venusvol.h:780
int HaveCallBack()
Definition: venusvol.h:869
void Reintegrate() EXCLUDES_TRANSACTION
Definition: vol_reintegrate.cc:74
cmlent * reintegrate_done
Definition: venusvol.h:768
struct Lock CML_lock
Definition: venusvol.h:756
int ValidateFSOs() EXCLUDES_TRANSACTION
Definition: vol_vcb.cc:527
int WantCallBack()
Definition: vol_vcb.cc:620
int cur_reint_tid
Definition: venusvol.h:758
int LogRmdir(time_t, uid_t, VenusFid *, char *, const VenusFid *, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1316
FidRange SymlinkFids
Definition: venusvol.h:752
int IsSync(void)
Definition: venusvol.h:787
void UpdateVCBInfo(RPC2_Integer VS, CallBackStatus CBStatus) EXCLUDES_TRANSACTION
Definition: vol_vcb.cc:421
void SetCallBack()
Definition: vol_vcb.cc:615
int LogChmod(time_t, uid_t, VenusFid *, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1120
void DiscardLocalMutation(char *msg)
int IsReintegrating()
Definition: venusvol.h:796
ViceVersionVector VVV
Definition: venusvol.h:773
int ReadyToReintegrate() EXCLUDES_TRANSACTION
Definition: vol_reintegrate.cc:636
int RecordsCommitted
Definition: venusvol.h:764
int LogLink(time_t, uid_t, VenusFid *, char *, VenusFid *, int prepend)
Definition: vol_cml.cc:1266
unsigned int AgeLimit
Definition: venusvol.h:761
FidRange FileFids
Definition: venusvol.h:750
int VCBHits
Definition: venusvol.h:772
void PreserveAllLocalMutation(char *msg)
friend long VENUS_CallBackFetch(RPC2_Handle, ViceFid *, SE_Descriptor *)
Definition: venuscb.cc:223
void ClearCallBack()
Definition: vol_vcb.cc:610
int RecordsCancelled
Definition: venusvol.h:763
int LogRename(time_t, uid_t, VenusFid *, char *, VenusFid *, char *, VenusFid *, const VenusFid *, int, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1278
void ReportVolState(void)
Definition: venusvol.cc:989
long BytesBackFetched
Definition: venusvol.h:767
int CheckPointMLEs(uid_t, char *) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:3293
int LogUtimes(time_t, uid_t, VenusFid *, Date_t, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1064
void ListCML(FILE *fp)
int WriteDisconnect(unsigned int age=V_UNSETAGE, unsigned int time=V_UNSETREINTLIMIT) EXCLUDES_TRANSACTION
Definition: venusvol.cc:1515
pid_t asr_pgid()
Definition: venusvol.h:816
int LogRepair(time_t, uid_t, VenusFid *, RPC2_Unsigned, Date_t, UserId, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1445
int LogSetAttr(time_t, uid_t, VenusFid *, RPC2_Unsigned, Date_t, UserId, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1023
int LogTruncate(time_t, uid_t, VenusFid *, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1053
void IncAbort(int) EXCLUDES_TRANSACTION
Definition: local_vol.cc:41
int LogCreate(time_t, uid_t, VenusFid *, char *, VenusFid *, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1156
void ClearRepairCML()
FidRange DirFids
Definition: venusvol.h:751
int HaveStamp()
Definition: venusvol.h:879
void CheckTransition()
int LogSymlink(time_t, uid_t, VenusFid *, char *, char *, VenusFid *, RPC2_Unsigned, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1432
int CallBackBreak() EXCLUDES_TRANSACTION
Definition: vol_vcb.cc:589
int PurgeMLEs(uid_t) EXCLUDES_TRANSACTION
Definition: vol_cml.cc:3309
void unlock_asr()
Definition: vol_repair.cc:1038
void ResetStats()
Definition: venusvol.h:781
int LogRemove(time_t, uid_t, VenusFid *, char *, const VenusFid *, int, int prepend) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1168
int GetConn(connent **c, uid_t uid, mgrpent **m, int *ph_ix, struct in_addr *phost) EXCLUDES_TRANSACTION
Definition: venusvol.cc:1865
int IsASRAllowed()
Definition: venusvol.h:810
int AllowASR(uid_t)
Definition: vol_repair.cc:1004
void DiscardAllLocalMutation(char *msg)
Definition: local_repair.cc:132
void lock_asr()
Definition: vol_repair.cc:1032
int DisallowASR(uid_t)
Definition: vol_repair.cc:1017
VenusFid GenerateLocalFid(ViceDataType) EXCLUDES_TRANSACTION
Definition: venusvol.cc:2446
void PackVS(int, RPC2_CountedBS *)
Definition: vol_vcb.cc:576
unsigned int ReintLimit
Definition: venusvol.h:760
void EnableASR(uid_t)
Definition: vol_repair.cc:977
int ContainUnrepairedCML()
Definition: local_vol.cc:49
int DisableASR(uid_t)
Definition: vol_repair.cc:988
int AllocFid(ViceDataType, VenusFid *, uid_t, int=0) EXCLUDES_TRANSACTION
Definition: venusvol.cc:2016
int FidsRealloced
Definition: venusvol.h:766
void ResetCMLTransients() EXCLUDES_TRANSACTION
Definition: venusvol.cc:1677
CallBackStatus VCBStatus
Definition: venusvol.h:771
Definition: venusvol.h:1029
Definition: venusvol.h:931
int COP2(mgrpent *, RPC2_CountedBS *) EXCLUDES_TRANSACTION
Definition: vol_COP2.cc:74
void UpMember(void)
Definition: venusvol.cc:1498
friend void VolInit(void)
Definition: venusvol.cc:174
int DisconnectedRepair(VenusFid *, char *, uid_t, VolumeId *, int *) EXCLUDES_TRANSACTION
Definition: vol_repair.cc:669
void Resolve() EXCLUDES_TRANSACTION
Definition: vol_resolve.cc:63
int Collate_COP2(mgrpent *, int)
Definition: venusvol.cc:2435
int IsHostedBy(const struct in_addr *addr)
Definition: venusvol.cc:2327
cop2ent * FindCOP2(ViceStoreId *)
Definition: vol_COP2.cc:251
int LocalRepair(fsobj *, ViceStatus *, char *fname, VenusFid *) REQUIRES_TRANSACTION
Definition: vol_repair.cc:911
int ConnectedRepair(VenusFid *, char *, uid_t, VolumeId *, int *) EXCLUDES_TRANSACTION
Definition: vol_repair.cc:150
int Collate_NonMutating(mgrpent *, int)
Definition: venusvol.cc:2409
int GetMgrp(mgrpent **, uid_t, RPC2_CountedBS *=0) EXCLUDES_TRANSACTION
Definition: venusvol.cc:1952
void RestoreObj(VenusFid *) REQUIRES_TRANSACTION
Definition: vol_cml.cc:1459
int RecResolve(connent *, VenusFid *)
void GetVids(VolumeId out[VSG_MEMBERS])
Definition: venusvol.cc:2313
void ResSubmit(char **, VenusFid *, resent **requeue=NULL)
Definition: vol_resolve.cc:179
friend long VENUS_CallBackFetch(RPC2_Handle, ViceFid *, SE_Descriptor *)
Definition: venuscb.cc:223
int ResListCount()
Definition: venusvol.h:1002
void AddCOP2(ViceStoreId *, ViceVersionVector *)
Definition: vol_COP2.cc:264
int AllocFid(ViceDataType, VenusFid *, uid_t, int=0) EXCLUDES_TRANSACTION
Definition: venusvol.cc:2152
int FlushCOP2(time_t=0) EXCLUDES_TRANSACTION
Definition: vol_COP2.cc:128
void DownMember(struct in_addr *host)
Definition: venusvol.cc:1456
void ClearCOP2(void)
Definition: vol_COP2.cc:299
void GetHosts(struct in_addr hosts[VSG_MEMBERS])
Definition: venusvol.cc:2289
void print_repvol(int)
Definition: venusvol.cc:2829
void Reconfigure(void)
Definition: venusvol.cc:420
void CollateVCB(mgrpent *, RPC2_Integer *, CallBackStatus *) EXCLUDES_TRANSACTION
Definition: vol_vcb.cc:460
int ResAwait(char *) EXCLUDES_TRANSACTION
Definition: vol_resolve.cc:230
int Collate_COP1(mgrpent *, int, ViceVersionVector *)
Definition: venusvol.cc:2420
void GetBandwidth(unsigned long *bw)
Definition: venusvol.cc:1993
int Collate_Reintegrate(mgrpent *, int, ViceVersionVector *)
Definition: venusvol.cc:2427
void GetCOP2(RPC2_CountedBS *)
Definition: vol_COP2.cc:222
int Repair(VenusFid *, char *, uid_t, VolumeId *, int *) EXCLUDES_TRANSACTION
Definition: vol_repair.cc:97
int AVSGsize()
Definition: venusvol.cc:2347
void SetStagingServer(struct in_addr *srvr) EXCLUDES_TRANSACTION
Definition: venusvol.cc:2363
Definition: venusvol.h:1087
Definition: rescomm.h:73
Definition: user.h:52
Definition: venusvol.h:479
Definition: venusvol.h:1022
Definition: venusvol.h:620
int IsReachable()
Definition: venusvol.h:708
short observer_count
Definition: venusvol.h:664
rec_olink handle
Definition: venusvol.h:657
const char * GetName()
Definition: venusvol.h:718
void print()
Definition: venusvol.h:728
short mutator_count
Definition: venusvol.h:663
int GetVolStat(VolumeStatus *, RPC2_BoundedBS *, VolumeStateType *, unsigned int *age, unsigned int *hogtime, int *conflict, int *cml_size, uint64_t *cml_bytes, RPC2_BoundedBS *, RPC2_BoundedBS *, uid_t, int local_only) EXCLUDES_TRANSACTION
Definition: venusvol.cc:2502
void Wait() EXCLUDES_TRANSACTION
Definition: venusvol.cc:1556
Realm * realm
Definition: venusvol.h:651
int IsReadWrite()
Definition: venusvol.h:706
~volent() REQUIRES_TRANSACTION
Definition: venusvol.cc:902
RealmId GetRealmId()
Definition: venusvol.h:716
void GetVids(VolumeId out[VSG_MEMBERS])
Definition: venusvol.cc:2303
fsobj * NewFakeMountLinkObj(VenusFid *fid, const char *comp) REQUIRES_TRANSACTION
Instantiate a new fake mountlink object.
Definition: local_fake.cc:233
int IsBackup()
Definition: venusvol.h:702
char * name
Definition: venusvol.h:649
VolumeId GetVolumeId()
Definition: venusvol.h:717
int Collate(connent *, int code, int TranslateEINCOMP=1)
Definition: venusvol.cc:1746
int Enter(int, uid_t) EXCLUDES_TRANSACTION
Definition: venusvol.cc:1036
void ListCache(FILE *, int long_format=1, unsigned int valid=3)
Definition: venusvol.cc:2867
ViceVolumeType VolStatType(void)
Definition: venusvol.cc:2487
int SetVolStat(VolumeStatus *, RPC2_BoundedBS *, RPC2_BoundedBS *, RPC2_BoundedBS *, uid_t) EXCLUDES_TRANSACTION
Definition: venusvol.cc:2653
void Signal()
Definition: venusvol.cc:1581
VolumeId vid
Definition: venusvol.h:650
int IsRepairVol(void)
Definition: venusvol.h:723
int IsReadWriteReplica()
Definition: venusvol.cc:965
VenusFid GenerateFakeFid() REQUIRES_TRANSACTION
Definition: venusvol.cc:2466
struct dllist_head fso_list
Definition: venusvol.h:660
void GetMountPath(char *, int=1)
Definition: venusvol.cc:2774
int pgid
Definition: venusvol.h:667
int IsLocalRealm()
Definition: venusvol.h:710
int IsReplicated()
Definition: venusvol.h:703
void GetHosts(struct in_addr hosts[VSG_MEMBERS])
Definition: venusvol.cc:2279
friend class volent_iterator
Definition: venusvol.h:625
void GetBandwidth(unsigned long *bw)
Definition: venusvol.cc:1979
void TakeTransition() EXCLUDES_TRANSACTION
Definition: venusvol.cc:1363
VolFlags flags
Definition: venusvol.h:652
int TransitionPending()
Definition: venusvol.h:682
fsobj * NewFakeDirObj(const char *comp) REQUIRES_TRANSACTION
Instantiate a new fake directory object.
Definition: local_fake.cc:207
VolumeStateType state
Definition: venusvol.h:653
void release()
Definition: venusvol.cc:935
void ResetVolTransients()
Definition: venusvol.cc:869
int IsUnreachable()
Definition: venusvol.h:707
short resolver_count
Definition: venusvol.h:665
void Exit(int, uid_t) EXCLUDES_TRANSACTION
Definition: venusvol.cc:1256
short shrd_count
Definition: venusvol.h:666
int IsNonReplicated()
Definition: venusvol.cc:973
Unique_t FidUnique
Definition: venusvol.h:655
void hold()
Definition: venusvol.cc:930
int IsResolving()
Definition: venusvol.h:709
void UnLock(VolLockType)
Definition: venusvol.cc:1611
int AVSGsize()
Definition: venusvol.cc:2339
Definition: venusvol.h:1041
Definition: venusvol.h:885
void Host(struct in_addr *addr)
Definition: venusvol.h:919
friend void VolInit(void)
Definition: venusvol.cc:174
void GetBandwidth(unsigned long *bw)
Definition: venusvol.cc:1987
int IsAvailable()
Definition: venusvol.h:920
void DownMember(struct in_addr *host)
Definition: venusvol.cc:1433
int OnSameHost(const volrep *v)
Definition: venusvol.h:925
VolumeId ReplicatedVol()
Definition: venusvol.h:909
int IsReadWriteReplica()
Definition: venusvol.h:910
int GetConn(connent **, uid_t) EXCLUDES_TRANSACTION
Definition: venusvol.cc:1846
void print_volrep(int)
Definition: venusvol.cc:2823
void UpMember(void)
Definition: venusvol.cc:1473
int IsHostedBy(const struct in_addr *addr)
Definition: venusvol.h:921
Definition: vproc.h:151
int operator=(vproc &)
Definition: vproc.cc:457
Definition: vsg.h:38
#define CODA_ASSERT(pred)
Definition: coda_assert.h:22
int Create(long *, char *, long *)
#define REQUIRES_TRANSACTION
Definition: coda_tsa.h:107
#define EXCLUDES_TRANSACTION
Definition: coda_tsa.h:108
ViceVersionVector NullVV
Definition: dummy.cc:41
#define bytes(bits)
Definition: grunt.h:29
VV_Cmp_Result VV_Cmp(const ViceVersionVector *a, const ViceVersionVector *b)
Definition: inconsist.cc:80
@ VV_EQ
Definition: inconsist.h:39
long HandleResult()
uid
Definition: pwdtopdbtool.py:40
stdout
Definition: volusage.py:12
list vollist
Definition: volusage.py:16
ViceStoreId sid
Definition: objlist.h:65
Realm * LocalRealm
Definition: realmdb.cc:24
command_t list[]
Definition: repair.cc:29
int32_t RPC2_Integer
Definition: rpc2.h:297
uint32_t RPC2_Unsigned
Definition: rpc2.h:300
RPC2_Integer RPC2_Handle
Definition: rpc2.h:345
RPC2_ByteSeq RPC2_String
Definition: rpc2.h:312
@ r
Definition: rvm_private.h:414
@ f
Definition: rvm_private.h:416
PROCESS parent
Definition: smon2.c:80
Definition: pack_helper.h:21
Definition: venusvol.h:241
unsigned committed
Definition: venusvol.h:247
unsigned to_be_repaired
Definition: venusvol.h:242
unsigned failed
Definition: venusvol.h:246
unsigned cancellation_pending
Definition: venusvol.h:245
unsigned unused
Definition: venusvol.h:243
unsigned frozen
Definition: venusvol.h:244
unsigned prepended
Definition: venusvol.h:248
unsigned reserved
Definition: venusvol.h:249
Definition: venusvol.h:598
unsigned long Unused
Definition: venusvol.h:599
FidRange()
Definition: venusvol.h:601
Definition: lock.h:68
Definition: rpc2.h:324
Definition: rpc2.h:316
Definition: se.h:148
Definition: venusfid.h:24
Definition: cvnode.h:155
Definition: venusvol.h:568
unsigned unused5
Definition: venusvol.h:588
unsigned transition_pending
Definition: venusvol.h:570
unsigned demotion_pending
Definition: venusvol.h:571
unsigned readonly
Definition: venusvol.h:585
unsigned unused1
Definition: venusvol.h:572
unsigned allow_asrinvocation
Definition: venusvol.h:573
unsigned asr_running
Definition: venusvol.h:574
unsigned reintegrating
Definition: venusvol.h:579
unsigned enable_asrinvocation
Definition: venusvol.h:586
unsigned unused4
Definition: venusvol.h:584
unsigned unauthenticated
Definition: venusvol.h:592
unsigned reint_conflict
Definition: venusvol.h:589
unsigned unused2
Definition: venusvol.h:578
unsigned resolve_me
Definition: venusvol.h:581
unsigned unused3
Definition: venusvol.h:582
unsigned replicated
Definition: venusvol.h:569
unsigned available
Definition: venusvol.h:587
unsigned has_local_subtree
Definition: venusvol.h:576
unsigned repair_mode
Definition: venusvol.h:580
unsigned sync_reintegrate
Definition: venusvol.h:583
Definition: venusfid.h:31
Definition: repcmds.h:76
Definition: dllist.h:30
dlink * Find(int priority, uid_t uid)
Definition: tallyent.cc:140
char c
Definition: tdb.c:54
#define FakeRepairVolumeId
Definition: venusfid.h:97
void RecovInit(void)
Definition: venusrecov.cc:227
const int MLENTMaxFreeEntries
Definition: venusvol.h:95
int PathAltered(VenusFid *, char *, ClientModifyLog *, cmlent *)
Definition: vol_cml.cc:3165
const int UNSET_TID
Definition: venusvol.h:97
VenusVolType
Definition: venusvol.h:611
@ ReplicatedVolume
Definition: venusvol.h:612
@ VolumeReplica
Definition: venusvol.h:613
char VCBEnabled
Definition: vol_vcb.cc:55
const int VDB_NBUCKETS
Definition: venusvol.h:92
const int VOLENT_MagicNumber
Definition: venusvol.h:93
const int MLENT_MagicNumber
Definition: venusvol.h:94
void VolInitPost(void)
Definition: venusvol.cc:266
void VolDaemon(void) EXCLUDES_TRANSACTION
Definition: vol_daemon.cc:69
int default_reintegration_time
Definition: venusvol.cc:171
VolumeStateType
Definition: venusvol.h:558
@ Unreachable
Definition: venusvol.h:559
@ Reachable
Definition: venusvol.h:560
@ Resolving
Definition: venusvol.h:561
int vcbbreaks
Definition: vol_vcb.cc:54
void VOLD_Init(void)
Definition: vol_daemon.cc:64
void VolInit(void) EXCLUDES_TRANSACTION
Definition: venusvol.cc:174
#define CmlIterOrder
Definition: venusvol.h:450
const unsigned V_UNSETAGE
Definition: venusvol.h:99
int LogOpts
Definition: vol_cml.cc:79
void RecoverPathName(char *, VenusFid *, ClientModifyLog *, cmlent *)
Definition: vol_cml.cc:3223
int allow_backfetch
Definition: vol_cml.cc:80
void TrickleReintegrate() EXCLUDES_TRANSACTION
Definition: vol_daemon.cc:237
const unsigned int COP2SIZE
Definition: venusvol.h:1135
#define CommitOrder
Definition: venusvol.h:451
int default_reintegration_age
Definition: venusvol.cc:170
int VOL_HashFN(void *)
const unsigned V_UNSETREINTLIMIT
Definition: venusvol.h:100
char voldaemon_sync
Definition: vol_daemon.cc:62
const int VDB_MagicNumber
Definition: venusvol.h:91
int MLEs
Definition: venusvol.cc:159
VolLockType
Definition: venusvol.h:83
@ SH_VOL_LK
Definition: venusvol.h:85
@ EX_VOL_LK
Definition: venusvol.h:84
#define NULL
Definition: voltypes.h:44