[BACK]Return to log_mgr.ps CVS log [TXT][DIR] Up to [Development] / xfs-website / design_docs / xfsdocs93_ps

File: [Development] / xfs-website / design_docs / xfsdocs93_ps / log_mgr.ps (download)

Revision 1.1, Wed Mar 29 22:55:49 2000 UTC (17 years, 7 months ago) by cattelan
Branch: MAIN
CVS Tags: HEAD

Add files with -kb flag

%!PS-Adobe-3.0
%%BoundingBox: (atend)
%%Pages: (atend)
%%PageOrder: (atend)
%%DocumentFonts: (atend)
%%Creator: Frame 5.0
%%DocumentData: Clean7Bit
%%EndComments
%%BeginProlog
%
% Frame ps_prolog 5.0, for use with Frame 5.0 products
% This ps_prolog file is Copyright (c) 1986-1995 Frame Technology
% Corporation.  All rights reserved.  This ps_prolog file may be
% freely copied and distributed in conjunction with documents created
% using FrameMaker, FrameMaker/SGML and FrameViewer as long as this 
% copyright notice is preserved.
%
% FrameMaker users specify the proper paper size for each print job in the
% "Print" dialog's "Printer Paper Size" "Width" and "Height~ fields.  If the
% printer that the PS file is sent to does not support the requested paper
% size, or if there is no paper tray of the proper size currently installed, 
% then the job will not be printed.  The following flag, if set to true, will
% cause the job to print on the default paper in such cases.
/FMAllowPaperSizeMismatch            false def
%
% Frame products normally print colors as their true color on a color printer
% or as shades of gray, based on luminance, on a black-and white printer. The
% following flag, if set to true, forces all non-white colors to print as pure
% black. This has no effect on bitmap images.
/FMPrintAllColorsAsBlack             false def
%
% Frame products can either set their own line screens or use a printer's 
% default settings. Three flags below control this separately for no 
% separations, spot separations and process separations. If a flag
% is true, then the default printer settings will not be changed. If it is
% false, Frame products will use their own settings from a table based on
% the printer's resolution.
/FMUseDefaultNoSeparationScreen      true  def
/FMUseDefaultSpotSeparationScreen    true  def
/FMUseDefaultProcessSeparationScreen false def
%
% For any given PostScript printer resolution, Frame products have two sets of 
% screen angles and frequencies for printing process separations, which are 
% recomended by Adobe. The following variable chooses the higher frequencies
% when set to true or the lower frequencies when set to false. This is only
% effective if the appropriate FMUseDefault...SeparationScreen flag is false.
/FMUseHighFrequencyScreens true def
%
% The following is a set of predefined optimal frequencies and angles for various
% common dpi settings. This is taken from "Advances in Color Separation Using
% PostScript Software Technology," from Adobe Systems (3/13/89 P.N. LPS 0043)
% and corrolated with information which is in various PPD (4.0) files.
%
% The "dpiranges" figure is the minimum dots per inch device resolution which
% can support this setting. The "low" and "high" values are controlled by the
% setting of the FMUseHighFrequencyScreens flag above. The "TDot" flags control
% the use of the "Yellow Triple Dot" feature whereby the frequency id divided by
% three, but the dot function is "trippled" giving a block of 3x3 dots per cell.
%
% PatFreq is a compromise pattern frequency for ps Level 2 printers which is close
% to the ideal WYSIWYG pattern frequency of 9 repetitions/inch but does not beat
% (too badly) against the screen frequencies of any separations for that DPI.
/dpiranges   [  2540    2400    1693     1270    1200     635      600      0      ] def
/CMLowFreqs  [ 100.402  94.8683 89.2289 100.402  94.8683  66.9349  63.2456 47.4342 ] def
/YLowFreqs   [  95.25   90.0    84.65    95.25   90.0     70.5556  66.6667 50.0    ] def
/KLowFreqs   [  89.8026 84.8528 79.8088  89.8026 84.8528  74.8355  70.7107 53.033  ] def
/CLowAngles  [  71.5651 71.5651 71.5651 71.5651  71.5651  71.5651  71.5651 71.5651 ] def
/MLowAngles  [  18.4349 18.4349 18.4349 18.4349  18.4349  18.4349  18.4349 18.4349 ] def
/YLowTDot    [  true    true    false    true    true     false    false   false   ] def
/CMHighFreqs [ 133.87  126.491 133.843  108.503 102.523  100.402   94.8683 63.2456 ] def
/YHighFreqs  [ 127.0   120.0   126.975  115.455 109.091   95.25    90.0    60.0    ] def
/KHighFreqs  [ 119.737 113.137 119.713  128.289 121.218   89.8026  84.8528 63.6395 ] def
/CHighAngles [  71.5651 71.5651 71.5651  70.0169 70.0169  71.5651  71.5651 71.5651 ] def
/MHighAngles [  18.4349 18.4349 18.4349  19.9831 19.9831  18.4349  18.4349 18.4349 ] def
/YHighTDot   [  false   false   true     false   false    true     true    false   ] def
/PatFreq     [	10.5833 10.0     9.4055  10.5833 10.0	  10.5833  10.0	   9.375   ] def
%
% PostScript Level 2 printers contain an "Accurate Screens" feature which can
% improve process separation rendering at the expense of compute time. This 
% flag is ignored by PostScript Level 1 printers.
/FMUseAcccurateScreens true def
%
% The following PostScript procedure defines the spot function that Frame
% products will use for process separations. You may un-comment-out one of
% the alternative functions below, or use your own.
%
% Dot function
/FMSpotFunction {abs exch abs 2 copy add 1 gt 
		{1 sub dup mul exch 1 sub dup mul add 1 sub }
		{dup mul exch dup mul add 1 exch sub }ifelse } def
%
% Line function
% /FMSpotFunction { pop } def
%
% Elipse function
% /FMSpotFunction { dup 5 mul 8 div mul exch dup mul exch add 
%		sqrt 1 exch sub } def
%
%
/FMversion (5.0) def 
/fMLevel1 /languagelevel where {pop languagelevel} {1} ifelse 2 lt def
/FMPColor
	fMLevel1 {
		false
		/colorimage where {pop pop true} if
	} {
		true
	} ifelse
def
/FrameDict 400 dict def 
systemdict /errordict known not {/errordict 10 dict def
		errordict /rangecheck {stop} put} if
% The readline in PS 23.0 doesn't recognize cr's as nl's on AppleTalk
FrameDict /tmprangecheck errordict /rangecheck get put 
errordict /rangecheck {FrameDict /bug true put} put 
FrameDict /bug false put 
mark 
% Some PS machines read past the CR, so keep the following 3 lines together!
currentfile 5 string readline
00
0000000000
cleartomark 
errordict /rangecheck FrameDict /tmprangecheck get put 
FrameDict /bug get { 
	/readline {
		/gstring exch def
		/gfile exch def
		/gindex 0 def
		{
			gfile read pop 
			dup 10 eq {exit} if 
			dup 13 eq {exit} if 
			gstring exch gindex exch put 
			/gindex gindex 1 add def 
		} loop
		pop 
		gstring 0 gindex getinterval true 
		} bind def
	} if
/FMshowpage /showpage load def
/FMquit /quit load def
/FMFAILURE { 
	dup = flush 
	FMshowpage 
	/Helvetica findfont 12 scalefont setfont
	72 200 moveto show
	72 220 moveto show
	FMshowpage 
	FMquit 
	} def 
/FMVERSION {
	FMversion ne {
		(Frame product version does not match ps_prolog!  Check installation;)
		(also check ~/fminit and ./fminit for old versions) FMFAILURE
		} if
	} def 
