Race Conditions
Now let’s jump out of the make_page.cgi
script for a moment and see what I did to
make_cf.plx
to make it play nice in the presence of
other copies of itself running at the same time. Before doing so,
though, let’s talk for a moment about what might have gone
wrong if I didn’t take those precautions.
The make_cf.plx
script, you will remember, uses
File::Find
to descend recursively through the
directories of the CyberFair site, reading in all the HTML files and
storing their metainformation in a special data structure. Then it
traverses that data structure, rewriting all the files to reflect the
latest version of the site’s design template and creating links
to the other pages in the site.
Now, think for a moment about the following situation: one copy of
make_cf.plx
starts up, reads all the
metainformation, and then begins rewriting pages. At that moment, a
second copy starts up and begins reading metainformation. The first
copy opens a file for writing, thereby clobbering everything that was
previously in it. A moment later, it writes out the new version of
that file, with everything updated nicely. But during that very short
interval between the file being clobbered and the new version being
completely written, the second copy of make_cf.plx
comes along and reads the file. Maybe it gets no data because it reads the file while it is still clobbered. Maybe it gets corrupted data because it reads the file when it is only half-written. Either way will result in errors ...
Get Perl for Web Site Management now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.