Annotation of fam/fam/ServerHost.h, Revision 1.1.1.1
1.1 trev 1: // Copyright (C) 1999 Silicon Graphics, Inc. All Rights Reserved.
2: //
3: // This program is free software; you can redistribute it and/or modify it
4: // under the terms of version 2 of the GNU General Public License as
5: // published by the Free Software Foundation.
6: //
7: // This program is distributed in the hope that it would be useful, but
8: // WITHOUT ANY WARRANTY; without even the implied warranty of
9: // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Further, any
10: // license provided herein, whether implied or otherwise, is limited to
11: // this program in accordance with the express provisions of the GNU
12: // General Public License. Patent licenses, if any, provided herein do not
13: // apply to combinations of this program with other product or programs, or
14: // any other product whatsoever. This program is distributed without any
15: // warranty that the program is delivered free of the rightful claim of any
16: // third person by way of infringement or the like. See the GNU General
17: // Public License for more details.
18: //
19: // You should have received a copy of the GNU General Public License along
20: // with this program; if not, write the Free Software Foundation, Inc., 59
21: // Temple Place - Suite 330, Boston MA 02111-1307, USA.
22:
23: #ifndef ServerHost_included
24: #define ServerHost_included
25:
26: #include <limits.h>
27: #include "Boolean.h"
28: #include "ClientInterest.h"
29: #include "RequestMap.h"
30: #include "RPC_TCP_Connector.h"
31: struct hostent;
32: class ServerConnection;
33:
34: // ServerHost represents an NFS-server host. A ServerHost tries to
35: // talk to remote fam. If it succeeds, it relies on remote fam to
36: // monitor files that reside on that host. If it can't talk to fam,
37: // it polls the files of interest.
38: //
39: // send_monitor() et al are used to tell the ServerHost what files
40: // are being monitored. If we have a connection to a remote fam,
41: // we send the appropriate message.
42: //
43: // When a file is monitored, a request number is allocated for it,
44: // and it is added to a RequestMap. When it's cancelled, it's
45: // removed from the RequestMap.
46: //
47: // A ServerHost is "active" if we're monitoring at least one file on
48: // that host. The ServerHost starts trying to connect to remote fam
49: // when it becomes active. When it becomes inactive, it starts a
50: // timer; if it stays inactive for three seconds, it disconnects from
51: // remote fam.
52: //
53: // So a ServerHost can be "active" but not "connected": there is no
54: // remote fam or its connection hasn't come up yet. A ServerHost can
55: // also be "connected" but not "active": its connection is timing
56: // out.
57: //
58: // Unfortunately, the kernel's NFS attribute cache gets in fam's way.
59: // If we scan a file within n seconds of someone else scanning the
60: // same file (n defaults to 3), then we get stale information from
61: // the cache. So we scan the file immediately, just in case the
62: // cache won't bite us, then we put the file into a queue of files to
63: // rescan n seconds later, the deferred scan queue.
64:
65: class ServerHost {
66:
67: public:
68:
69: bool is_connected() const { return connection != 0; }
70: const char *name() const { return myname; }
71:
72: Request send_monitor(ClientInterest *, ClientInterest::Type,
73: const char *remote_path);
74: void send_cancel(Request);
75: void send_suspend(Request);
76: void send_resume(Request);
77:
78: void poll();
79:
80: private:
81:
82: // A DeferredScan is the info needed to rescan an Interest after
83: // several seconds' delay. The delay is needed to let the NFS
84: // attribute cache go stale.
85:
86: class DeferredScan {
87:
88: public:
89:
90: inline DeferredScan(int then, int retries, Request = 0, const char * = 0);
91:
92: operator int () { return myrequest != 0; }
93:
94: Request request() const { return myrequest; }
95: const char *path() const { return mypath[0] ? mypath : NULL; }
96:
97: int when; // absolute time, in seconds
98: int retries; // how many times to try
99: class DeferredScan *next;
100:
101: private:
102:
103: Request myrequest;
104: char mypath[NAME_MAX];
105:
106: };
107:
108: // Instance Variables
109:
110: enum {RETRY_INTERVAL = 10};
111:
112: unsigned refcount;
113: char *myname;
114: RPC_TCP_Connector connector;
115: ServerConnection *connection;
116: Request unique_request;
117: RequestMap requests;
118: DeferredScan *deferred_scans;
119: DeferredScan *last;
120: int min_time;
121:
122: // Private Instance Methods
123:
124: ServerHost(const hostent&);
125: ~ServerHost();
126: bool active() { return requests.size() != 0; }
127: void activate();
128: void deactivate();
129: void defer_scan(int when, int retries, Request r , const char * path);
130:
131: // Class Methods
132:
133: static void connect_handler(int fd, void *);
134: static void disconnect_handler(void *);
135:
136: static void event_handler(const Event*, Request, const char *, void *);
137: static void deferred_scan_task(void *);
138: static void timeout_task(void *);
139:
140: ServerHost(const ServerHost&); // Do not copy
141: ServerHost & operator = (const ServerHost&); // or assign.
142:
143: friend class ServerHostRef;
144:
145: };
146:
147: #endif /* !ServerHost_included */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>