/FMBADEPSF { 
	(Adobe's PostScript Language Reference Manual, 2nd Edition, section H.2.4)
	(says your EPS file is not valid, as it calls X              )
	dup dup (X) search pop exch pop exch pop length 
	5 -1 roll 
	putinterval 
	FMFAILURE
	} def
/fmConcatProcs
	{
	/proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def
	newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx
}def
FrameDict begin [
	/ALDsave
	/FMdicttop
	/FMoptop
	/FMpointsize
	/FMsaveobject
	/b
	/bitmapsave
	/blut
	/bpside
	/bs
	/bstring
	/bwidth
	/c
	/cf
	/cs
	/cynu
	/depth
	/edown
	/fh
	/fillvals
	/fw
	/fx
	/fy
	/g
	/gfile
	/gindex
	/grnt
	/gryt
	/gstring
	/height
	/hh
	/i
	/im
	/indx
	/is
	/k
	/kk
	/landscape
	/lb
	/len
	/llx
	/lly
	/m
	/magu
	/manualfeed
	/n
	/offbits
	/onbits
	/organgle
	/orgbangle
	/orgbfreq
	/orgbproc
	/orgbxfer
	/orgfreq
	/orggangle
	/orggfreq
	/orggproc
	/orggxfer
	/orgmatrix
	/orgproc
	/orgrangle
	/orgrfreq
	/orgrproc
	/orgrxfer
	/orgxfer
	/pagesave
	/paperheight
	/papersizedict
	/paperwidth
	/pos
	/pwid
	/r
	/rad
	/redt
	/sl
	/str
	/tran
	/u
	/urx
	/ury
	/val
	/width
	/width
	/ws
	/ww
	/x
	/x1
	/x2
	/xindex
	/xpoint
	/xscale
	/xx
	/y
	/y1
	/y2
	/yelu
	/yindex
	/ypoint
	/yscale
	/yy
] { 0 def } forall
/FmBD {bind def} bind def
systemdict /pdfmark known {
	/fMAcrobat true def
	
	/FmPD /pdfmark load def
	
	
	/FmPT /show load def
	
	
	currentdistillerparams /CoreDistVersion get 2000 ge {
	
		
		/FmPD2 /pdfmark load def
		
		
		
		
		
		/FmPA { mark exch /Dest exch 5 3 roll 
				/View [ /XYZ null 6 -2 roll FmDC exch pop null] /DEST FmPD 
		}FmBD
	} {
		
		/FmPD2 /cleartomark load def
		/FmPA {pop pop pop}FmBD
	} ifelse
} {
	
	/fMAcrobat false def
	/FmPD /cleartomark load def
	/FmPD2 /cleartomark load def
	/FmPT /pop load def
	/FmPA {pop pop pop}FmBD
} ifelse
/FmDC {
	transform fMDefaultMatrix itransform cvi exch cvi exch
}FmBD
/FmBx {
	dup 3 index lt {3 1 roll exch} if 
	1 index 4 index lt {4 -1 roll 3 1 roll exch 4 1 roll} if
}FmBD
/FMnone 0 def
/FMcyan 1 def
/FMmagenta 2 def
/FMyellow 3 def
/FMblack 4 def
/FMcustom 5 def
/fMNegative false def 
/FrameSepIs FMnone def 
/FrameSepBlack 0 def
/FrameSepYellow 0 def
/FrameSepMagenta 0 def
/FrameSepCyan 0 def
/FrameSepRed 1 def
/FrameSepGreen 1 def
/FrameSepBlue 1 def
/FrameCurGray 1 def
/FrameCurPat null def
/FrameCurColors [ 0 0 0 1 0 0 0 ] def 
/FrameColorEpsilon .001 def	
/eqepsilon {		
	sub dup 0 lt {neg} if
	FrameColorEpsilon le
} bind def
/FrameCmpColorsCMYK { 
	2 copy 0 get exch 0 get eqepsilon {
		2 copy 1 get exch 1 get eqepsilon {
			2 copy 2 get exch 2 get eqepsilon {
				3 get exch 3 get eqepsilon
			} {pop pop false} ifelse
		}{pop pop false} ifelse
	} {pop pop false} ifelse
} bind def
/FrameCmpColorsRGB { 
	2 copy 4 get exch 0 get eqepsilon {
		2 copy 5 get exch 1 get eqepsilon {
			6 get exch 2 get eqepsilon
		}{pop pop false} ifelse
	} {pop pop false} ifelse
} bind def
/RGBtoCMYK { 
	1 exch sub 
	3 1 roll 
	1 exch sub 
	3 1 roll 
	1 exch sub 
	3 1 roll 
	3 copy 
	2 copy 
	le { pop } { exch pop } ifelse 
	2 copy 
	le { pop } { exch pop } ifelse 
	dup dup dup 
	6 1 roll 
	4 1 roll 
	7 1 roll 
	sub 
	6 1 roll 
	sub 
	5 1 roll 
	sub 
	4 1 roll 
} bind def
/CMYKtoRGB { 
	dup dup 4 -1 roll add 						  
	5 1 roll 3 -1 roll add 						  
	4 1 roll add 								  
	1 exch sub dup 0 lt {pop 0} if 3 1 roll 	  
	1 exch sub dup 0 lt {pop 0} if exch 	      
	1 exch sub dup 0 lt {pop 0} if exch	  		  
} bind def
/FrameSepInit {
	1.0 RealSetgray
} bind def
/FrameSetSepColor { 
	/FrameSepBlue exch def
	/FrameSepGreen exch def
	/FrameSepRed exch def
	/FrameSepBlack exch def
	/FrameSepYellow exch def
	/FrameSepMagenta exch def
	/FrameSepCyan exch def
	/FrameSepIs FMcustom def
	setCurrentScreen	
} bind def
/FrameSetCyan {
	/FrameSepBlue 1.0 def
	/FrameSepGreen 1.0 def
	/FrameSepRed 0.0 def
	/FrameSepBlack 0.0 def
	/FrameSepYellow 0.0 def
	/FrameSepMagenta 0.0 def
	/FrameSepCyan 1.0 def
	/FrameSepIs FMcyan def
	setCurrentScreen	
} bind def
 
/FrameSetMagenta {
	/FrameSepBlue 1.0 def
	/FrameSepGreen 0.0 def
	/FrameSepRed 1.0 def
	/FrameSepBlack 0.0 def
	/FrameSepYellow 0.0 def
	/FrameSepMagenta 1.0 def
	/FrameSepCyan 0.0 def
	/FrameSepIs FMmagenta def
	setCurrentScreen
} bind def
 
/FrameSetYellow {
	/FrameSepBlue 0.0 def
	/FrameSepGreen 1.0 def
	/FrameSepRed 1.0 def
	/FrameSepBlack 0.0 def
	/FrameSepYellow 1.0 def
	/FrameSepMagenta 0.0 def
	/FrameSepCyan 0.0 def
	/FrameSepIs FMyellow def
	setCurrentScreen
} bind def
 
/FrameSetBlack {
	/FrameSepBlue 0.0 def
	/FrameSepGreen 0.0 def
	/FrameSepRed 0.0 def
	/FrameSepBlack 1.0 def
	/FrameSepYellow 0.0 def
	/FrameSepMagenta 0.0 def
	/FrameSepCyan 0.0 def
	/FrameSepIs FMblack def
	setCurrentScreen
} bind def
 
/FrameNoSep { 
	/FrameSepIs FMnone def
	setCurrentScreen
} bind def
/FrameSetSepColors { 
	FrameDict begin
	[ exch 1 add 1 roll ]
	/FrameSepColors  
	exch def end
	} bind def
/FrameColorInSepListCMYK { 
	FrameSepColors {  
       		exch dup 3 -1 roll 
       		FrameCmpColorsCMYK 
       		{ pop true exit } if
    	} forall 
	dup true ne {pop false} if
	} bind def
/FrameColorInSepListRGB { 
	FrameSepColors {  
       		exch dup 3 -1 roll 
       		FrameCmpColorsRGB 
       		{ pop true exit } if
    	} forall 
	dup true ne {pop false} if
	} bind def
/RealSetgray /setgray load def
/RealSetrgbcolor /setrgbcolor load def
/RealSethsbcolor /sethsbcolor load def
end 
/setgray { 
	FrameDict begin
	FrameSepIs FMnone eq
		{ RealSetgray } 
		{ 
		FrameSepIs FMblack eq 
			{ RealSetgray } 
			{ FrameSepIs FMcustom eq 
			  FrameSepRed 0 eq and
			  FrameSepGreen 0 eq and
			  FrameSepBlue 0 eq and {
			  	RealSetgray
			  } {
				1 RealSetgray pop 
			  } ifelse
			} ifelse
		} ifelse
	end
} bind def
/setrgbcolor { 
	FrameDict begin
	FrameSepIs FMnone eq
	{  RealSetrgbcolor }
	{
		3 copy [ 4 1 roll ] 
		FrameColorInSepListRGB
		{
				FrameSepBlue eq exch 
			 	FrameSepGreen eq and exch 
			 	FrameSepRed eq and
			 	{ 0 } { 1 } ifelse
		}
		{
			FMPColor {
				RealSetrgbcolor
				currentcmykcolor
			} {
				RGBtoCMYK
			} ifelse
			FrameSepIs FMblack eq
			{1.0 exch sub 4 1 roll pop pop pop} {
			FrameSepIs FMyellow eq
			{pop 1.0 exch sub 3 1 roll pop pop} {
			FrameSepIs FMmagenta eq
			{pop pop 1.0 exch sub exch pop } {
			FrameSepIs FMcyan eq
			{pop pop pop 1.0 exch sub } 
			{pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse 
		} ifelse
		RealSetgray
	} 
	ifelse
	end
} bind def
/sethsbcolor {
	FrameDict begin
	FrameSepIs FMnone eq 
	{ RealSethsbcolor } 
	{
		RealSethsbcolor 
		currentrgbcolor  
		setrgbcolor 
	} 
	ifelse
	end
} bind def
FrameDict begin
/setcmykcolor where {
	pop /RealSetcmykcolor /setcmykcolor load def
} {
	/RealSetcmykcolor {
		4 1 roll
		3 { 3 index add 0 max 1 min 1 exch sub 3 1 roll} repeat 
		RealSetrgbcolor pop
	} bind def
} ifelse
userdict /setcmykcolor { 
		FrameDict begin
		FrameSepIs FMnone eq
		{ RealSetcmykcolor } 
		{
			4 copy [ 5 1 roll ]
			FrameColorInSepListCMYK
			{
				FrameSepBlack eq exch 
				FrameSepYellow eq and exch 
				FrameSepMagenta eq and exch 
				FrameSepCyan eq and 
				{ 0 } { 1 } ifelse
			}
			{
				FrameSepIs FMblack eq
				{1.0 exch sub 4 1 roll pop pop pop} {
				FrameSepIs FMyellow eq
				{pop 1.0 exch sub 3 1 roll pop pop} {
				FrameSepIs FMmagenta eq
				{pop pop 1.0 exch sub exch pop } {
				FrameSepIs FMcyan eq
				{pop pop pop 1.0 exch sub } 
				{pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse 
			} ifelse
			RealSetgray
		}
		ifelse
		end
	} bind put
fMLevel1 { 
	
	
	
	/patScreenDict 7 dict dup begin
		<0f1e3c78f0e1c387> [ 45  { pop } {exch pop} 		.5   2 sqrt] FmBD
		<0f87c3e1f0783c1e> [ 135 { pop } {exch pop}			.5   2 sqrt] FmBD
		<cccccccccccccccc> [ 0   { pop } dup				.5   2	   ] FmBD
		<ffff0000ffff0000> [ 90  { pop } dup				.5   2	   ] FmBD
		<8142241818244281> [ 45  { 2 copy lt {exch} if pop}	dup .75  2 sqrt] FmBD
		<03060c183060c081> [ 45  { pop } {exch pop}			.875 2 sqrt] FmBD
		<8040201008040201> [ 135 { pop } {exch pop}			.875 2 sqrt] FmBD
	end def
} { 
	
	/patProcDict 5 dict dup begin
		<0f1e3c78f0e1c387> { 3 setlinewidth -1 -1 moveto 9 9 lineto stroke 
											4 -4 moveto 12 4 lineto stroke
											-4 4 moveto 4 12 lineto stroke} bind def
		<0f87c3e1f0783c1e> { 3 setlinewidth -1 9 moveto 9 -1 lineto stroke 
											-4 4 moveto 4 -4 lineto stroke
											4 12 moveto 12 4 lineto stroke} bind def
		<8142241818244281> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke
											-1 -1 moveto 9 9 lineto stroke } bind def
		<03060c183060c081> { 1 setlinewidth -1 -1 moveto 9 9 lineto stroke 
											4 -4 moveto 12 4 lineto stroke
											-4 4 moveto 4 12 lineto stroke} bind def
		<8040201008040201> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke 
											-4 4 moveto 4 -4 lineto stroke
											4 12 moveto 12 4 lineto stroke} bind def
	end def
	/patDict 15 dict dup begin
		/PatternType 1 def		
		/PaintType 2 def		
		/TilingType 3 def		
		/BBox [ 0 0 8 8 ] def 	
		/XStep 8 def			
		/YStep 8 def			
		/PaintProc {
			begin
			patProcDict bstring known {
				patProcDict bstring get exec
			} {
				8 8 true [1 0 0 -1 0 8] bstring imagemask
			} ifelse
			end
		} bind def
	end def
} ifelse
/combineColor {
    FrameSepIs FMnone eq
	{
		graymode fMLevel1 or not {
			
			[/Pattern [/DeviceCMYK]] setcolorspace
			FrameCurColors 0 4 getinterval aload pop FrameCurPat setcolor
		} {
			FrameCurColors 3 get 1.0 ge {
				FrameCurGray RealSetgray
			} {
				fMAcrobat not FMPColor graymode and and {
					0 1 3 { 
						FrameCurColors exch get
						1 FrameCurGray sub mul
					} for
					RealSetcmykcolor
				} {
					4 1 6 {
						FrameCurColors exch get
						graymode {
							1 exch sub 1 FrameCurGray sub mul 1 exch sub
						} {
							1.0 lt {FrameCurGray} {1} ifelse
						} ifelse
					} for
					RealSetrgbcolor
				} ifelse
			} ifelse
		} ifelse
	} { 
		FrameCurColors 0 4 getinterval aload
		FrameColorInSepListCMYK {
			FrameSepBlack eq exch 
			FrameSepYellow eq and exch 
			FrameSepMagenta eq and exch 
			FrameSepCyan eq and
			FrameSepIs FMcustom eq and
			{ FrameCurGray } { 1 } ifelse
		} {
			FrameSepIs FMblack eq
			{FrameCurGray 1.0 exch sub mul 1.0 exch sub 4 1 roll pop pop pop} {
			FrameSepIs FMyellow eq
			{pop FrameCurGray 1.0 exch sub mul 1.0 exch sub 3 1 roll pop pop} {
			FrameSepIs FMmagenta eq
			{pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub exch pop } {
			FrameSepIs FMcyan eq
			{pop pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub } 
			{pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse 
		} ifelse
		graymode fMLevel1 or not {
			
			[/Pattern [/DeviceGray]] setcolorspace
			FrameCurPat setcolor
		} { 
			graymode not fMLevel1 and {
				
				dup 1 lt {pop FrameCurGray} if
			} if
			RealSetgray
		} ifelse
	} ifelse
} bind def
/savematrix {
	orgmatrix currentmatrix pop
	} bind def
/restorematrix {
	orgmatrix setmatrix
	} bind def
/fMDefaultMatrix matrix defaultmatrix def
/fMatrix2 matrix def
/dpi    72 0 fMDefaultMatrix dtransform
    dup mul exch   dup mul add   sqrt def
	
/freq dpi dup 72 div round dup 0 eq {pop 1} if 8 mul div def
/sangle 1 0 fMDefaultMatrix dtransform exch atan def
	sangle fMatrix2 rotate 
	fMDefaultMatrix fMatrix2 concatmatrix 
	dup 0 get /sflipx exch def
	    3 get /sflipy exch def
/screenIndex {
	0 1 dpiranges length 1 sub { dup dpiranges exch get 1 sub dpi le {exit} {pop} ifelse } for
} bind def
/getCyanScreen {
	FMUseHighFrequencyScreens { CHighAngles CMHighFreqs} {CLowAngles CMLowFreqs} ifelse
		screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load
} bind def
/getMagentaScreen {
	FMUseHighFrequencyScreens { MHighAngles CMHighFreqs } {MLowAngles CMLowFreqs} ifelse
		screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load
} bind def
/getYellowScreen {
	FMUseHighFrequencyScreens { YHighTDot YHighFreqs} { YLowTDot YLowFreqs } ifelse
		screenIndex dup 3 1 roll get 3 1 roll get { 3 div
			{2 { 1 add 2 div 3 mul dup floor sub 2 mul 1 sub exch} repeat
			FMSpotFunction } } {/FMSpotFunction load } ifelse
			0.0 exch
} bind def
/getBlackScreen  {
	FMUseHighFrequencyScreens { KHighFreqs } { KLowFreqs } ifelse
		screenIndex get 45.0 /FMSpotFunction load 
} bind def
/getSpotScreen {
	getBlackScreen
} bind def
/getCompositeScreen {
	getBlackScreen
} bind def
/FMSetScreen 
	fMLevel1 { /setscreen load 
	}{ {
		8 dict begin
		/HalftoneType 1 def
		/SpotFunction exch def
		/Angle exch def
		/Frequency exch def
		/AccurateScreens FMUseAcccurateScreens def
		currentdict end sethalftone
	} bind } ifelse
def
/setDefaultScreen {
	FMPColor {
		orgrxfer cvx orggxfer cvx orgbxfer cvx orgxfer cvx setcolortransfer
	}
	{
		orgxfer cvx settransfer
	} ifelse
	orgfreq organgle orgproc cvx setscreen
} bind def
/setCurrentScreen {
	FrameSepIs FMnone eq {
		FMUseDefaultNoSeparationScreen {
			setDefaultScreen
		} {
			getCompositeScreen FMSetScreen
		} ifelse
	} {
		FrameSepIs FMcustom eq {
			FMUseDefaultSpotSeparationScreen {
				setDefaultScreen
			} {
				getSpotScreen FMSetScreen
			} ifelse
		} {
			FMUseDefaultProcessSeparationScreen {
				setDefaultScreen
			} {
				FrameSepIs FMcyan eq {
					getCyanScreen FMSetScreen
				} {
					FrameSepIs FMmagenta eq {
						getMagentaScreen FMSetScreen
					} {
						FrameSepIs FMyellow eq {
							getYellowScreen FMSetScreen
						} {
							getBlackScreen FMSetScreen
						} ifelse
					} ifelse
				} ifelse
			} ifelse
		} ifelse
	} ifelse 
} bind def
end
	
/FMDOCUMENT { 
	array /FMfonts exch def 
	/#copies exch def
	FrameDict begin
	0 ne /manualfeed exch def
	/paperheight exch def
	/paperwidth exch def
	0 ne /fMNegative exch def 
	0 ne /edown exch def 
	/yscale exch def
	/xscale exch def
	fMLevel1 {
		manualfeed {setmanualfeed} if
		/FMdicttop countdictstack 1 add def 
		/FMoptop count def 
		setpapername 
		manualfeed {true} {papersize} ifelse 
		{manualpapersize} {false} ifelse 
		{desperatepapersize} {false} ifelse 
		{papersizefailure} if
		count -1 FMoptop {pop pop} for
		countdictstack -1 FMdicttop {pop end} for 
		}
		{2 dict
		 dup /PageSize [paperwidth paperheight] put
		 manualfeed {dup /ManualFeed manualfeed put} if
		 {setpagedevice} stopped {papersizefailure} if
		}
	ifelse 
	
	FMPColor {
		currentcolorscreen
			cvlit /orgproc exch def
				  /organgle exch def 
				  /orgfreq exch def
			cvlit /orgbproc exch def
				  /orgbangle exch def 
				  /orgbfreq exch def
			cvlit /orggproc exch def
				  /orggangle exch def 
				  /orggfreq exch def
			cvlit /orgrproc exch def
				  /orgrangle exch def 
				  /orgrfreq exch def
			currentcolortransfer 
			fMNegative {
				1 1 4 { 
					pop { 1 exch sub } fmConcatProcs 4 1 roll
				} for
				4 copy
				setcolortransfer
			} if
			cvlit /orgxfer exch def
			cvlit /orgbxfer exch def
			cvlit /orggxfer exch def
			cvlit /orgrxfer exch def
	} {
		currentscreen 
			cvlit /orgproc exch def
				  /organgle exch def 
				  /orgfreq exch def
				  
		currenttransfer 
		fMNegative {
			{ 1 exch sub } fmConcatProcs
			dup settransfer
		} if 
		cvlit /orgxfer exch def
	} ifelse
	end 
} def 
/FMBEGINPAGE { 
	FrameDict begin 
	/pagesave save def
	3.86 setmiterlimit
	/landscape exch 0 ne def
	landscape { 
		90 rotate 0 exch dup /pwid exch def neg translate pop 
	}{
		pop /pwid exch def
	} ifelse
	edown { [-1 0 0 1 pwid 0] concat } if
	0 0 moveto paperwidth 0 lineto paperwidth paperheight lineto 
	0 paperheight lineto 0 0 lineto 1 setgray fill
	xscale yscale scale
	/orgmatrix matrix def
	gsave 
} def 
/FMENDPAGE {
	grestore 
	pagesave restore
	end 
	showpage
	} def 
/FMFONTDEFINE { 
	FrameDict begin
	findfont 
	ReEncode 
	1 index exch 
	definefont 
	FMfonts 3 1 roll 
	put
	end 
	} def 
/FMFILLS {
	FrameDict begin dup
	array /fillvals exch def
	dict /patCache exch def
	end 
	} def 
/FMFILL {
	FrameDict begin
	 fillvals 3 1 roll put
	end 
	} def 
/FMNORMALIZEGRAPHICS { 
	newpath
	1 setlinewidth
	0 setlinecap
	0 0 0 sethsbcolor
	0 setgray 
	} bind def
/FMBEGINEPSF { 
	end 
	/FMEPSF save def 
	/showpage {} def 
% See Adobe's "PostScript Language Reference Manual, 2nd Edition", page 714.
% "...the following operators MUST NOT be used in an EPS file:" (emphasis ours)
	/banddevice {(banddevice) FMBADEPSF} def
	/clear {(clear) FMBADEPSF} def
	/cleardictstack {(cleardictstack) FMBADEPSF} def 
	/copypage {(copypage) FMBADEPSF} def
	/erasepage {(erasepage) FMBADEPSF} def
	/exitserver {(exitserver) FMBADEPSF} def
	/framedevice {(framedevice) FMBADEPSF} def
	/grestoreall {(grestoreall) FMBADEPSF} def
	/initclip {(initclip) FMBADEPSF} def
	/initgraphics {(initgraphics) FMBADEPSF} def
	/quit {(quit) FMBADEPSF} def
	/renderbands {(renderbands) FMBADEPSF} def
	/setglobal {(setglobal) FMBADEPSF} def
	/setpagedevice {(setpagedevice) FMBADEPSF} def
	/setshared {(setshared) FMBADEPSF} def
	/startjob {(startjob) FMBADEPSF} def
	/lettertray {(lettertray) FMBADEPSF} def
	/letter {(letter) FMBADEPSF} def
	/lettersmall {(lettersmall) FMBADEPSF} def
	/11x17tray {(11x17tray) FMBADEPSF} def
	/11x17 {(11x17) FMBADEPSF} def
	/ledgertray {(ledgertray) FMBADEPSF} def
	/ledger {(ledger) FMBADEPSF} def
	/legaltray {(legaltray) FMBADEPSF} def
	/legal {(legal) FMBADEPSF} def
	/statementtray {(statementtray) FMBADEPSF} def
	/statement {(statement) FMBADEPSF} def
	/executivetray {(executivetray) FMBADEPSF} def
	/executive {(executive) FMBADEPSF} def
	/a3tray {(a3tray) FMBADEPSF} def
	/a3 {(a3) FMBADEPSF} def
	/a4tray {(a4tray) FMBADEPSF} def
	/a4 {(a4) FMBADEPSF} def
	/a4small {(a4small) FMBADEPSF} def
	/b4tray {(b4tray) FMBADEPSF} def
	/b4 {(b4) FMBADEPSF} def
	/b5tray {(b5tray) FMBADEPSF} def
	/b5 {(b5) FMBADEPSF} def
	FMNORMALIZEGRAPHICS 
	[/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall 
	fx fw 2 div add fy fh 2 div add  translate
	rotate
	fw 2 div neg fh 2 div neg translate
	fw urx llx sub div fh ury lly sub div scale 
	llx neg lly neg translate 
	/FMdicttop countdictstack 1 add def 
	/FMoptop count def 
	} bind def
/FMENDEPSF {
	count -1 FMoptop {pop pop} for 
	countdictstack -1 FMdicttop {pop end} for 
	FMEPSF restore
	FrameDict begin 
	} bind def
FrameDict begin 
/setmanualfeed {
%%BeginFeature *ManualFeed True
	 statusdict /manualfeed true put
%%EndFeature
	} bind def
/max {2 copy lt {exch} if pop} bind def
/min {2 copy gt {exch} if pop} bind def
/inch {72 mul} def
/pagedimen { 
	paperheight sub abs 16 lt exch 
	paperwidth sub abs 16 lt and
	{/papername exch def} {pop} ifelse
	} bind def
/setpapername { 
	/papersizedict 14 dict def 
	papersizedict begin
	/papername /unknown def 
		/Letter 8.5 inch 11.0 inch pagedimen
		/LetterSmall 7.68 inch 10.16 inch pagedimen
		/Tabloid 11.0 inch 17.0 inch pagedimen
		/Ledger 17.0 inch 11.0 inch pagedimen
		/Legal 8.5 inch 14.0 inch pagedimen
		/Statement 5.5 inch 8.5 inch pagedimen
		/Executive 7.5 inch 10.0 inch pagedimen
		/A3 11.69 inch 16.5 inch pagedimen
		/A4 8.26 inch 11.69 inch pagedimen
		/A4Small 7.47 inch 10.85 inch pagedimen
		/B4 10.125 inch 14.33 inch pagedimen
		/B5 7.16 inch 10.125 inch pagedimen
	end
	} bind def
/papersize {
	papersizedict begin
		/Letter {lettertray letter} def
		/LetterSmall {lettertray lettersmall} def
		/Tabloid {11x17tray 11x17} def
		/Ledger {ledgertray ledger} def
		/Legal {legaltray legal} def
		/Statement {statementtray statement} def
		/Executive {executivetray executive} def
		/A3 {a3tray a3} def
		/A4 {a4tray a4} def
		/A4Small {a4tray a4small} def
		/B4 {b4tray b4} def
		/B5 {b5tray b5} def
		/unknown {unknown} def
	papersizedict dup papername known {papername} {/unknown} ifelse get
	end
	statusdict begin stopped end 
	} bind def
/manualpapersize {
	papersizedict begin
		/Letter {letter} def
		/LetterSmall {lettersmall} def
		/Tabloid {11x17} def
		/Ledger {ledger} def
		/Legal {legal} def
		/Statement {statement} def
		/Executive {executive} def
		/A3 {a3} def
		/A4 {a4} def
		/A4Small {a4small} def
		/B4 {b4} def
		/B5 {b5} def
		/unknown {unknown} def
	papersizedict dup papername known {papername} {/unknown} ifelse get
	end
	stopped 
	} bind def
/desperatepapersize {
	statusdict /setpageparams known
		{
		paperwidth paperheight 0 1 
		statusdict begin
		{setpageparams} stopped 
		end
		} {true} ifelse 
	} bind def
/papersizefailure {
	FMAllowPaperSizeMismatch not
		{
(The requested paper size is not available in any currently-installed tray)
(Edit the PS file to "FMAllowPaperSizeMismatch true" to use default tray)
		 FMFAILURE } if
	} def
/DiacriticEncoding [
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl
/numbersign /dollar /percent /ampersand /quotesingle /parenleft
/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
/two /three /four /five /six /seven /eight /nine /colon /semicolon
/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash
/bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h
/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar
/braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute
/Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis
/atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis
/iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve
/ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex
/udieresis /dagger /.notdef /cent /sterling /section /bullet
/paragraph /germandbls /registered /copyright /trademark /acute
/dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef
/yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown
/exclamdown /logicalnot /.notdef /florin /.notdef /.notdef
/guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde
/Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright
/quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis
/fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl
/periodcentered /quotesinglbase /quotedblbase /perthousand
/Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute
/Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve
/Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron
/breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron
] def
/ReEncode { 
	dup 
	length 
	dict begin 
	{
	1 index /FID ne 
		{def} 
		{pop pop} ifelse 
	} forall 
	0 eq {/Encoding DiacriticEncoding def} if 
	currentdict 
	end 
	} bind def
FMPColor 
	
	{
	/BEGINBITMAPCOLOR { 
		BITMAPCOLOR} def
	/BEGINBITMAPCOLORc { 
		BITMAPCOLORc} def
	/BEGINBITMAPTRUECOLOR { 
		BITMAPTRUECOLOR } def
	/BEGINBITMAPTRUECOLORc { 
		BITMAPTRUECOLORc } def
	/BEGINBITMAPCMYK { 
		BITMAPCMYK } def
	/BEGINBITMAPCMYKc { 
		BITMAPCMYKc } def
	}
	
	{
	/BEGINBITMAPCOLOR { 
		BITMAPGRAY} def
	/BEGINBITMAPCOLORc { 
		BITMAPGRAYc} def
	/BEGINBITMAPTRUECOLOR { 
		BITMAPTRUEGRAY } def
	/BEGINBITMAPTRUECOLORc { 
		BITMAPTRUEGRAYc } def
	/BEGINBITMAPCMYK { 
		BITMAPCMYKGRAY } def
	/BEGINBITMAPCMYKc { 
		BITMAPCMYKGRAYc } def
	}
ifelse
/K { 
	FMPrintAllColorsAsBlack {
		dup 1 eq 2 index 1 eq and 3 index 1 eq and not
			{7 {pop} repeat 0 0 0 1 0 0 0} if
	} if 
	FrameCurColors astore 
	pop combineColor
} bind def
/graymode true def
fMLevel1 {
	/fmGetFlip {
		fMatrix2 exch get mul 0 lt { -1 } { 1 } ifelse
	} FmBD
} if
/setPatternMode {
	fMLevel1 {
		2 index patScreenDict exch known {
			pop pop
			patScreenDict exch get aload pop 
			freq 								
			mul									
			5 2 roll							
			fMatrix2 currentmatrix 1 get 0 ne {
				3 -1 roll 90 add 3 1 roll 		
				sflipx 1 fmGetFlip sflipy 2 fmGetFlip neg mul
			} {  								
				sflipx 0 fmGetFlip sflipy 3 fmGetFlip mul 
			} ifelse
			0 lt {exch pop} {pop} ifelse 		
			fMNegative { 
				{neg} fmConcatProcs 			
			} if
			bind
			
			
			
			systemdict /setscreen get exec		
			/FrameCurGray exch def
		} {
			/bwidth  exch def
			/bpside  exch def
			/bstring exch def
			/onbits 0 def  /offbits 0 def
			freq sangle landscape {90 add} if 
				{/ypoint exch def
				 /xpoint exch def
				 /xindex xpoint 1 add 2 div bpside mul cvi def
				 /yindex ypoint 1 add 2 div bpside mul cvi def
				 bstring yindex bwidth mul xindex 8 idiv add get
				 1 7 xindex 8 mod sub bitshift and 0 ne fMNegative {not} if
				 {/onbits  onbits  1 add def 1}
				 {/offbits offbits 1 add def 0}
				 ifelse
				}
				setscreen
			offbits offbits onbits add div fMNegative {1.0 exch sub} if
			/FrameCurGray exch def
		} ifelse
	} { 
		pop pop
		dup patCache exch known {
			patCache exch get
		} { 
			dup
			patDict /bstring 3 -1 roll put
			patDict 
			9 PatFreq screenIndex get div dup matrix scale
			makepattern
			dup 
			patCache 4 -1 roll 3 -1 roll put
		} ifelse
		/FrameCurGray 0 def
		/FrameCurPat exch def
	} ifelse
	/graymode false def
	combineColor
} bind def
/setGrayScaleMode {
	graymode not {
		/graymode true def
		fMLevel1 {
			setCurrentScreen
		} if
	} if
	/FrameCurGray exch def
	combineColor
} bind def
/normalize {
	transform round exch round exch itransform
	} bind def
/dnormalize {
	dtransform round exch round exch idtransform
	} bind def
/lnormalize { 
	0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop
	} bind def
/H { 
	lnormalize setlinewidth
	} bind def
/Z {
	setlinecap
	} bind def
	
/PFill {
	graymode fMLevel1 or not {
		gsave 1 setgray eofill grestore
	} if
} bind def
/PStroke {
	graymode fMLevel1 or not {
		gsave 1 setgray stroke grestore
	} if
	stroke
} bind def
/X { 
	fillvals exch get
	dup type /stringtype eq
	{8 1 setPatternMode} 
	{setGrayScaleMode}
	ifelse
	} bind def
/V { 
	PFill gsave eofill grestore
	} bind def
/Vclip {
	clip
	} bind def
/Vstrk {
	currentlinewidth exch setlinewidth PStroke setlinewidth
	} bind def
/N { 
	PStroke
	} bind def
/Nclip {
	strokepath clip newpath
	} bind def
/Nstrk {
	currentlinewidth exch setlinewidth PStroke setlinewidth
	} bind def
/M {newpath moveto} bind def
/E {lineto} bind def
/D {curveto} bind def
/O {closepath} bind def
/L { 
 	/n exch def
	newpath
	normalize
	moveto 
	2 1 n {pop normalize lineto} for
	} bind def
/Y { 
	L 
	closepath
	} bind def
/R { 
	/y2 exch def
	/x2 exch def
	/y1 exch def
	/x1 exch def
	x1 y1
	x2 y1
	x2 y2
	x1 y2
	4 Y 
	} bind def
/rarc 
	{rad 
	 arcto
	} bind def
/RR { 
	/rad exch def
	normalize
	/y2 exch def
	/x2 exch def
	normalize
	/y1 exch def
	/x1 exch def
	mark
	newpath
	{
	x1 y1 rad add moveto
	x1 y2 x2 y2 rarc
	x2 y2 x2 y1 rarc
	x2 y1 x1 y1 rarc
	x1 y1 x1 y2 rarc
	closepath
	} stopped {x1 y1 x2 y2 R} if 
	cleartomark
	} bind def
/RRR { 
	/rad exch def
	normalize /y4 exch def /x4 exch def
	normalize /y3 exch def /x3 exch def
	normalize /y2 exch def /x2 exch def
	normalize /y1 exch def /x1 exch def
	newpath
	normalize moveto 
	mark
	{
	x2 y2 x3 y3 rarc
	x3 y3 x4 y4 rarc
	x4 y4 x1 y1 rarc
	x1 y1 x2 y2 rarc
	closepath
	} stopped
	 {x1 y1 x2 y2 x3 y3 x4 y4 newpath moveto lineto lineto lineto closepath} if
	cleartomark
	} bind def
/C { 
	grestore
	gsave
	R 
	clip
	setCurrentScreen
} bind def
/CP { 
	grestore
	gsave
	Y 
	clip
	setCurrentScreen
} bind def
/F { 
	FMfonts exch get
	FMpointsize scalefont
	setfont
	} bind def
/Q { 
	/FMpointsize exch def
	F 
	} bind def
/T { 
	moveto show
	} bind def
/RF { 
	rotate
	0 ne {-1 1 scale} if
	} bind def
/TF { 
	gsave
	moveto 
	RF
	show
	grestore
	} bind def
/P { 
	moveto
	0 32 3 2 roll widthshow
	} bind def
/PF { 
	gsave
	moveto 
	RF
	0 32 3 2 roll widthshow
	grestore
	} bind def
/S { 
	moveto
	0 exch ashow
	} bind def
/SF { 
	gsave
	moveto
	RF
	0 exch ashow
	grestore
	} bind def
/B { 
	moveto
	0 32 4 2 roll 0 exch awidthshow
	} bind def
/BF { 
	gsave
	moveto
	RF
	0 32 4 2 roll 0 exch awidthshow
	grestore
	} bind def
/G { 
	gsave
	newpath
	normalize translate 0.0 0.0 moveto 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath 
	PFill fill
	grestore
	} bind def
/Gstrk {
	savematrix
    newpath
    2 index 2 div add exch 3 index 2 div sub exch 
    normalize 2 index 2 div sub exch 3 index 2 div add exch 
    translate
    scale 
    0.0 0.0 1.0 5 3 roll arc 
    restorematrix
    currentlinewidth exch setlinewidth PStroke setlinewidth
    } bind def
/Gclip { 
	newpath
	savematrix
	normalize translate 0.0 0.0 moveto 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath 
	clip newpath
	restorematrix
	} bind def
/GG { 
	gsave
	newpath
	normalize translate 0.0 0.0 moveto 
	rotate 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath
	PFill
	fill
	grestore
	} bind def
/GGclip { 
	savematrix
	newpath
    normalize translate 0.0 0.0 moveto 
    rotate 
    dnormalize scale 
    0.0 0.0 1.0 5 3 roll arc 
    closepath
	clip newpath
	restorematrix
	} bind def
/GGstrk { 
	savematrix
    newpath
    normalize translate 0.0 0.0 moveto 
    rotate 
    dnormalize scale 
    0.0 0.0 1.0 5 3 roll arc 
    closepath 
	restorematrix
    currentlinewidth exch setlinewidth PStroke setlinewidth
	} bind def
/A { 
	gsave
	savematrix
	newpath
	2 index 2 div add exch 3 index 2 div sub exch 
	normalize 2 index 2 div sub exch 3 index 2 div add exch 
	translate 
	scale 
	0.0 0.0 1.0 5 3 roll arc 
	restorematrix
	PStroke
	grestore
	} bind def
/Aclip {
	newpath
	savematrix
	normalize translate 0.0 0.0 moveto 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath 
	strokepath clip newpath
	restorematrix
} bind def
/Astrk {
	Gstrk
} bind def
/AA { 
	gsave
	savematrix
	newpath
	
	3 index 2 div add exch 4 index 2 div sub exch 
	
	normalize 3 index 2 div sub exch 4 index 2 div add exch
	translate 
	rotate 
	scale 
	0.0 0.0 1.0 5 3 roll arc 
	restorematrix
	PStroke
	grestore
	} bind def
/AAclip {
	savematrix
	newpath
    normalize translate 0.0 0.0 moveto 
    rotate 
    dnormalize scale 
    0.0 0.0 1.0 5 3 roll arc 
    closepath
	strokepath clip newpath
	restorematrix
} bind def
/AAstrk {
	GGstrk
} bind def
/BEGINPRINTCODE { 
	/FMdicttop countdictstack 1 add def 
	/FMoptop count 7 sub def 
	/FMsaveobject save def
	userdict begin 
	/showpage {} def 
	FMNORMALIZEGRAPHICS 
	3 index neg 3 index neg translate
	} bind def
/ENDPRINTCODE {
	count -1 FMoptop {pop pop} for 
	countdictstack -1 FMdicttop {pop end} for 
	FMsaveobject restore 
	} bind def
/gn { 
	0 
	{	46 mul 
		cf read pop 
		32 sub 
		dup 46 lt {exit} if 
		46 sub add 
		} loop
	add 
	} bind def
/cfs { 
	/str sl string def 
	0 1 sl 1 sub {str exch val put} for 
	str def 
	} bind def
/ic [ 
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
	0
	{0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx}
	{10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx}
	{19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12}
	{13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh}
	{4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh}
	{13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl}
	{7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl}
	{0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl}
	{10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl}
	] def
/ms { 
	/sl exch def 
	/val 255 def 
	/ws cfs 
	/im cfs 
	/val 0 def 
	/bs cfs 
	/cs cfs 
	} bind def
400 ms 
/ip { 
	is 
	0 
	cf cs readline pop 
	{	ic exch get exec 
		add 
		} forall 
	pop 
	
	} bind def
/rip { 
	   
	  
	  bis ris copy pop 
      is
      0
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop 
	  ris gis copy pop 
	  dup is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop
	  gis bis copy pop 
	  dup add is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
      pop 
      
      } bind def
/rip4 { 
	   
	  
	  kis cis copy pop 
      is
      0
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop 
	  cis mis copy pop 
	  dup is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop
	  mis yis copy pop 
	  dup dup add is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop
	  yis kis copy pop 
	  3 mul is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
      pop 
      
      } bind def
/wh { 
	/len exch def 
	/pos exch def 
	ws 0 len getinterval im pos len getinterval copy pop
	pos len 
	} bind def
/bl { 
	/len exch def 
	/pos exch def 
	bs 0 len getinterval im pos len getinterval copy pop
	pos len 
	} bind def
/s1 1 string def
/fl { 
	/len exch def 
	/pos exch def 
	/val cf s1 readhexstring pop 0 get def
	pos 1 pos len add 1 sub {im exch val put} for
	pos len 
	} bind def
/hx { 
	3 copy getinterval 
	cf exch readhexstring pop pop 
	} bind def
/wbytes { 
      dup dup
      8 gt { pop 8 idiv mul }
      { 8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse } ifelse
	} bind def
/BEGINBITMAPBWc { 
	1 {} COMMONBITMAPc
	} bind def
/BEGINBITMAPGRAYc { 
	8 {} COMMONBITMAPc
	} bind def
/BEGINBITMAP2BITc { 
	2 {} COMMONBITMAPc
	} bind def
/COMMONBITMAPc { 
		 
	/cvtProc exch def
	/depth exch def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
	cvtProc                
	/is im 0 lb getinterval def 
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	width height depth [width 0 0 height neg 0 height] 
	{ip} image 
	bitmapsave restore 
	grestore
	} bind def
/BEGINBITMAPBW { 
	1 {} COMMONBITMAP
	} bind def
/BEGINBITMAPGRAY { 
	8 {} COMMONBITMAP
	} bind def
/BEGINBITMAP2BIT { 
	2 {} COMMONBITMAP
	} bind def
/COMMONBITMAP { 
	/cvtProc exch def
	/depth exch def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/bitmapsave save def 
	cvtProc              
	/is width depth wbytes string def
	/cf currentfile def 
	width height depth [width 0 0 height neg 0 height] 
	{cf is readhexstring pop} image
	bitmapsave restore 
	grestore
	} bind def
/ngrayt 256 array def
/nredt 256 array def
/nbluet 256 array def
/ngreent 256 array def
fMLevel1 {
/colorsetup {
	currentcolortransfer
	/gryt exch def
	/blut exch def
	/grnt exch def
	/redt exch def
	0 1 255 {
		/indx exch def
		/cynu 1 red indx get 255 div sub def
		/magu 1 green indx get 255 div sub def
		/yelu 1 blue indx get 255 div sub def
		/kk cynu magu min yelu min def
		/u kk currentundercolorremoval exec def
%		/u 0 def
		nredt indx 1 0 cynu u sub max sub redt exec put
		ngreent indx 1 0 magu u sub max sub grnt exec put
		nbluet indx 1 0 yelu u sub max sub blut exec put
		ngrayt indx 1 kk currentblackgeneration exec sub gryt exec put
	} for
	{255 mul cvi nredt exch get}
	{255 mul cvi ngreent exch get}
	{255 mul cvi nbluet exch get}
	{255 mul cvi ngrayt exch get}
	setcolortransfer
	{pop 0} setundercolorremoval
	{} setblackgeneration
	} bind def
}
{
/colorSetup2 {
	[ /Indexed /DeviceRGB 255 
		{dup red exch get 255 div 
		 exch dup green exch get 255 div 
		 exch blue exch get 255 div}
	] setcolorspace
} bind def
} ifelse
/fakecolorsetup {
	/tran 256 string def
	0 1 255 {/indx exch def 
		tran indx
		red indx get 77 mul
		green indx get 151 mul
		blue indx get 28 mul
		add add 256 idiv put} for
	currenttransfer
	{255 mul cvi tran exch get 255.0 div}
	exch fmConcatProcs settransfer
} bind def
/BITMAPCOLOR { 
	/depth 8 def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/bitmapsave save def
	fMLevel1 {	
		colorsetup
		/is width depth wbytes string def
		/cf currentfile def 
		width height depth [width 0 0 height neg 0 height] 
		{cf is readhexstring pop} {is} {is} true 3 colorimage 
	} {
		colorSetup2
		/is width depth wbytes string def
		/cf currentfile def 
		7 dict dup begin
			/ImageType 1 def
			/Width width def
			/Height height def
			/ImageMatrix [width 0 0 height neg 0 height] def
			/DataSource {cf is readhexstring pop} bind def
			/BitsPerComponent depth def
			/Decode [0 255] def
		end image	
	} ifelse
	bitmapsave restore 
	grestore
	} bind def
/BITMAPCOLORc { 
	/depth 8 def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
	fMLevel1 {	
		colorsetup
		/is im 0 lb getinterval def 
		ws 0 lb getinterval is copy pop 
		/cf currentfile def 
		width height depth [width 0 0 height neg 0 height] 
		{ip} {is} {is} true 3 colorimage
	} {
		colorSetup2
		/is im 0 lb getinterval def 
		ws 0 lb getinterval is copy pop 
		/cf currentfile def 
		7 dict dup begin
			/ImageType 1 def
			/Width width def
			/Height height def
			/ImageMatrix [width 0 0 height neg 0 height] def
			/DataSource {ip} bind def
			/BitsPerComponent depth def
			/Decode [0 255] def
		end image	
	} ifelse
	bitmapsave restore 
	grestore
	} bind def
/BITMAPTRUECOLORc { 
	/depth 24 def
        gsave
 	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/ris im 0 width getinterval def	
	/gis im width width getinterval def	
	/bis im width 2 mul width getinterval def 
        
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	width height 8 [width 0 0 height neg 0 height] 
	{width rip pop ris} {gis} {bis} true 3 colorimage
	bitmapsave restore 
	grestore
	} bind def
/BITMAPCMYKc { 
	/depth 32 def
        gsave
 	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/cis im 0 width getinterval def	
	/mis im width width getinterval def	
	/yis im width 2 mul width getinterval def 
	/kis im width 3 mul width getinterval def 
        
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	width height 8 [width 0 0 height neg 0 height] 
	{width rip4 pop cis} {mis} {yis} {kis} true 4 colorimage
	bitmapsave restore 
	grestore
	} bind def
/BITMAPTRUECOLOR { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /gis width string def
        /bis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop } 
        { cf gis readhexstring pop } 
        { cf bis readhexstring pop } 
        true 3 colorimage 
        bitmapsave restore 
        grestore
        } bind def
/BITMAPCMYK { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /mis width string def
        /yis width string def
        /kis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop } 
        { cf mis readhexstring pop } 
        { cf yis readhexstring pop } 
        { cf kis readhexstring pop } 
        true 4 colorimage 
        bitmapsave restore 
        grestore
        } bind def
/BITMAPTRUEGRAYc { 
	/depth 24 def
        gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
        /bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/ris im 0 width getinterval def	
	/gis im width width getinterval def	
	/bis im width 2 mul width getinterval def 
        ws 0 lb getinterval is copy pop 
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        {width rip pop ris gis bis width gray} image
        bitmapsave restore 
        grestore
        } bind def
/BITMAPCMYKGRAYc { 
	/depth 32 def
        gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
        /bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/cis im 0 width getinterval def	
	/mis im width width getinterval def	
	/yis im width 2 mul width getinterval def 
	/kis im width 3 mul width getinterval def 
        ws 0 lb getinterval is copy pop 
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        {width rip pop cis mis yis kis width cgray} image
        bitmapsave restore 
        grestore
        } bind def
/cgray { 
        /ww exch def
        /k exch def
        /y exch def
        /m exch def
        /c exch def
        0 1 ww 1 sub { /i exch def c i get m i get y i get k i get CMYKtoRGB
				.144 mul 3 1 roll .587 mul 3 1 roll .299 mul add add
				c i 3 -1 roll floor cvi put } for
        c
 		} bind def
/gray { 
        /ww exch def
        /b exch def
        /g exch def
        /r exch def
        0 1 ww 1 sub { /i exch def r i get .299 mul g i get .587 mul
			b i get .114 mul add add r i 3 -1 roll floor cvi put } for
        r
        } bind def
/BITMAPTRUEGRAY { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /gis width string def
        /bis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop 
          cf gis readhexstring pop 
          cf bis readhexstring pop width gray}  image
        bitmapsave restore 
        grestore
        } bind def
/BITMAPCMYKGRAY { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /yis width string def
        /mis width string def
        /kis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop 
          cf mis readhexstring pop 
          cf yis readhexstring pop 
          cf kis readhexstring pop width cgray}  image
        bitmapsave restore 
        grestore
        } bind def
/BITMAPGRAY { 
	8 {fakecolorsetup} COMMONBITMAP
	} bind def
/BITMAPGRAYc { 
	8 {fakecolorsetup} COMMONBITMAPc
	} bind def
/ENDBITMAP {
	} bind def
end 
	/ALDmatrix matrix def ALDmatrix currentmatrix pop
/StartALD {
	/ALDsave save def
	 savematrix
	 ALDmatrix setmatrix
	} bind def
/InALD {
	 restorematrix
	} bind def
/DoneALD {
	 ALDsave restore
	} bind def
/I { setdash } bind def
/J { [] 0 setdash } bind def
%%EndProlog
%%BeginSetup
(5.0) FMVERSION
1 1 0 0 612 792 0 1 9 FMDOCUMENT
0 0 /Palatino-Roman FMFONTDEFINE
1 0 /Times-Roman FMFONTDEFINE
2 0 /Times-Bold FMFONTDEFINE
3 0 /Courier-Bold FMFONTDEFINE
4 0 /Times-Italic FMFONTDEFINE
5 0 /Courier FMFONTDEFINE
32 FMFILLS
0 0 FMFILL
1 0.1 FMFILL
2 0.3 FMFILL
3 0.5 FMFILL
4 0.7 FMFILL
5 0.9 FMFILL
6 0.97 FMFILL
7 1 FMFILL
8 <0f1e3c78f0e1c387> FMFILL
9 <0f87c3e1f0783c1e> FMFILL
10 <cccccccccccccccc> FMFILL
11 <ffff0000ffff0000> FMFILL
12 <8142241818244281> FMFILL
13 <03060c183060c081> FMFILL
14 <8040201008040201> FMFILL
16 1 FMFILL
17 0.9 FMFILL
18 0.7 FMFILL
19 0.5 FMFILL
20 0.3 FMFILL
21 0.1 FMFILL
22 0.03 FMFILL
23 0 FMFILL
24 <f0e1c3870f1e3c78> FMFILL
25 <f0783c1e0f87c3e1> FMFILL
26 <3333333333333333> FMFILL
27 <0000ffff0000ffff> FMFILL
28 <7ebddbe7e7dbbd7e> FMFILL
29 <fcf9f3e7cf9f3f7e> FMFILL
30 <7fbfdfeff7fbfdfe> FMFILL
%%EndSetup
%%Page: "1" 1
%%BeginPaperSize: Letter
%%EndPaperSize
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
J
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(1) 500 42.62 T
1 24 Q
(The Log Manager \050xLM\051) 184.37 704 T
2 12 Q
(Michael Nishimoto) 257.5 664 T
2 16 Q
(1.0  Intr) 72 621.33 T
(oduction) 127.26 621.33 T
1 12 Q
-0.08 (The purpose of a log manager is to pro) 72 594 P
-0.08 (vide a service which allo) 257.14 594 P
-0.08 (ws f) 375.82 594 P
-0.08 (ast and reliable reconstruction) 395.94 594 P
1.34 (of a \336lesystem after a crash. It will also pro) 72 580 P
1.34 (vide higher performance for some operations, lik) 291.82 580 P
1.34 (e) 534.67 580 P
0.81 (updates to metadata. In order to accomplish this, other services log changes to \336lesystem meta-) 72 566 P
0.2 (data \050inodes, directories, free-space pool\051. The log manager groups multiple change requests into) 72 552 P
0.55 (single synchronous writes to its o) 72 538 P
0.55 (wn space on the disk. Once logged, the clients of the log man-) 234.78 538 P
0.07 (ager do not need to immediate \337ush their dirty b) 72 524 P
0.07 (uf) 304.04 524 P
0.07 (fers. The) 313.74 524 P
0.07 (y assume the action will be performed) 356.28 524 P
0.52 (such that \336lesystem consistenc) 72 510 P
0.52 (y will be maintained in the e) 221.05 510 P
0.52 (v) 360.55 510 P
0.52 (ent of a crash. Changes to user data) 366.37 510 P
(will not be logged since losing it w) 72 496 T
(ould not compromise \336lesystem inte) 240.22 496 T
(grity) 414.71 496 T
(.) 436.6 496 T
2 16 Q
(2.0  Log Repr) 72 455.33 T
(esentation) 165.04 455.33 T
1 12 Q
-0.28 (The log space is split into tw) 72 428 P
-0.28 (o parts, the) 208.23 428 P
2 F
-0.28 (on-disk log) 263.39 428 P
1 F
-0.28 ( and the) 319.47 428 P
2 F
-0.28 (in-cor) 359.64 428 P
-0.28 (e log) 390.08 428 P
1 F
-0.28 (. When an operation needs) 413.47 428 P
0.65 (to be logged, it \336rst gets handed to the in-core log. This log is nothing more than a FIFO queue) 72 414 P
0.93 (which holds log operations until some e) 72 400 P
0.93 (v) 268.59 400 P
0.93 (ent causes the queue to get \337ushed to the on-disk log.) 274.41 400 P
(Operations stored in the in-core log are kno) 72 386 T
(wn as) 280.66 386 T
2 F
(acti) 311.32 386 T
(v) 329.86 386 T
(e operations) 335.74 386 T
1 F
(.) 398.06 386 T
-0.22 (The v) 72 360 P
-0.22 (olume manager pro) 99.2 360 P
-0.22 (vides a preallocated linear address space \0500-n blocks\051 for the on-disk log,) 191.88 360 P
0.24 (which is k) 72 346 P
0.24 (ept separate from the data space. From a high-le) 121.69 346 P
0.24 (v) 354.27 346 P
0.24 (el vie) 360.09 346 P
0.24 (w) 386.36 346 P
0.24 (, the on-disk log appears to be) 394.24 346 P
0.87 (a circular queue, which wraps when hitting the end. Operations which are stored in the on-disk) 72 332 P
(log are kno) 72 318 T
(wn as) 125.69 318 T
2 F
(committed operations) 156.35 318 T
1 F
(.) 268 318 T
-0.15 (When a sequence of actions or operations need to be b) 72 292 P
-0.15 (undled and committed as one, we call this a) 331.54 292 P
2 F
(transaction) 72 278 T
1 F
( \050See \322T) 130 278 T
(ransaction Layer\323 on page) 169.56 278 T
(10.\051) 298.85 278 T
2 16 Q
(3.0  Log Records) 72 237.33 T
1 12 Q
0.13 (In order to reduce write acti) 72 210 P
0.13 (vity) 205.95 210 P
0.13 (, acti) 223.84 210 P
0.13 (v) 246.99 210 P
0.13 (e operations are grouped together into) 252.81 210 P
2 F
0.13 (log r) 438.86 210 P
0.13 (ecords) 462.43 210 P
1 F
0.13 ( and then) 495.76 210 P
1.51 (written to disk. While still in-core, these records are kno) 72 196 P
1.51 (wn as) 355.57 196 P
2 F
1.51 (acti) 389.25 196 P
1.51 (v) 407.79 196 P
1.51 (e) 413.67 196 P
1 F
1.51 (. Once on disk, the) 418.99 196 P
1.51 (y are) 514.84 196 P
0.33 (kno) 72 182 P
0.33 (wn as) 89.7 182 P
2 F
0.33 (committed) 121.01 182 P
1 F
0.33 (log records. Three e) 178.99 182 P
0.33 (v) 275.64 182 P
0.33 (ents may happen which cause the in-core queue to be) 281.45 182 P
(synced to disk.) 72 168 T
3 F
(\245) 72 148 T
1 F
(The in-core queue is near capacity) 85.75 148 T
(.) 249.9 148 T
3 F
(\245) 72 128 T
1 F
(An operation comes into xLM which requests an immediate \337ush to disk.) 85.75 128 T
3 F
(\245) 72 108 T
1 F
(Some internal timeout occurs.) 85.75 108 T
FMENDPAGE
%%EndPage: "1" 1
%%Page: "2" 2
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(2) 500 42.62 T
2 14 Q
(3.1  Contents of Log Records) 72 710.67 T
1 12 Q
0.25 (Log records are split into tw) 72 684 P
0.25 (o parts,) 208.77 684 P
2 F
0.25 (log r) 247.6 684 P
0.25 (ecord header) 271.3 684 P
1 F
0.25 ( and) 338.53 684 P
2 F
0.25 ( log r) 359.11 684 P
0.25 (ecord data) 386.05 684 P
1 F
0.25 (. Log record headers) 440.62 684 P
0.68 (contain information common to the entire log record, whereas log record data contains concate-) 72 670 P
(nated log operations.) 72 656 T
2 F
(3.1.1  Speci\336cs of a log r) 72 624 T
(ecord header) 194.45 624 T
3 F
(\245) 72 604 T
1 F
(Log sequence number of this log record) 85.75 604 T
3 F
(\245) 72 584 T
1 F
(Log sequence number of the last fully synced log record) 85.75 584 T
3 F
(\245) 72 564 T
1 F
(Length of log body in 64-bit w) 85.75 564 T
(ord lengths) 233.62 564 T
3 F
(\245) 72 544 T
1 F
0 (Magic number in \336rst w) 85.75 544 P
0 (ord of header) 201.6 544 P
0 (. If a \050sector) 264.9 544 P
0 (, block\051 be) 322.38 544 P
0 (gins with a speci\336c magic number) 373.18 544 P
0 (,) 537 544 P
(it will \050by de\336nition\051 be a log record header) 85.75 530 T
(. \050see) 295.06 530 T
(4.1.2 &) 326.38 530 T
(5.1\051) 368.71 530 T
3 F
(\245) 72 510 T
1 F
(Blocks in log body which ha) 85.75 510 T
(v) 223.17 510 T
(e had their \336rst w) 228.99 510 T
(ord o) 312.86 510 T
(v) 337.67 510 T
(erwritten \050see) 343.49 510 T
(4.1.2\051) 415.13 510 T
3 F
(\245) 72 490 T
1 F
(Possibly -- number of log operations in log body) 85.75 490 T
3 F
(\245) 72 470 T
1 F
(Header is 512 bytes in length -- one disk sector) 85.75 470 T
2 F
(3.1.2  Speci\336cs of log r) 72 438 T
(ecord data) 185.45 438 T
1 F
-0.09 (The log operations contained in log record data are split into tw) 72 412 P
-0.09 (o parts,) 375.81 412 P
2 F
-0.09 (log operation header) 413.95 412 P
1 F
-0.09 ( and) 519.76 412 P
2 F
0.85 (log operation data) 72 398 P
1 F
0.85 (. Log operation data is a stream of post-image double-w) 167.03 398 P
0.85 (ord aligned bytes; a) 443.14 398 P
-0.06 (post-image is a snapshot of meta-data after a modi\336cation has been made. Note that this implies a) 72 384 P
0.05 (time ordering of writes. Buf) 72 370 P
0.05 (fer metadata can only be synced to disk after its associated log record) 206.2 370 P
(has been written to disk. Log operation headers contain:) 72 356 T
3 F
(\245) 72 336 T
1 F
(Who ask) 85.75 336 T
(ed xLM to log the operation.) 127.95 336 T
3 F
(\245) 72 316 T
1 F
(Length of log operation data in bytes) 85.75 316 T
3 F
(\245) 72 296 T
1 F
(T) 85.75 296 T
(ransaction ID) 92.66 296 T
3 F
(\245) 72 276 T
1 F
(T) 85.75 276 T
(ype of operation \050if we choose to ha) 92.12 276 T
(v) 264.83 276 T
(e operation logging\051) 270.65 276 T
2 14 Q
(3.2  Log Sequence Numbers) 72 242.67 T
1 12 Q
0.31 (Log sequence numbers are 64 bits in length. The lo) 72 216 P
0.31 (wer 32 bits are a log block number) 320.42 216 P
0.31 (, while the) 489.06 216 P
0.46 (upper 32 bits mak) 72 202 P
0.46 (e up a number which starts with one and increments each time the on-disk log) 159.59 202 P
0.23 (wraps. A) 72 188 P
2 F
0.23 (log block number) 118.78 188 P
1 F
0.23 ( is the logical number of the block \0500-n\051. Assuming 512 byte blocks,) 209.26 188 P
0.75 (this w) 72 174 P
0.75 (ould limit the size of the on-disk log to 2 terabytes. If we were to assume the on-disk log) 101.63 174 P
0.38 (could wrap once a second, which is abnormally high, the upper 32 bits w) 72 160 P
0.38 (ould wrap in about 136) 427.14 160 P
0.61 (years. Consequently) 72 146 P
0.61 (, it appears that the chosen representation for a log sequence number should) 169.15 146 P
(be quite adequate for the life-time of xLM.) 72 132 T
FMENDPAGE
%%EndPage: "2" 2
%%Page: "3" 3
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(3) 500 42.62 T
2 14 Q
(3.3  On-disk Repr) 72 710.67 T
(esentation) 178.32 710.67 T
1 12 Q
0.22 (Each log record is preceeded with an informational) 72 684 P
2 F
0.22 (header) 322.36 684 P
1 F
0.22 ( \050size not to e) 357.69 684 P
0.22 (xceed one sector\051 which) 423.05 684 P
(contains:) 72 670 T
3 F
(\245) 72 650 T
1 F
(A log record magic number) 85.75 650 T
3 F
(\245) 72 630 T
1 F
(A log sequence number) 85.75 630 T
3 F
(\245) 72 610 T
1 F
(The length of the log record) 85.75 610 T
3 F
(\245) 72 590 T
1 F
(Of) 85.75 590 T
(fset to pre) 98.11 590 T
(vious log record header or \050-1\051 if none) 145.79 590 T
3 F
(\245) 72 570 T
1 F
(The number of log operations \050maybe\051) 85.75 570 T
3 F
(\245) 72 550 T
1 F
(A boolean, stating whether this log record has been check-summed, and possibly a checksum.) 85.75 550 T
(It has not been determined whether log records will be of equal length.) 72 524 T
2 14 Q
(3.4  Synchr) 72 490.67 T
(onization Records) 139.03 490.67 T
1 12 Q
0.64 (Buf) 72 464 P
0.64 (fer synchronization information will be k) 89.7 464 P
0.64 (ept in the log; so upon reco) 290.41 464 P
0.64 (v) 424.71 464 P
0.64 (ery) 430.53 464 P
0.64 (, we kno) 445.08 464 P
0.64 (w approxi-) 487.04 464 P
1.07 (mately what metadata has been written to disk. This is only an optimization mechanism which) 72 450 P
2.37 (will help speed reco) 72 436 P
2.37 (v) 175.23 436 P
2.37 (ery) 181.05 436 P
2.37 (. W) 195.59 436 P
2.37 (ithout this information, the entire on-disk log w) 214.81 436 P
2.37 (ould need to be) 459.25 436 P
(replayed.) 72 422 T
0.29 (Each log record header will contain the log sequence number of the last log record to ha) 72 396 P
0.29 (v) 498.93 396 P
0.29 (e all its) 504.76 396 P
-0.27 (associated metadata b) 72 382 P
-0.27 (uf) 175.86 382 P
-0.27 (fers written to disk. P) 185.56 382 P
-0.27 (ast log managers ha) 287.3 382 P
-0.27 (v) 381.24 382 P
-0.27 (e logged sync records which are) 387.06 382 P
0.69 (a special log record stating the same information as abo) 72 368 P
0.69 (v) 344.97 368 P
0.69 (e.These w) 350.79 368 P
0.69 (ould ha) 400.01 368 P
0.69 (v) 436.12 368 P
0.69 (e been placed in the) 441.94 368 P
1.17 (log at re) 72 354 P
1.17 (gular interv) 113.47 354 P
1.17 (als. W) 170 354 P
1.17 (e ha) 200.86 354 P
1.17 (v) 221.44 354 P
1.17 (e chosen to put the b) 227.26 354 P
1.17 (uf) 331.84 354 P
1.17 (fer sync information in e) 341.54 354 P
1.17 (v) 464.54 354 P
1.17 (ery log record) 470.36 354 P
-0.24 (header to mak) 72 340 P
-0.24 (e it easier to \336nd and to allo) 139.38 340 P
-0.24 (w the information to be k) 271.08 340 P
-0.24 (ept more current. Synchroniza-) 391.42 340 P
-0.15 (tion information w) 72 326 P
-0.15 (ould need to include a log sequence number and the block address of where the) 161.57 326 P
(log record for that LSN started.) 72 312 T
2 14 Q
(3.5  In-cor) 72 278.67 T
(e Log) 133.57 278.67 T
1 12 Q
0.05 (The in-core log will consist of tw) 72 252 P
0.05 (o k) 232.15 252 P
0.05 (ernel malloc\325ed re) 247.07 252 P
0.05 (gions which are alternati) 334.29 252 P
0.05 (v) 452.44 252 P
0.05 (ely written. Each) 458.26 252 P
0.81 (represents an entire log record. This will allo) 72 238 P
0.81 (w writes to the in-core log to continue while a log) 292.64 238 P
(record is committed to disk.) 72 224 T
2 16 Q
(4.0  Reco) 72 183.33 T
(v) 133.6 183.33 T
(ery Manager) 141.44 183.33 T
1 12 Q
-0.01 (After a crash, the reco) 72 156 P
-0.01 (v) 178.06 156 P
-0.01 (ery manager reads the on-disk log and replays it in some manner to recon-) 183.88 156 P
0.62 (struct the \336lesystem. It will hand idempotent actions to other services without kno) 72 142 P
0.62 (wing the con-) 472.77 142 P
(tents of the v) 72 128 T
(arious operations.) 134.03 128 T
FMENDPAGE
%%EndPage: "3" 3
%%Page: "4" 4
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(4) 500 42.62 T
2 14 Q
(4.1  Finding the end of the on-disk log) 72 710.67 T
1 12 Q
0.37 (Since reco) 72 684 P
0.37 (v) 122.5 684 P
0.37 (ery must be f) 128.32 684 P
0.37 (ast, quickly \336nding the end of the on-disk log is a requirement. The last) 192.28 684 P
(v) 72 670 T
(alid on-disk log record will be one where there is either) 77.7 670 T
3 F
(\245) 72 650 T
1 F
(No le) 85.75 650 T
(g) 111.89 650 T
(al log header after this log record) 117.83 650 T
3 F
(\245) 72 630 T
1 F
(A checksum in this log header with a log body which corresponds to the checksum) 85.75 630 T
2 F
(4.1.1  The T) 72 598 T
(olerant way) 131.9 598 T
1 F
-0.03 (Reserv) 72 572 P
-0.03 (e tw) 105.14 572 P
-0.03 (o blocks A & B at the be) 125.32 572 P
-0.03 (ginning of the log space for administration information. Writ-) 243.93 572 P
0.28 (ing alternati) 72 558 P
0.28 (v) 129.64 558 P
0.28 (ely into A and B, place information about the current end of the log) 135.46 558 P
4 F
0.28 (e) 466.36 558 P
0.28 (very once in a) 471.51 558 P
0.5 (while) 72 544 P
1 F
0.5 (. When reco) 98 544 P
0.5 (v) 157.14 544 P
0.5 (ering from a crash, read the tw) 162.96 544 P
0.5 (o blocks and tak) 312.83 544 P
0.5 (e the one with the lar) 392.55 544 P
0.5 (ger time-) 495.84 544 P
0.47 (stamp. Seek to the winning block location and start scanning forw) 72 530 P
0.47 (ard, looking for the end of the) 393.54 530 P
(log .) 72 516 T
2 F
(4.1.2  A less encumber) 72 484 T
(ed run-time model) 185.77 484 T
1 F
0.78 (In order to eliminate the additional seeking which is required in the T) 72 458 P
0.78 (olerant scheme, xLM will) 413.68 458 P
0.75 (use a more intelligent algorithm when searching for the end of the log. This proposal is simple.) 72 444 P
1.46 (Perform a binary search o) 72 430 P
1.46 (v) 201.6 430 P
1.46 (er the entire log space until the search se) 207.42 430 P
1.46 (gment is small enough to) 413.5 430 P
0.06 (search linearly) 72 416 P
0.06 (. Assuming a gig) 141.59 416 P
0.06 (abyte log, it w) 223.05 416 P
0.06 (ould tak) 291.77 416 P
0.06 (e 11 random seeks to get do) 330.71 416 P
0.06 (wn to a 0.5 MB) 464.76 416 P
(linear scan. This time should be ne) 72 402 T
(gligible during the bootup phase.) 238.8 402 T
0.42 (Once the binary search selects a gi) 72 376 P
0.42 (v) 240.16 376 P
0.42 (en log block number) 245.98 376 P
0.42 (, seek to this location and start scanning) 345.75 376 P
0.88 (forw) 72 362 P
0.88 (ard, looking for a v) 94.54 362 P
0.88 (alid log header) 190.08 362 P
0.88 (. Log headers will al) 262.5 362 P
0.88 (w) 364.23 362 P
0.88 (ays be) 372.77 362 P
0.88 (gin with some 32-bit length) 403.8 362 P
1.59 (magic number on a block boundary) 72 348 P
1.59 (. Since the log manager kno) 249.46 348 P
1.59 (ws about the control and data) 391.08 348 P
0.69 (being placed in the log, it will replace an) 72 334 P
0.69 (y magic number with a zero if the number w) 273 334 P
0.69 (ould ha) 492.73 334 P
0.69 (v) 528.85 334 P
0.69 (e) 534.67 334 P
(f) 72 320 T
(allen on a block start boundary) 75.88 320 T
(. In the log header) 223.4 320 T
(, a note will be made about the replacement.) 309.9 320 T
2 F
(4.1.3  The end of the log) 72 288 T
1 F
-0.25 (V) 72 262 P
-0.25 (ersion one will not perform checksumming on the log header) 79.33 262 P
-0.25 (. Instead, it assumes there must be a) 369.41 262 P
0 (follo) 72 248 P
0 (wing v) 94.37 248 P
0 (alid log header) 127.07 248 P
0 (. In order to insure a synchronous write has occurred, xLM will need to) 197.73 248 P
-0.21 (guarantee that a ne) 72 234 P
-0.21 (xt log record has been committed. As such, xLM will need to be) 161.49 234 P
-0.21 (gin a follo) 467.39 234 P
-0.21 (wing) 516 234 P
(log record write soon after completing the original commit.) 72 220 T
-0.19 (If the original commit w) 72 194 P
-0.19 (as mark) 188.45 194 P
-0.19 (ed ur) 225.79 194 P
-0.19 (gent) 249.71 194 P
-0.19 (by some request to xLM, the v) 273.37 194 P
-0.19 (alidating log record write) 418.92 194 P
0.55 (is started immediately) 72 180 P
0.55 (, as soon as the current in-core log is consistent. This may mean an empty) 178.32 180 P
0.85 (log record is committed to disk. If the original commit) 72 166 P
0.85 (w) 343.93 166 P
0.85 (as not ur) 352.47 166 P
0.85 (gent, xLM may set a timer to) 395.27 166 P
0.86 (determine the maximum amount of time to pass before the ne) 72 152 P
0.86 (xt commit tak) 375.7 152 P
0.86 (es place. Cascading) 443.97 152 P
-0.22 (ur) 72 138 P
-0.22 (gent requests may ha) 81.78 138 P
-0.22 (v) 181.86 138 P
-0.22 (e the beha) 187.68 138 P
-0.22 (vior that man) 235.64 138 P
-0.22 (y small log record commits are done continuously) 299.02 138 P
-0.22 (.) 537 138 P
(Ho) 72 124 T
(we) 86.36 124 T
(v) 100.06 124 T
(er) 105.88 124 T
(, an) 114.72 124 T
(y empty log record commit does not need to be v) 131.87 124 T
(alidated.) 366.88 124 T
FMENDPAGE
%%EndPage: "4" 4
%%Page: "5" 5
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(5) 500 42.62 T
2 14 Q
(4.2  Reading the on-disk log after a crash) 72 710.67 T
1 12 Q
0.41 (After \336nding the last sync record \050see) 72 684 P
0.41 (4.1-action 0\051, read forw) 261.46 684 P
0.41 (ard looking for the end of the OD) 376.19 684 P
0.15 (log \050action 1\051. While reading, \336nd those transactions and operations which are bounded by book-) 72 670 P
0.39 (ends. Complete operations are non-transactional actions which are bounded by book) 72 656 P
0.39 (ends. T) 480.71 656 P
0.39 (rans-) 516.01 656 P
-0.2 (actions are made up of multiple operations and need to ha) 72 642 P
-0.2 (v) 347.05 642 P
-0.2 (e a commit record. No) 352.87 642 P
-0.2 (w) 459.41 642 P
-0.2 (, redo or replay) 467.29 642 P
0.25 (each of the complete operations and committed transactions in order to the end of the log \050action) 72 628 P
(2\051. ;\325) 72 614 T
2 16 Q
(5.0  Other Algorithms) 72 413.83 T
2 14 Q
(5.1  Initializing the log space) 72 379.17 T
1 12 Q
-0.1 (Because log record headers ha) 72 352.5 P
-0.1 (v) 217.3 352.5 P
-0.1 (e a magic number in the \336rst w) 223.12 352.5 P
-0.1 (ord of each block, xLM must kno) 371.27 352.5 P
-0.1 (w) 531.34 352.5 P
0.48 (that this number doesn\325) 72 338.5 P
0.48 (t appear accidentally at startup. Although this operation may tak) 186.22 338.5 P
0.48 (e quite a) 498.38 338.5 P
0.65 (while, the initialization is important and can be performed by the xFS mkfs program. The mini-) 72 324.5 P
(mum guarantee is that the \336rst sector of each block be zeroed.) 72 310.5 T
2 14 Q
(5.2  Ho) 72 277.17 T
(w to gr) 114.25 277.17 T
(o) 155.99 277.17 T
(w the log space) 162.85 277.17 T
1 12 Q
0.9 (Gro) 72 250.5 P
0.9 (wing the log space will not be in the \336rst v) 90.36 250.5 P
0.9 (ersion of xLM; ho) 303.81 250.5 P
0.9 (we) 393.86 250.5 P
0.9 (v) 407.56 250.5 P
0.9 (er) 413.38 250.5 P
0.9 (, here are some ideas of) 422.22 250.5 P
(what may happen) 72 236.5 T
(from the perspecti) 159.65 236.5 T
(v) 246.66 236.5 T
(e of the log manager) 252.48 236.5 T
(.) 350.46 236.5 T
0.76 (xLM will ask xL) 72 210.5 P
0.76 (V to gro) 154.08 210.5 P
0.76 (w its log space. If the log space can be gro) 195.3 210.5 P
0.76 (wn in place, xlv will return) 406.21 210.5 P
1.35 (notice of this f) 72 196.5 P
1.35 (act. xLM will gro) 145.59 196.5 P
1.35 (w the log in place, e) 233.99 196.5 P
1.35 (xtending past the end of its pre) 337.2 196.5 P
1.35 (vious last) 492.98 196.5 P
0.65 (block. This lea) 72 182.5 P
0.65 (v) 144.06 182.5 P
0.65 (es xlv with the alternati) 149.88 182.5 P
0.65 (v) 264.85 182.5 P
0.65 (e of carving out another section of the dri) 270.67 182.5 P
0.65 (v) 474.22 182.5 P
0.65 (e, so the log) 480.04 182.5 P
0.12 (space can gro) 72 168.5 P
0.12 (w) 137.24 168.5 P
0.12 (. Since xlv pro) 145.12 168.5 P
0.12 (vides a linear log address space, xLM will not be af) 215.29 168.5 P
0.12 (fected when the) 463.79 168.5 P
(ph) 72 154.5 T
(ysical sectors representing the log are not contiguous.) 83.94 154.5 T
1.36 (Ho) 72 128.5 P
1.36 (we) 86.36 128.5 P
1.36 (v) 100.06 128.5 P
1.36 (er) 105.88 128.5 P
1.36 (, if xlv decides that the log must mo) 114.72 128.5 P
1.36 (v) 297.74 128.5 P
1.36 (e,) 303.56 128.5 P
1.36 ( the log manager will accommodate. Another) 314.89 128.5 P
-0.15 (thread can start cop) 72 114.5 P
-0.15 (ying the current log space to the ne) 165.08 114.5 P
-0.15 (w location while writes continue to the cur-) 332.05 114.5 P
-0.02 (rent log. At some point when the current log space is completely copied, the log manager can just) 72 100.5 P
0.74 (start writing to the ne) 72 86.5 P
0.74 (w log location and notify the v) 177.3 86.5 P
0.74 (olume manager that the old log space is no) 328.8 86.5 P
(longer needed.) 72 72.5 T
72 63 540 720 C
97.33 450.5 514.67 584 C
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
178.81 494 466.81 533.07 R
4 H
0 Z
0 X
0 0 0 1 0 0 0 K
N
1 12 Q
(read \0501\051) 473.42 516.68 T
(redo \0502\051) 473.42 504.23 T
391.06 527.54 391.06 499.25 2 L
2 H
2 Z
N
390.99 550.29 393.96 550.29 390.99 539.91 388.01 550.29 4 Y
0.5 H
0 Z
N
390.99 550.29 393.96 550.29 390.99 539.91 388.01 550.29 4 Y
V
390.99 564.13 390.99 550.54 2 L
2 Z
N
(last sync record \0500\051) 356.08 571.02 T
179.42 475.71 176.45 475.71 179.42 486.09 182.4 475.71 4 Y
0 Z
N
179.42 475.71 176.45 475.71 179.42 486.09 182.4 475.71 4 Y
V
179.42 466 179.42 475.46 2 L
2 Z
N
(be) 144.17 456.25 T
(ginning of on-disk log) 155.32 456.25 T
466.42 476.71 463.45 476.71 466.42 487.09 469.4 476.71 4 Y
0 Z
N
466.42 476.71 463.45 476.71 466.42 487.09 469.4 476.71 4 Y
V
466.42 467 466.42 476.46 2 L
2 Z
N
(end of on-disk log) 406.67 455.5 T
446.05 518.75 446.05 521.73 456.42 518.75 446.05 515.77 4 Y
0 Z
N
446.05 518.75 446.05 521.73 456.42 518.75 446.05 515.77 4 Y
V
394.33 518.75 445.8 518.75 2 L
2 Z
N
446.05 505.86 446.01 508.84 456.42 505.99 446.08 502.89 4 Y
0 Z
N
446.05 505.86 446.01 508.84 456.42 505.99 446.08 502.89 4 Y
V
394.5 505.25 445.8 505.86 2 L
2 Z
N
90 450 1 1 270 111 492.55 GG
111 491.55 114.64 491.55 111 478.87 107.37 491.55 4 Y
2 H
0 Z
N
111 491.55 114.64 491.55 111 478.87 107.37 491.55 4 Y
V
111 560 111 492.55 2 L
2 Z
N
(time) 102.75 569.75 T
72 63 540 720 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "5" 5
%%Page: "6" 6
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(6) 500 42.62 T
2 14 Q
(5.3  Block change logging) 72 710.67 T
1 12 Q
0.95 (This type of logging is required to help speed reco) 72 684 P
0.95 (v) 321.97 684 P
0.95 (ery of ple) 327.79 684 P
0.95 (x) 375.49 684 P
0.95 (ed \336lesystems after a crash. The) 381.31 684 P
-0.25 (\336lesystem k) 72 670 P
-0.25 (eeps track of which data blocks are being written to disk and which ones ha) 129.3 670 P
-0.25 (v) 488.11 670 P
-0.25 (e actually) 493.93 670 P
0.99 (made it. During reco) 72 656 P
0.99 (v) 174.11 656 P
0.99 (ery) 179.93 656 P
0.99 (, it analyzes a block change log to determine which blocks need to be) 194.48 656 P
(copied to restore ple) 72 642 T
(x consistenc) 169.46 642 T
(y) 228.28 642 T
(. See V) 233.5 642 T
(olume Manager for more details.) 266.94 642 T
0.65 (As f) 72 616 P
0.65 (ar as the log manager is concerned, it will get a call from the b) 92.86 616 P
0.65 (uf) 401.4 616 P
0.65 (fer cache to log some data) 411.1 616 P
0.24 (block locations immediately before the blocks are synced to disk. As such, the b) 72 602 P
0.24 (uf) 459.85 602 P
0.24 (fer cache must) 469.55 602 P
1.21 (k) 72 588 P
1.21 (eep track of b) 77.88 588 P
1.21 (uf) 146.91 588 P
1.21 (fers which represent ple) 156.61 588 P
1.21 (x writes. The \336lesystem does not w) 275.02 588 P
1.21 (ant to log all data) 451.83 588 P
-0.18 (block changes if the) 72 574 P
-0.18 (y do not need to be. Once data blocks are written to a ple) 167.6 574 P
-0.18 (x disk, xVM will call) 438.38 574 P
(the log manager to notify it which ple) 72 560 T
(x blocks ha) 252.8 560 T
(v) 307.22 560 T
(e been synced.) 313.04 560 T
(Re-iterating, it is) 72 534 T
2 F
(not) 156 534 T
1 F
( the job of xLM to determine which data blocks need to be logged.) 172.67 534 T
0.02 (Assumption: Because we log data block changes immediately before a b) 72 508 P
0.02 (uf) 419.9 508 P
0.02 (fer gets synced to disk,) 429.6 508 P
0.03 (the log can ignore these records when wrapping. The log should be long enough to guarantee that) 72 494 P
0.36 (writes ha) 72 480 P
0.36 (v) 115.78 480 P
0.36 (e succeeded. If we logged a block change operation when the b) 121.6 480 P
0.36 (uf) 428.55 480 P
0.36 (fer is written, the log) 438.24 480 P
(w) 72 466 T
(ould need to guarantee the b) 80.54 466 T
(uf) 215.94 466 T
(fer w) 225.64 466 T
(as written out before clobbering the entry) 250.5 466 T
(.) 448.34 466 T
(After a crash, xVM will call xLM to ask about the data blocks which did not mak) 72 440 T
(e it to disk.) 462.83 440 T
2 16 Q
(6.0  Registration of Log Manager Clients) 72 399.33 T
1 12 Q
1.13 (Re) 72 372 P
1.13 (gistration is a procedure where virtual processes \050other services\051 mak) 85.15 372 P
1.13 (e themselv) 427.44 372 P
1.13 (es kno) 480.05 372 P
1.13 (wn to) 511.87 372 P
-0.19 (the log manager at initialization time. The pro) 72 358 P
-0.19 (vided information will allo) 291.15 358 P
-0.19 (w the log manager to call) 419.29 358 P
0.18 (back these services during disaster reco) 72 344 P
0.18 (v) 262.32 344 P
0.18 (ery when the on-disk log is be) 268.14 344 P
0.18 (gin played back. Re) 413.67 344 P
0.18 (gistra-) 509.34 344 P
0.25 (tion can be vie) 72 330 P
0.25 (wed as a log operation that informs xLM of details which will not be con) 142.78 330 P
0.25 (v) 496.45 330 P
0.25 (e) 502.27 330 P
0.25 (yed on) 507.42 330 P
(re) 72 316 T
(gular operations.) 81.14 316 T
0.94 (In the \336rst v) 72 290 P
0.94 (ersion, all re) 132.97 290 P
0.94 (gistration will be done statically through some prede\336ned table. As an) 194.32 290 P
1.85 (enhancement to this scheme, a dynamic re) 72 276 P
1.85 (gistration mechanism will need to be de) 285.88 276 P
1.85 (v) 488 276 P
1.85 (eloped to) 493.82 276 P
(address the issues present with loadable modules and a distrib) 72 262 T
(uted en) 368.72 262 T
(vironment.) 403.24 262 T
2 16 Q
(7.0  Log Manager Interaction with Buffer Cache) 72 221.33 T
2 14 Q
(7.1  Wrapping the on-disk log) 72 186.67 T
1 12 Q
0.92 (Wrapping the on-disk log is one of the more comple) 72 160 P
0.92 (x e) 331.06 160 P
0.92 (v) 346.01 160 P
0.92 (ents with which the log manager must) 351.83 160 P
0.56 (deal. While one thread may be writing log records to the head of the circular log b) 72 146 P
0.56 (uf) 474.92 146 P
0.56 (fer) 484.61 146 P
0.56 (, another) 497.45 146 P
0.59 (thread will be attempting to push out dirty b) 72 132 P
0.59 (uf) 287.81 132 P
0.59 (fers; so log records at the tail can be written o) 297.51 132 P
0.59 (v) 522.52 132 P
0.59 (er) 528.34 132 P
0.59 (.) 537 132 P
0.21 (An) 72 118 P
0.21 (y good mechanism, which manages the log space, will try hard to disallo) 86.48 118 P
0.21 (w the head of the log) 437.98 118 P
0.91 (writer to approach the tail of the log. Re) 72 104 P
0.91 (g) 271.43 104 P
0.91 (ardless of this ef) 277.37 104 P
0.91 (fort, the log manager must guarantee) 358.8 104 P
0.17 (that the head and tail ne) 72 90 P
0.17 (v) 186.85 90 P
0.17 (er meet unless it is ready to abort actions which ha) 192.66 90 P
0.17 (v) 436.72 90 P
0.17 (e already been com-) 442.54 90 P
(mitted to the log. Some algorithms for solving this problem are:) 72 76 T
FMENDPAGE
%%EndPage: "6" 6
%%Page: "7" 7
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(7) 500 42.62 T
3 12 Q
(\245) 72 712 T
1 F
(Aborting the operation associated with the log record we are about to o) 85.75 712 T
(v) 426.83 712 T
(er) 432.65 712 T
(-write.) 441.74 712 T
3 F
(\245) 72 692 T
1 F
0.87 (Reserving enough log space when a client attempts to grab a b) 85.75 692 P
0.87 (uf) 394.66 692 P
0.87 (fer for writing, so xLM can) 404.36 692 P
(guarantee the operation will complete.) 85.75 678 T
3 F
(\245) 72 658 T
1 F
0.52 (Di) 85.75 658 P
0.52 (vide the log into sections and k) 97.44 658 P
0.52 (eep one full section between the head and tail. This scheme) 249.81 658 P
(sets an upper bound on the number of acti) 85.75 644 T
(v) 286.75 644 T
(e \336lesystem transactions.) 292.57 644 T
2 16 Q
(8.0  Interfaces & Constants) 72 603.33 T
2 14 Q
(8.1  Normal operation) 72 568.67 T
5 9 Q
(/* Log Clients */) 72 555 T
(#define TRANSACTION_MANAGER 1) 72 544 T
(#define VOLUME_MANAGER 2) 72 533 T
(/*) 72 511 T
(*) 72 500 T
(1. Reserve an amount of on-disk log space and return a ticket corresponding to the) 90 500 T
(*) 72 490 T
(reservation.) 108 490 T
(*) 72 479 T
(2. Potentially, push buffers at tail of log to disk.) 90 479 T
(*/) 72 468 T
(errno_t xfs_log_reserve\050) 72 457 T
(\050struct mountp *mp\051) 90 446 T
(filesystem_id,) 216 446 T
(\050int\051) 90 435 T
(length,) 216 435 T
(\050int\051) 90 424 T
(log_client,) 216 424 T
(\050uuid_t\051) 90 413 T
(tid,) 216 413 T
(\050uint\051) 90 402 T
(flags,) 216 402 T
(\050uint *\051) 90 391 T
(ticket\051) 216 391 T
(filesystem_id) 72 369 T
(-) 144 369 T
(length) 72 358 T
(- approximate number of bytes a specific log operation will take) 144 358 T
(log_client) 72 347 T
(- registration number. A compiled table will allow mapping from # to) 144 347 T
(function to call during recovery.) 180 336 T
(tid) 72 325 T
(- transaction id) 144 325 T
(ticket) 72 314 T
-0.33 (- identifier which gives permission to use a specific reservation during a) 144 314 P
(log write.) 180 303 T
(flags) 72 292 T
(:) 99 292 T
(XFS_LOG_RES_SLEEP) 108 292 T
(- If space is not available, sleep) 216 292 T
(XFS_LOG_RES_NO_SLEEP) 108 281 T
(- If space is not available, return error immediately) 216 281 T
(XFS_LOG_RES_PERM_RESERV) 108 270 T
(- Permanent reservation. Never deduct space on) 232.2 270 T
(xfs_log_write\050\051s. This is used when a transaction) 252 259 T
(will be long-lived \050deleting files\051 and determining a) 252 248 T
(complete reservation ahead of time may not be) 252 237 T
(feasible.) 252 226 T
(/*) 72 204 T
(*) 72 193 T
-0.49 (Replace old transaction id with new transaction id for the reservation identified) 108 193 P
(* by ticket. This is like changing the name on an airplane ticke reservation.) 72 182 T
(*/) 72 171 T
(errno_t xfs_log_new_transaction\050) 72 160 T
(\050uint\051) 90 149 T
(ticket,) 144 149 T
(\050uuid_t\051) 90 138 T
(old_tid,) 144 138 T
(\050uuid_t\051) 90 127 T
(new_tid\051) 144 127 T
(/*) 72 94 T
(*) 72 83 T
(Write the regions in a vector to the in-core log.) 108 83 T
(*/) 72 72 T
FMENDPAGE
%%EndPage: "7" 7
%%Page: "8" 8
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(8) 500 42.62 T
5 9 Q
(errno_t xfs_log_write\050) 72 714 T
(\050iovec []\051) 90 703 T
(write_vector,) 180 703 T
(\050int\051) 90 692 T
(nentries,) 180 692 T
(\050int\051) 90 681 T
(ticket\051) 180 681 T
(nentries) 72 659 T
(- length of write_vector; number of regions to write) 144 659 T
(struct iovec {) 72 637 T
(caddr_t) 108 626 T
(b_addr;) 180 626 T
(/* beginning address of region */) 252 626 T
(uint) 108 615 T
(length;) 180 615 T
(/* length in bytes of region */) 252 615 T
(long long) 108 604 T
(lsn;) 180 604 T
(/* log sequence number of region */) 252 604 T
(}) 72 593 T
(lsn) 72 582 T
(- log sequence number for) 144 582 T
(NOTE:) 72 560 T
-0.84 (Since the regions in one xfs_log_write\050\051 call may get written in multiple log records to) 72 549 P
-0.79 (the on-disk log, the log manager will return the log sequence numbers for each region in) 72 539 P
(the iovec array.) 72 529 T
(/*) 72 496 T
(* Force the current in-core log records to disk immediately.) 72 485 T
(*/) 72 474 T
(errno_t xfs_log_force\050) 72 463 T
(\050uint\051) 90 452 T
(flags\051) 144 452 T
(flags:) 72 430 T
(XFS_LOG_SYNC) 108 419 T
(- Don\325t return until all log records are written to on-disk log.) 180 419 T
(/*) 72 386 T
(*) 72 375 T
(1. Release the remaining portion of a reservation.) 90 375 T
(*) 72 364 T
(2. Commit log operation => write out some end log operation marker.) 90 364 T
(*/) 72 353 T
(errno_t xfs_log_done\050) 72 342 T
(\050uint\051) 90 331 T
(ticket,) 144 331 T
(\050uint\051) 90 320 T
(flags\051) 144 320 T
(ticket) 72 298 T
(-) 108 298 T
(flags:) 72 287 T
(XFS_LOG_SYNC) 108 276 T
(- Don\325t return until log records with transaction id associated) 180 276 T
(with ticket are written to on-disk log. Has no) 216 265 T
(implication) 464.4 265 T
(of urgency to write. Without this flag, calls are) 216 254 T
(asynchronous) 216 243 T
(XFS_LOG_FORCE) 108 232 T
(- Start writing log record to on-disk) 180 232 T
(log.) 379.8 232 T
(XFS_LOG_URGE) 108 221 T
(- Start thinking about writing log) 180 221 T
(record to on-disk log. This) 363.6 221 T
(will be implemented by using a) 216 210 T
(timer which will start the) 378 210 T
(write within a guaranteed amount of) 216 199 T
(time. The assumption is) 405 199 T
(that performance can be gained in the) 216 188 T
(system by not forcing) 415.8 188 T
(a write at this time.) 216 177 T
(/*) 72 155 T
(*) 72 144 T
(Call callback_func with callback_data as argument after log sequence number denoted) 90 144 T
(*) 72 133 T
(by lsn is forced to the permanent log.) 108 133 T
(*/) 72 122 T
(errno_t xfs_is_lsn_in_core\050) 72 111 T
(\050long long\051) 90 100 T
(lsn,) 180 100 T
(\050void *\051) 90 89 T
(callback_func,) 180 89 T
(\050void *\051) 90 78 T
(callback_data\051) 180 78 T
FMENDPAGE
%%EndPage: "8" 8
%%Page: "9" 9
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(9) 500 42.62 T
5 9 Q
(lsn) 72 714 T
(- log sequence number) 144 714 T
(callback_func) 72 703 T
(- function to call after this reservation commits to the on-disk log.) 144 703 T
(callback_data) 72 692 T
(- data pointer to be handed to callback_func when function is called.) 144 692 T
2 14 Q
(8.2  Deb) 72 649.67 T
(ugging mode) 120.33 649.67 T
5 9 Q
(/*) 72 625 T
(*) 72 614 T
(Write the entire log space. This routine will be needed to debug the log) 108 614 T
(*) 72 603 T
(recovery code. Arbitrary byte sequences can be written to disk.) 90 603 T
(*/) 72 592 T
(errno_t xfs_log_write_all\050) 72 581 T
(\050caddr_t\051) 90 570 T
(buf,) 144 570 T
(\050uint\051) 90 559 T
(length\051) 144 559 T
2 14 Q
(8.3  Lo) 72 516.67 T
(w le) 112.7 516.67 T
(v) 136.2 516.67 T
(el algorithms) 143.06 516.67 T
2 12 Q
(8.3.1  Algorithm to k) 72 484 T
(eep track of tick) 177.88 484 T
(ets) 260.74 484 T
1 F
-0.12 (Ha) 72 458 P
-0.12 (v) 85.75 458 P
-0.12 (e static array of 512 or 1024 entries long. Each element is a link in a link) 91.57 458 P
-0.12 (ed list. Ha) 438.57 458 P
-0.12 (v) 487.09 458 P
-0.12 (e counter) 492.91 458 P
-0.05 (which starts at 0 and start incrementing each time a ne) 72 444 P
-0.05 (w tick) 331.8 444 P
-0.05 (et is handed out. T) 361.3 444 P
-0.05 (ick) 449.66 444 P
-0.05 (et 0 is assigned) 464.21 444 P
-0.17 (to slot 0. T) 72 430 P
-0.17 (ick) 123.07 430 P
-0.17 (et 1 is assigned to slot 1. T) 137.61 430 P
-0.17 (ick) 263.98 430 P
-0.17 (et 1025 is assigned to slot \0501025 << 10\051 == 1. At 1024) 278.52 430 P
-0.06 (ne) 72 416 P
-0.06 (w transactions a second on a speci\336c \336lesystem, we roll the tick) 83.03 416 P
-0.06 (ets in about 8 years of constant) 388.81 416 P
(uptime. A free list of tick) 72 402 T
(ets should be k) 193.2 402 T
(ept. Each element needs to ha) 264.74 402 T
(v) 407.14 402 T
(e:) 412.96 402 T
3 F
(\245) 72 382 T
1 F
(T) 85.75 382 T
(ick) 92.66 382 T
(et number \05032 bits\051) 107.2 382 T
3 F
(\245) 72 362 T
1 F
(T) 85.75 362 T
(ransaction id \05064 bits\051) 92.66 362 T
3 F
(\245) 72 342 T
1 F
(Reserv) 85.75 342 T
(ation in bytes \05032 bits\051) 118.77 342 T
3 F
(\245) 72 322 T
1 F
(Client id \05032 bits\051) 85.75 322 T
3 F
(\245) 72 302 T
1 F
(Ne) 85.75 302 T
(xt pointer \05032-64 bits\051) 99.56 302 T
2 16 Q
(9.0  Utilities) 72 261.33 T
2 14 Q
(9.1  Log Utilities) 72 226.67 T
1 12 Q
0.28 (T) 72 200 P
0.28 (w) 78.37 200 P
0.28 (o log utilities need to be written in order to help b) 86.92 200 P
0.28 (uild a reliable log manager) 328.09 200 P
0.28 (. The \336rst is sim-) 457.2 200 P
(ple, a log printer) 72 186 T
(.) 150.66 186 T
-0.19 (This program will read the on-disk log structures and print out the data in a nicely formatted style.) 72 160 P
-0.26 (It should ha) 72 146 P
-0.26 (v) 127.9 146 P
-0.26 (e the ability to format the data at dif) 133.72 146 P
-0.26 (ferent comple) 303.97 146 P
-0.26 (xity le) 369.84 146 P
-0.26 (v) 399.61 146 P
-0.26 (els. High le) 405.43 146 P
-0.26 (v) 459.61 146 P
-0.26 (el vie) 465.42 146 P
-0.26 (ws will be) 491.19 146 P
0.15 (necessary for vie) 72 132 P
0.15 (wing lar) 153.29 132 P
0.15 (ge logs. A log printing program will w) 192.88 132 P
0.15 (ant to be shipped with the system) 379.12 132 P
(to f) 72 118 T
(acilitate deb) 88.21 118 T
(ugging of) 146.29 118 T
(f-site \336lesystem crashes. \050if there are an) 192.32 118 T
(y ;-\051) 383.09 118 T
FMENDPAGE
%%EndPage: "9" 9
%%Page: "10" 10
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(The Log Manager \050xLM\051) 72 42.62 T
(Mar) 261.6 42.62 T
(ch 28, 1994) 276.19 42.62 T
(10) 496 42.62 T
1 12 Q
0.52 (Another required program is a log operation injector) 72 712 P
0.52 (. This will pro) 326.58 712 P
0.52 (vide a mechanism for placing) 395.96 712 P
0.6 (arbitrary or e) 72 698 P
0.6 (v) 135.53 698 P
0.6 (en pathological log operations onto the disk. Crashing in the middle of a log sync) 141.35 698 P
(operation could lea) 72 684 T
(v) 163.74 684 T
(e a portion of the log in an indeterministic state.) 169.56 684 T
2 14 Q
(9.2  Requir) 72 650.67 T
(ements of other Utilities) 138.25 650.67 T
1 12 Q
(The ne) 72 624 T
(w mkfs must initialize the on-disk log to all zeroes \050see) 104.69 624 T
(5.1\051.) 376 624 T
2 16 Q
(10.0  T) 72 583.33 T
(ransaction Lay) 117.49 583.33 T
(er) 220 583.33 T
1 12 Q
1.4 (Long running operations, lik) 72 556 P
1.4 (e \336le truncation or remo) 213.4 556 P
1.4 (v) 334.78 556 P
1.4 (al, need to ha) 340.48 556 P
1.4 (v) 408.41 556 P
1.4 (e transactional semantics.) 414.23 556 P
1.45 (Therefore, xFS pro) 72 542 P
1.45 (vides this functionality through a transaction mechanism, which is separate) 166.36 542 P
-0.01 (from xLM, the log manager) 72 528 P
-0.01 (. The mechanism is combined with b) 204.93 528 P
-0.01 (uf) 381.6 528 P
-0.01 (fer cache routines and e) 391.29 528 P
-0.01 (xists as) 505.01 528 P
(a layer on top of the log manager) 72 514 T
(.) 230.3 514 T
-0.05 (When a transaction needs to be performed, a client asks xTM for a transaction id. The id will be a) 72 488 P
-0.15 (uuid. Before returning to the client, xTM will log a transaction start to the log manager) 72 474 P
-0.15 (. The client) 485.98 474 P
-0.27 (uses the transaction id and sends its log operations directly to the log manager) 72 460 P
-0.27 (. When a transaction) 442.16 460 P
0.26 (is completed, the client calls xTM, which sends a transaction complete log operation. Depending) 72 446 P
-0.14 (on the type of transactional operation, the \336nal commit may block until the metadata b) 72 432 P
-0.14 (uf) 484.79 432 P
-0.14 (fers asso-) 494.49 432 P
0.05 (ciated with the transaction are \337ushed to disk. Alternati) 72 418 P
0.05 (v) 337.72 418 P
0.05 (ely) 343.54 418 P
0.05 (, we may need a call-back mechanism) 357.43 418 P
(for clients who require noti\336cation of completion.) 72 404 T
(More details are pro) 72 378 T
(vided in the chapter on the xFS T) 168.79 378 T
(ransaction Mechanism.) 328.69 378 T
FMENDPAGE
%%EndPage: "10" 10
%%Trailer
%%BoundingBox: 0 0 612 792
%%PageOrder: Ascend
%%Pages: 10
%%DocumentFonts: Palatino-Roman
%%+ Times-Roman
%%+ Times-Bold
%%+ Courier-Bold
%%+ Times-Italic
%%+ Courier
%%EOF