I was asked to provide some information on pdo.c - new patch dependency algorithm introduced in Solaris 10 FCS. It is complicated code, just because it is complicated staff it is dealing with and so I decide that best place to do some introduction will be here - available for everybody in one place.
I will keep it in usual format step by step, post by post describing the matter - some kind of "Arabian Nights" of packaging-patching... [b]Why new code was introduced?[/b] 1. Two phase transaction patching. Some patches affects are shared between zones. This patches need to be checked for all zones first and only when everything OK with all zones we may apply this patches to shared are. This is classic two phase distributed transaction, when we check success on all nodes and then commit or rollback changes everywhere. Patchadd.ksh script was not suited for this, our estimates was that it will be much easy to reimplement it on C (and we had it partially reimplemented already for different project) then try to use what we had. 2. Performance, performance, performance. Any install operation time with zones will be performed as many times as many zones present. It there is 10 zones it will be 10 times slower. We tried to run pkgadd in parallel and in result it was much slower then even sequential execution just because all installation operation is about disk access and parallelization will not help. So zones existence expose any install performance problem as magnifying glass as many times as many zones involved. There are no simple tricks to speed it up and only way to resolve it - improve performance of installation itself. Ksh-script (patchadd before S10) obviously not a right solution for performance problems. Any operation like check required patch will involve awk, grep, sed etc... - which are unix process each. Also by nature dependency check algorithm is classical "recursive walk over tree" and kshell script language does not support it very well from data structure point of view as well as from algorithm coding. C - language implementation looks just right for this kind of problem and allows to make performance as good as possible. It has hashtable for PatchIds and prelinked in both directions relations etc. It is pretty simple to outperform kshell script 100 times and more. Also it allows to introduce real multipatching which is also matter of performance as well as convenience for customer. Manual ordering for patches painful already but with zones it may be just impossible. [b][i]"...At this point Shahrazad saw the approach of morning and discreetly fell silent..."[/i][/b] The book of thousand and one night. by Powys Mathers Next I will talk about patch dependencies... vassun This message posted from opensolaris.org
