1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
|
/* This idl file originally came from the DCE project but has been
significantly refactored to pass through the idl2wrs idl-lite
compiler.
DCE has been released as LGPL, hats off to TheOpenGroup
The original copyright of the IDL file follos below:
*/
/*
* @OSF_COPYRIGHT@
* COPYRIGHT NOTICE
* Copyright (c) 1990, 1991, 1992, 1993, 1994 Open Software Foundation, Inc.
* ALL RIGHTS RESERVED (DCE). See the file named COPYRIGHT.DCE for
* the full copyright text.
*/
/*
* HISTORY
* $Log: butc.idl,v $
* Revision 1.1.41.1 1996/10/02 17:05:24 damon
* Newest DFS from Transarc
* [1996/10/01 18:05:16 damon]
*
* Revision 1.1.35.2 1994/06/09 13:52:46 annie
* fixed copyright in src/file
* [1994/06/08 21:26:40 annie]
*
* Revision 1.1.35.1 1994/02/04 20:06:46 devsrc
* Merged from 1.0.3a to 1.1
* [1994/02/04 15:06:52 devsrc]
*
* Revision 1.1.33.1 1993/12/07 17:13:22 jaffe
* 1.0.3a update from Transarc
* [1993/12/03 12:59:50 jaffe]
*
* Revision 1.1.2.5 1993/01/18 20:47:57 cjd
* embedded copyright notice
* [1993/01/18 17:33:13 cjd]
*
* Revision 1.1.2.4 1993/01/13 15:53:56 shl
* Transarc delta: cfe-ot6054-genl-and-i18n-spares 1.1
* Selected comments:
* Add spares to several RPC structures, with two goals:
* - general future usage
* - allow for at least some internationalization designs
* The only tricky part of this work is that the on-the-wire representation for
* directory contents is expanded.
* Transarc delta: vijay-ot6381-correct-handling-of-device-queue-lock 1.4
* Selected comments:
*
* The aim of this delta is to get bak restore to succeed. The problems in restore
* were some spurious thread exceptions and assertions that made bak dump core.
* Upon investigation it turned out that there were some locking problems in
* backup and butc. The delta cleans up locking in backup and butc.
* The delta is not ready for export. Much more needs to be done to get all the
* locking issues right. This is just a checkpoint.
* Second set of changes to get locking issues in order. This time the changes
* are mostly in bakserver. The changes introduced are
* 1. Establish a global lock so that two RPCs do not interfere with each other.
* This was introduced because there are some global data structures in
* backup that might get affected. These global structures now have
* individual locks to serialize changes. The global lock in temporary, and
* will go away once we have serialized all accesses to all global data
* structures.
* 2. Disable cancels in bakserver RPCs. Care is taken to not disable cancels in
* operations that can be cancelled. There is some more work that needs to be
* done in this area.
* 3. Accesses to the database are controlled by memoryDB.lock. The accesses are
* by means of dbread and dbwrite. The hash tables too are protected by this
* mechanism.
* 4. Changes to the backup database dump code to simplify the dump operation. In
* particular, the Unix pipe mechanism is used to synchronize reader and
* writer without need for condition variables.
* 5. Get rid of any pthread_mutex and pthread_cond operations. Use afslk and
* afsos routines instead.
* 6. Continue the work described by the previous revision of the delta in bak
* and butc. This should be it for changes in bak and butc.
* Fix compilation problems on the RIOS.
* This is hopefully the final revision of this delta. The fixes here are
* 1. Changes to the bakserver and butc RPC interfaces.
* The RPCs that handle variable size arrays now use conformant arrays.
* This avoids allocating lots of memory on the client thread stack which
* was the cause of the exceptions in restoreft. The server allocates
* memory which is freed by the server stub on the way out. The client thread
* frees the memory allocated by the client stub.
* 2. get database dump and restore to handle status correctly.
* 3. Get the locking hierarchy right in bakserver, bak and butc.
* 4. Other minor nits.
* There is still a problem with scantape -dbadd that has to be addressed. With
* this delta, all backup commands should work when used in a straightforward
* manner. Some error cases are still not handled properly though. Subsequent
* deltas would fix those.
* Transarc delta: vijay-ot6604-butc-add-spares 1.1
* Selected comments:
*
* Add spares to butc structures wherever necessary.
* [1993/01/12 18:39:46 shl]
*
* Revision 1.1.2.3 1992/11/24 15:42:03 bolinger
* Change include file install directory from .../afs to .../dcedfs.
* [1992/11/22 16:10:10 bolinger]
*
* Revision 1.1.2.2 1992/08/31 18:37:26 jaffe
* Transarc delta: cfe-ot4029-portable-rpc-data-types 1.2
* Selected comments:
* If ``long'' could possibly mean ``64 bits'' any time soon, we need to keep
* our RPC interfaces from breaking.
* More of the same. Forgot a couple of .idl files, and needed to change
* a couple of procedure signatures to match.
* forgot this one too
* [1992/08/28 20:59:01 jaffe]
*
* Revision 1.1 1992/01/19 02:57:17 devrcs
* Initial revision
*
* $EndLog$
*/
/* changed to the following types:
time_t 4 bytes, aligned at 4 bytes holding a unix time_t
uint32 4 byte unsigned integer
int32 4 byte signed integer
renamed error_status_t WERROR a 32bit integer ststus code
removed handle_t it has no wire encoding
rewrote the unions so that idl2wrs can parse them
changed all varying strings to the type butcNameString_t which is
implemented in the template
changed the structs so they are compatible with idl2wrs
afshyper is called udlong in idl2wrs 8 bytes, aligned at 4 bytes
added afsnetaddr definition
*/
[
uuid("1d193c08-000b-11ca-ba1d-02608c2ea96e"),
version(4.0),
/*provider_version(1)*/
pointer_default(ptr) /* All pointers are by default Full pointers */
] interface butc
{
const long TC_DEFAULT_STACK_SIZE = 153600; /* stack size for tc threads */
const long TC_MAXGENNAMELEN = 512; /* length of generic name */
const long TC_MAXDUMPPATH = 256; /* dump path names*/
const long TC_MAXNAMELEN = 128; /* name length */
const long TC_MAXFORMATLEN = 100; /*size of the format statement */
const long TC_MAXHOSTLEN = 128; /*for server/machine names */
const long TC_MAXTAPELEN = 256; /*max tape name allowed */
const long TC_STAT_DONE = 1; /* all done */
const long TC_STAT_OPRWAIT = 2; /* waiting for user interaction */
const long TC_STAT_DUMP = 4; /* true if dump, false if restore */
const long TC_STAT_ABORTED = 8; /* the operation was aborted */
const long TC_STAT_ERROR = 16; /* error ocuured in the operation */
const long TSK_STAT_FIRST = 0x1; /* get id of first task */
const long TSK_STAT_END = 0x2; /* no more tasks */
const long TSK_STAT_NOTFOUND= 0x4; /* couldn't find task id requested */
const long TCOP_NONE = 0;
const long TCOP_READLABEL = 1;
const long TCOP_LABELTAPE = 2;
const long TCOP_DUMP = 3;
const long TCOP_RESTORE = 4;
const long TCOP_SCANTAPE = 5;
const long TCOP_SAVEDB = 6;
const long TCOP_RESTOREDB = 7;
const long TCOP_STATUS = 8;
const long TCOP_SPARE = 9;
/* restore flags */
typedef [bitmap32bit] bitmap {
TC_RESTORE_CREATE = 0x00000001, /* create new volume; fail if there */
TC_RESTORE_INCR = 0x00000002 /* incremental, must already exist */
} butc_Restore_flags;
/*typedef [string] byte butcNameString_t[TC_MAXGENNAMELEN];*/
typedef struct {
uint16 type;
uint8 data[14];
} afsNetAddr;
typedef struct {
udlong vid; /* volume to dump */
butcNameString_t name; /* name of volume whose clone is to
be dumped*/
int32 partition; /* partition at which to find the volume */
time_t date; /* date from which to do the dump */
time_t cloneDate; /* clone date of the volume */
afsNetAddr hostAddr; /* file server for this volume */
uint32 spare1;
uint32 spare2;
uint32 spare3;
uint32 spare4;
} tc_dumpDesc;
typedef struct {
int32 frag; /* fragment number, 1..n */
butcNameString_t tapeName; /*name of tape frag is on*/
int32 position; /*start position of frag on tape */
udlong origVid; /* original volume id */
udlong vid; /* 0 means allocate new volid */
int32 partition; /* where to restore the volume */
butc_Restore_flags flags; /* flags */
afsNetAddr hostAddr; /* file server to restore volume to */
uint32 realDumpId; /* dump id associated with this tape */
uint32 spare2;
uint32 spare3;
uint32 spare4;
butcNameString_t oldName; /* volume whose clone is to
be dumped */
butcNameString_t newName; /* new name suffix */
} tc_restoreDesc;
/*describes the current status of a dump */
typedef struct {
int32 dumpID; /* dump id we're returning */
int32 bytesDumped; /* bytes dumped so far */
udlong volumeBeingDumped; /* guess ?*/
int32 numVolErrs; /* # of volumes that had errors */
int32 flags; /* true if the dump is done */
uint32 spare1;
uint32 spare2;
uint32 spare3;
uint32 spare4;
} tc_dumpStat;
/*identifier for a tape */
typedef struct {
uint32 size; /* size of tape in bytes */
uint32 size_ext;
uint32 spare1;
uint32 spare2;
uint32 spare3;
uint32 spare4;
uint32 nameLen; /* length of tape name */
butcNameString_t name;
} tc_tapeLabel;
typedef struct { /* describes a tape sequence */
int32 id; /* unique id of tapeSet,
assigned by budb */
butcNameString_t tapeServer; /* name of server where
this tape is */
butcNameString_t format; /* using printf to make
tape name */
int32 maxTapes; /* maximum number of tapes in seq. */
int32 a; int32 b; /* linear transforms for tape */
int32 expDate; /* expiration date */
int32 expType; /* absolute or relative expiration */
uint32 spare1;
uint32 spare2;
uint32 spare3;
uint32 spare4;
} tc_tapeSet;
/* identifies the tape coordinator interface */
typedef struct {
int32 tcVersion; /* for the interface & this struct */
uint32 spare1;
uint32 spare2;
uint32 spare3;
uint32 spare4;
} tc_tcInfo;
typedef struct {
uint32 tc_restoreArray_len; /* count of restore descriptors */
[size_is(tc_restoreArray_len),ptr] tc_restoreDesc tc_restoreArray_val[*];
} tc_restoreArray;
typedef struct {
uint32 tc_dumpArray_len; /* count of dump descriptors */
[size_is(tc_dumpArray_len),ptr] tc_dumpDesc tc_dumpArray[*];
} tc_dumpArray;
/* interface structure */
typedef struct {
butcNameString_t dumpPath; /* full dump path */
butcNameString_t volumeSetName; /* volume set name */
butcNameString_t dumpName; /* volset.dump */
tc_tapeSet tapeSet;
int32 parentDumpId;
int32 dumpLevel;
uint32 spare1;
uint32 spare2;
uint32 spare3;
uint32 spare4;
} tc_dumpInterface;
/* The status structure returns information about the task running in butc.
It contains a union that returns the info about the particular operation
currently running in butc.
*/
typedef struct {
uint32 nKBytes; /* bytes xferred */
butcNameString_t volumeName; /* current volume (if any) */
int32 volsFailed; /* # operation failures */
uint32 spare1;
} tc_statusInfoSwitchVol;
typedef struct {
tc_tapeLabel tapeLabel;
uint32 spare1;
} tc_statusInfoSwitchLabel;
/* 32bit tag */
typedef union {
[case(TCOP_NONE)] uint32 none;
[case(TCOP_DUMP)] tc_statusInfoSwitchVol vol;
[case(TCOP_RESTORE)] tc_statusInfoSwitchVol vol;
[case(TCOP_LABELTAPE)] tc_statusInfoSwitchLabel label;
[case(TCOP_READLABEL)] tc_statusInfoSwitchLabel label;
[case(TCOP_SCANTAPE)] uint32 spare1;
[case(TCOP_STATUS)] uint32 spare2;
[case(TCOP_SAVEDB)] uint32 spare3;
[case(TCOP_RESTOREDB)] uint32 spare4;
[case(TCOP_SPARE)] uint32 spare5;
} tc_statusInfoSwitch;
typedef struct {
/* general info */
butcNameString_t taskName; /* task name */
uint32 flags; /* as above */
time_t lastPolled; /* last successful poll */
/* op specific info */
tc_statusInfoSwitch info;
uint32 taskId;
/* nominal spares */
uint32 spare2;
uint32 spare3;
uint32 spare4;
} tciStatusS;
/*
* Procedure Definitions
*/
/* Start a dump, given a dump set name, a tape set name and the volumes to
* dump.
*/
/*
* provider_version(1)
*/
WERROR BUTC_PerformDump
(
[ref, in] tc_dumpInterface *tcdiPtr,
[ref, in] tc_dumpArray *dumps,
[ref, out] int32 *dumpID
);
/* Start a restore, given a dump set name, a tape set name and the volumes to
* dump.
*/
/*
* provider_version(1)
*/
WERROR BUTC_PerformRestore
(
[in] butcNameString_t *dumpSetName,
[ref, in] tc_restoreArray *restores,
[ref, out] int32 *dumpID
);
/* abort a dump */
/*
* provider_version(1)
*/
WERROR BUTC_AbortDump
(
[in] int32 dumpID
);
/*
* provider_version(1)
*/
WERROR BUTC_LabelTape
(
[ref, in] tc_tapeLabel *label,
[ref, out] uint32 *taskId
);
/*
* provider_version(1)
*/
WERROR BUTC_ReadLabel
(
[ref, out] uint32 *taskId /* unused */
);
/*
* provider_version(1)
*/
WERROR BUTC_ScanDumps
(
[in] int32 addDbFlag,
[ref, out] uint32 *taskId
);
/* For returning information about the butc interface.
* Currently this is just the version number
*/
/*
* provider_version(1)
*/
WERROR BUTC_TCInfo
(
[ref, out] tc_tcInfo *tciptr
);
/* for database dump/restores */
/*
* provider_version(1)
*/
WERROR BUTC_SaveDb
(
[ref, out] uint32 *taskId
);
/*
* provider_version(1)
*/
WERROR BUTC_RestoreDb
(
[ref, out] uint32 *taskId
);
/* new status management */
/*
* provider_version(1)
*/
WERROR BUTC_EndStatus
(
[in] uint32 taskId
);
/*
* provider_version(1)
*/
WERROR BUTC_GetStatus
(
[in] uint32 taskId,
[ref, out] tciStatusS *statusPtr
);
/*
* provider_version(1)
*/
WERROR BUTC_RequestAbort
(
[in] uint32 taskId
);
/*
* provider_version(1)
*/
WERROR BUTC_ScanStatus
(
[ref, in, out] uint32 *taskId,
[ref, out] tciStatusS *statusPtr,
[ref, in, out] uint32 *flags
);
/*
* provider_version(1)
*/
WERROR BUTC_GetServerInterfaces
(
/* [ref, in, out] dfs_interfaceList *serverInterfacesP*/
);
}
|