Hello!
This is my weekly ChangeLog, from 27 March 2017 to 2 April 2017.
You can see it in a better format by going here:
http://log.smallworks.eu/web/search?from=27/3/2017&to=2/4/2017
ChangeLog
=========
31 March 2017:
--------------
* Yesterday I spent most of the day verifying why the pharo site was going
down time to time... as a result, we found
a problem in Voyage that may cause a deadlock under heavy load.
Finally, with the help of Guille we help a possible cause in the way the
+VOLazyProxy+ is implemented.
This is +#doesNotUnderstand:+ current implementation:
----
VOLazyProxy>>doesNotUnderstand: aMessage
| realObject |
realObject := self obtainRealObject.
realObject ifNil: [
(repository descriptionBuilder for: objectClass)
isAllowMissingContent
ifTrue: [
realObject := VOMissingObject class:
objectClass id: objectId ]
ifFalse: [
VOError signal: ('Lazy reference not found {1}:
{2}' format: {objectClass name. objectId}) ] ].
VOLazyProxy mutex critical: [
self == realObject
ifFalse: [ self becomeForwardKeepingHash: realObject ]
].
^realObject
perform: aMessage selector
withArguments: aMessage arguments.
----
It is designed to prevent double attempt to become when trying to access
same proxy at concurrent moments (in webapps is
very frequent).
We discovered this implementation has some problems:
* When doing the comparisson of of +self+ with +realObject+ self can
already be in the stack, and then it can fail.
* apparently the error handler handles the occurrence of +Semaphore+ in a
stack in weird ways (to ensure is debuggable) :)
So, now I'm testing (and proposing to Voyage) this implementation:
----
VOLazyProxy>>#doesNotUnderstand: aMessage
| realObject thisObject error |
realObject := self obtainRealObject.
realObject ifNil: [
(repository descriptionBuilder for: objectClass)
isAllowMissingContent
ifTrue: [
realObject := VOMissingObject class:
objectClass id: objectId ]
ifFalse: [
VOError signal: ('Lazy reference not found {1}:
{2}' format: {objectClass name. objectId}) ] ].
error := nil.
thisObject := self.
VOLazyProxy mutex critical: [
thisObject == realObject ifFalse: [
[ self becomeForwardKeepingHash: realObject ]
on: Error do: [ :e | error := e ] ] ].
error ifNotNil: [
VOLazyProxyBecomeError new
error: error;
signal ].
^realObject
perform: aMessage selector
withArguments: aMessage arguments.
----
If this works, I will submit an update to
[Voyage](http://github.com/pharo-nosql/voyage) immediately :)
29 March 2017:
--------------
* I validated some changes to Athens and copyBits primitive to fix the
crashing problem.
Seems to be working so I will integrate it... thanks Eliot!
* Still with [Iceberg](https://github.com/npasserini/iceberg), I took care
of some bug... but most important than that,
I added an option to create repositories from Iceberg.
This is very simple: you click in the "New repository" button :)
This way you do not need a remote repository to start working, and you can
keep your versions in your local environent
if you want.
*WARNNING*: When doing your first push, it has to be a clean push
(fast-forward), I have had problems trying the
otherwise (which triggered a merge that Iceberg still does not knows how to
handle).
27 March 2017:
--------------
* I just spent sometime fixing stuff on
[Iceberg](https://github.com/npasserini/iceberg).
* I fixed [issue 313](https://github.com/npasserini/iceberg/issues/313)
(now user gets a dialog to set user properties when needed).
* Now commit dialog remembers last choice of "push" automatically while
commiting.
cheers!
Esteban