[Glass] Migrating from 3.2.9 to 3.3.3 block compilation issue

Mariano Martinez Peck via Glass glass at lists.gemtalksystems.com
Wed Feb 1 04:40:31 PST 2017


On Wed, Feb 1, 2017 at 2:20 AM, Dale Henrichs <
dale.henrichs at gemtalksystems.com> wrote:

> On 1/31/17 7:44 PM, Mariano Martinez Peck wrote:
>
>
>
> On Tue, Jan 31, 2017 at 2:25 PM, Dale Henrichs via Glass <
> glass at lists.gemtalksystems.com> wrote:
>
>> Mariano,
>>
>> 1. Find allInstances of ExecBlock
>>
>> 2. Select all instances that #needsRecompile.
>>
>> 3. Send #recompile to the selected instances and collect instances that
>> signal an error during #recompile. The #recompile method attempts to
>> recompile Simple blocks in-place if there is an error during compilation or
>> the block is not simple, an Error is signaled.
>>
>> 4. For the remaining instances of ExecBlock, you will have to track down
>> the reference to the block and reinstall a new, recompiled instance of the
>> ExecBlock.
>>
>>     1. look at the #blockSource and the #receiver for the block and you
>> might recognize the method needed to recreate the block
>>
>>     2. look at the #blockSource and pick out a likely chunk of source
>> that you can use to search in method source (`browse source --exact
>> `<source-chunk>`)
>>
>>     3. Use Repository>>findReferencePathToObject: or
>> Repository>>findAllReferencePathsToObject: to find which object(s) are
>> holding onto the block.
>>
>
> Hi Dale,
>
> OK, it seems I am not having good luck. I tried the following code:
>
> [
> | allBlocks allBlocksNeedingRecompile blocksFailedToRecompile
> correctlyRecompiled |
> blocksFailedToRecompile := OrderedCollection new.
> correctlyRecompiled := OrderedCollection new.
> System commit.
> allBlocks := ExecBlock allSubInstances.
> allBlocksNeedingRecompile := allBlocks select: [:each | each
> needsRecompile ].
> allBlocksNeedingRecompile do: [:each |
> [
> each recompile.
> correctlyRecompiled add: each.
>   ] on: Error do: [:ex |
> blocksFailedToRecompile add: each.
> ]
> ].
> System commit.
> Transcript show:  'Correctly recompiled closures: ',  correctlyRecompiled
> size asString.
> Transcript show: 'Erred recompiled closures: ',  blocksFailedToRecompile
> size asString.
> ] on: Warning do: [:ex | ex resume  ]
>
>
> And it outputs:
>
> Correctly recompiled closures: 0Erred recompiled closures: 797155
>
> Wow. That's a lot to fix.
>
> But things get strange when I analyze which are the failing closures. For
> example,  I have an ExecBlock whose source is:
>
> *"This is source for a block.  " *
> * ^ [ *
> *      self error:*
> *          'No concrete db roles associated to '''*
> *            , (FaDBAccessor common users row: username column: 'CONCRETE
> ROLE')*
> *            , ''' of user ''' , username*
> *            ,*
> *              '''. Either the concrete db role id is wrong or the roles
> must be added to concreteRoles.csv' *
> * ]*
>
>
>
> That closure, is a closure of an ifEmpty:  of the method #sessionMapFor:
> prepareAccessLimitingSessionsWith:
> See:
>
> sessionMapFor: username prepareAccessLimitingSessionsWith:
> aDictionaryOfPreparationBlocks
> | answer  concreteRole abstractRoleID  |
> answer := IdentityDictionary new.
> concreteRole := self concreteRoleForUsername: username.
> concreteRole
>    ifEmpty: [
>      self error:
>          'No concrete db roles associated to '''
>            , (FaDBAccessor common users row: username column: 'CONCRETE
> ROLE')
>            , ''' of user ''' , username
>            ,
>              '''. Either the concrete db role id is wrong or the roles
> must be added to concreteRoles.csv'
> ].
> .....
>
>
> What is going on? I re-load all my app code after I upgraded stone so I
> expect that method to have been recompiled. In fact, I just edited the
> method and saved it again (so that a recompilation was triggered) and the
> above closure still appears as needing compilation!
>
> Even worst....   the _method  instVar of that example IS NOT IDENTICAL
> (same OOP) to the one installed in the method dictionary
> (FaDBSessionsByRolesFactory >> #sessionMapFor:
> prepareAccessLimitingSessionsWith: ). So it looks like if they were
> un-installed closures.
>
> I thought it could be some MC version history around or whatever. So I
> performed my typical GC and cleanup code which should collect all that
> garbage. Still same numbers.
>
> mmmm I am running out of ideas.
>
> Thoughts?
>
> I imagine that the #sessionMapFor:prepareAccessLimitingSessionsWith:
> method is in an older version of the class, which would explain the
> differences in oops and the fact that when you recompile the method in the
> current version of the class, you don't eliminate block that needs to be
> recompiled ...
>
> `GsDeployer new classesWithClassHistory` should give you the list of
> classes that have older versions ...
>

Hi Dale,

I tried with that and it answers an empty array.

Now, I tried in a much smaller stone (also migrated from 3.2.9 to 3.3.3)
and I also see quite some:

Correctly recompiled closures: 4917. Erred recompiled closures: 30807

And I still see the same scenario.. closures that come from ifEmpty or
ifAbsent or things like that that should be gone when method is
recompiled... Some of these closures/methods are not even from my app but
from tODE.

With some code to fix the closures I faced while running some parts of the
app, I started to make the app to work. I cannot spend much longer testing
the general issue but instead try to make the app to work. It's bad because
I may lazily find more and more closures needing to recompile as the app
receives more testing.

Anyway, I will do some more tests with findAllReferencePathsToObject: to
see if I found the issue...

In case you think there could be something you may want to try / do let me
know (compressed backup of this extent is only 80MB).

Thanks for your help!


-- 
Mariano
http://marianopeck.wordpress.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gemtalksystems.com/mailman/private/glass/attachments/20170201/b8da3223/attachment-0001.html>


More information about the Glass mailing list