[racket] distributed places - throwing dcgm-type contract violation on *channel-get

From: Kevin Tew (tewk at cs.utah.edu)
Date: Sun Dec 16 18:57:55 EST 2012

I use localhost to simplify the setup and tests.

I think the remote node may not be able to find the 
"hello-world-place.rkt" module.
I've added some better error reporting to git head that may help you 
determine if this is the case.

Here is another advanced debugging technique:

In a terminal:
Run /usr/bin/ssh localhost /usr/local/bin/racket -lm 
racket/place/distributed/launch spawn 7000
the program should echo out the port 7000 and wait for connections on 7000.

In another terminal:
Run racket -W debug hello-world-place.rkt.

You might see helpful information in the first terminal window under 
this scenario.


Kevin

On 12/16/2012 02:44 PM, Matthew Eric Bassett wrote:
> Kevin,
>
> Thanks again for your time looking into this - hope the dissertation 
> edits are going well. :)
>
> Some clarification after I tried it this morning:  Invoking racket 
> (with "-W debug", thanks for the tip!) on your hello-world-place.rkt 
> hangs at the following:
>
> SPAWNED-PROCESS:2865 (/usr/bin/ssh localhost /usr/local/bin/racket -lm 
> racket/place/distributed/launch spawn 7000)
> try 0 waiting 1 sec to retry connection to localhost:7000
>
> From the racket repl I tried the following:
>
> >(define-values (node pl) (spawn-node-supervise-place-at "localhost" 
> #:listen-port 7000 "hello-world-place.rkt" 'hello-world))
> >(*channel-put pl "hello")
> >(*channel-get pl)
> ; dcgm-type: contract violation
> ; expected: dcgm?
> ; context...: ; 
> /usr/local/lib/racket/collects/racket/place/distributed.rkt:436:8: loop
> ; /usr/local/lib/racket/collects/xrepl/xrepl.rkt:1342:0
> ; /usr/local/lib/racket/collects/racket/private/misc.rkt:87:7
>
> Thanks,
>
> Matthew
>
>
>
> On 12/15/2012 10:22 PM, Matthew Eric Bassett wrote:
>> Kevin,
>>
>> Many thanks for your response.
>>
>> The only significant difference between your code and mine is the use 
>> of localhost (which makes distributed places a lot less distributed) 
>> and the port specification.  In any case, I've tried your code 
>> verbatim on two machines now.  It also throws the same dcgm contract 
>> violation.
>>
>> What OS are you running?  Perhaps there's something funny about my 
>> build?  I don't know anything about distributed/places internals 
>> here, I'm just guessing.
>>
>> I've tested this on Fedora 17 x64, and on an amazon stock x64 ec2 
>> machine.
>>
>> Regards,
>>
>> Matthew Eric
>>
>> On 12/15/2012 04:05 AM, Kevin Tew wrote:
>>> The following thunk example works for me.
>>> Uncommenting the message-router line will pump back stdout and 
>>> stderr from the remote node so you can see any errors that may be 
>>> occurring at the remote-node.
>>> You will have to kill the message router by hitting CTRL-C when you 
>>> want to end the program.
>>>
>>>
>>> EXAMPLE 1
>>> -----------------------------------------
>>> #lang racket
>>> (require racket/place/distributed)
>>> (define (hello-world)
>>>   (place ch
>>>     (printf/f "hello-world received: ~a\n" (place-channel-get ch))
>>>     (place-channel-put ch "Hello World\n")
>>>     (printf/f "hello-world sent: Hello World\n")))
>>> (provide hello-world)
>>>
>>> (module+ main
>>>   (define-values (node pl) (spawn-node-supervise-place-at 
>>> "localhost" #:listen-port 7000 "hello-world-place.rkt" 'hello-world 
>>> #:thunk #t))
>>>   (*channel-put pl "Hello bozo")
>>>   (*channel-get pl)
>>>   #;(message-router node)
>>>   )
>>>
>>>
>>> Example 2 show how I would normally write distributed places code 
>>> without using the #:thunk keyword argument.
>>>
>>> EXAMPLE 2
>>> --------------------------------------------
>>> #lang racket
>>> (require racket/place/distributed)
>>> (define (hello-world ch)
>>>   (printf/f "hello-world received: ~a\n" (place-channel-get ch))
>>>   (place-channel-put ch "Hello World\n")
>>>   (printf/f "hello-world sent: Hello World\n"))
>>> (provide hello-world)
>>>
>>> (module+ main
>>>   (define-values (node pl) (spawn-node-supervise-place-at 
>>> "localhost" #:listen-port 7000 "hello-world-place.rkt" 'hello-world))
>>>   (*channel-put pl "Hello bozo")
>>>   (*channel-get pl)
>>>   #;(message-router node)
>>>   )
>>>
>>>
>>> On 12/15/2012 02:16 AM, Matthew Eric Bassett wrote:
>>>> Just to update, also tried this on v5.3.1 using 
>>>> spawn-node-supervise-place-at with #:thunk set. same result.
>>>>
>>>> On 12/14/2012 03:31 PM, Matthew Eric Bassett wrote:
>>>>> Hey folks,
>>>>>
>>>>> I was playing around with distributed places and I ran into a some 
>>>>> problems.  I'm using racket v5.3 and am following the docs from 
>>>>> the racket reference 
>>>>> (http://docs.racket-lang.org/reference/distributed-places.html)
>>>>>
>>>>> Let's say we have an example just like the one in the reference.
>>>>>
>>>>> hello-world-place.rkt
>>>>> ----------------------
>>>>> (define (hello-world)
>>>>>     (place ch (printf "hello-world received: ~a\n" 
>>>>> (place-channel-get ch))
>>>>>     (place-channel-put ch "Hello World\n")
>>>>>     (printf "hello-world sent: Hello World\n")))
>>>>>
>>>>> Then from the racket xrepl we do
>>>>>
>>>>> >> (define-values (node pl)
>>>>>             (spawn-node-supervise-dynamic-place-at remote-node 
>>>>> "hello-world-place.rkt" 'hello-world))
>>>>> ; there's now a racket process running on my remote-node
>>>>> >> (*channel-put pl "hi")
>>>>> ; the remote node shuts down as we expect, giving the 
>>>>> place-channel-get should have locked it until this point.
>>>>> >> (*channel-get pl)
>>>>> ; dcgm-type: contract violation
>>>>> ;   expected: dcgm?
>>>>> ;   given: #<eof>
>>>>> ;   context...:
>>>>> ; 
>>>>> /usr/local/lib/racket/collects/racket/place/distributed.rkt:442:8: 
>>>>> loop
>>>>> ;    /usr/local/lib/racket/collects/xrepl/xrepl.rkt:1341:0
>>>>> ; /usr/local/lib/racket/collects/racket/private/misc.rkt:87:7
>>>>>
>>>>> I've tried [naively] using place-channel-put/get instead of 
>>>>> *channel-put/get, same result.  Wrapping it in a message-router 
>>>>> makes no difference.
>>>>>
>>>>> >> (message-router node (after-seconds 2 (*channel-put pl "hi!") 
>>>>> (*channel-get pl)))
>>>>> ; gives same result as above.
>>>>>
>>>>> Any ideas what I'm doing wrong or what I'm missing?
>>>>>
>>>>> Many thanks,
>>>>>
>>>>>
>>>>
>>>>
>>>
>>
>>
>
>


Posted on the users mailing list.