• Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r4wp

[Rebol School] REBOL School

Sujoy
10-Oct-2012
[1202x6]
hi everyone. 
as usual, i need some help.
i'm trying to use Doc's uniserve+taskmaster engine
i read on altme that i should be using the version from the cheyenne 
sources
so i copied the files over to a new directory, then when i try
>> do %uni-engine.r
>> uniserve/boot
...i get a bunch of errors saying cheyenne is not defined


using the old (0.99) sources on the softinnov website, i can use 
the starter.r script just fine. However, i set up a simple service 
and a module to process tasks, but get:

** Script Error: Cannot use path on none! value
** Where: process-task
** Near: if shared/pool-max > shared/pool-count [
    fork
    if verbose > 0 [log/info "launching new process"]
]
the service is a simple test:

install-service [
  name: 'test
  port-id: 9000
  module: 'my-module

  on-load: func[] [
    do %scheduler.r
    scheduler/plan [every 10 s do my-func]
    scheduler/wait
  ]
  on-task-done: func[data] [print data]
  my-func: func[][
    data: load datafile
    foreach [key value] data [
      shared/do-task [value] self
    ]
  ]
]
the module:

install-module [
  name: 'my-module
  on-task-received: func[data][
    response: rejoin["got" data]
  ]
]
i'm probably being totally obtuse...any help greatly appreciated
DocKimbel
10-Oct-2012
[1208x2]
Hi Sujoy, glad you're using Uniserve. You should use the latest version 
from Cheyenne. Some services or client protocols might be dependent 
on Cheyenne, so the best thing to do is move them out of %services/ 
and %protocols/ folder and leave only your own ones. Also by default, 
the task hander module should go in a %UniServe/handlers/ folder.
Also, you need to set the UniServe path variable before loading it:

    uniserve-path: <path-to-your-uniserve-folder>
Sujoy
10-Oct-2012
[1210]
Thanks for getting back to me on this Doc...
So if i have this correct, I should:
1. Use the latest version from Cheyenne (have made a copy)

2. Remove all services and protocols from the %services/ and %protocols/ 
folders, except for task-master.r (which i need!)

3. Now hopelessly confused - the UniServe directory tree of the latest 
Cheyenne version I have is as follows:
     Uniserve
     ---clients
     ---libs
     ---protocols
     ---services
         ---task-master.r
         ---task-master
             ---task-handler.r
     I don't see a %UniServe/handlers folder...
DocKimbel
10-Oct-2012
[1211]
You have to add it back, it has been moved to %cheyenne/ folder.
Sujoy
10-Oct-2012
[1212]
ah - ok. i was trying to create a %MODULES folder
give me a minute...
DocKimbel
10-Oct-2012
[1213]
After removing all unnecessary UniServe plugins, this sequence works 
for me:

    uniserve-path: %//dev/cheyenne-server/uniserve/
    do uniserve-path/uni-engine.r
    uniserve/boot
Sujoy
10-Oct-2012
[1214x3]
uniserve/boot works fine after these steps, but...

** Script Error: Cannot use path on none! value
** Where: process-task
** Near: if any [
    zero? shared/pool-max
    shared/pool-max > shared/pool-count
] [fork]
either
(am on windows)
am using the same test i put into altme for the service and module...
DocKimbel
10-Oct-2012
[1217]
Can you send me a zip of your Uniserve folder so I can test that 
locally?
Sujoy
10-Oct-2012
[1218x3]
sure
unfortunately, i dont have permissions to send files over altme. 
:(
how else can i send? email?
have sent you a mail at nr at red-lang dot org
DocKimbel
10-Oct-2012
[1221]
Ok, from the UniServe folder, this code works:

    uniserve-path: %./
    do %uni-engine.r
    uniserve/boot

I had to change your absolute path in %reminder.r to:

- line 11:   do uniserve-path/libs/scheduler.r
- line 24:   feeds: load uniserve-path/docs/feeds.r
Sujoy
10-Oct-2012
[1222x2]
trying this right now...
damn! no luck.

>> ls
BSD-License.txt  change-log.txt   clients/         docs/
handlers/        libs/            protocols/       services/
uni-engine.r
>> uniserve-path: %./
== %./
>> do %uni-engine.r
Script: "UniServe kernel" (17-Jan-2010)
Script: "Encap virtual filesystem" (21-Sep-2009)
== true
>> uniserve/boot
booya
.

http://newsrss.bbc.co.uk/rss/newsonline_uk_edition/business/rss.xml
** Script Error: Cannot use path on none! value
** Where: process-task
** Near: if any [
    zero? shared/pool-max
    shared/pool-max > shared/pool-count
] [fork]
either
DocKimbel
10-Oct-2012
[1224]
Ah, I stopped at "booya". :-)
Sujoy
10-Oct-2012
[1225x2]
:)
is this because pool-list is empty?

i put in a debug "print" cmd in the on-new-client function of task-master.r, 
which is the only place i could see pool-list being appended to...but 
it seems the function is not called
on-new-client: has [job][
  ;added this line
  print client/remote-ip
  if client/remote-ip <> 127.0.0.1 [close-client exit]
  set-modes client [keep-alive: on]
  client/timeout: 15
  client/user-data: make task []
  ;only place where pool-list is appended to...
  append pool-list :client
DocKimbel
10-Oct-2012
[1227]
No the issue is with 'shared being reset to 'none in %task-master...looks 
like a regression in Uniserve when working on standalone...I'm looking 
into it.
Sujoy
10-Oct-2012
[1228]
thanks doc!
DocKimbel
10-Oct-2012
[1229]
In %reminder.r, you shouldn't use: scheduler/wait. Uniserve is already 
providing an event loop. You need to remove that line.
Sujoy
10-Oct-2012
[1230x2]
ok...
removed the scheduler/wait line...now:

uniserve-path: %./
== %./
>> do %uni-engine.r
Script: "UniServe kernel" (17-Jan-2010)
Script: "Encap virtual filesystem" (21-Sep-2009)
== true
>> uniserve/boot
booya
** Script Error: Invalid path value: server-ports
** Where: reform
** Near: mold any [uniserve/shared/server-ports port-id]
>>
DocKimbel
10-Oct-2012
[1232]
I've just pushed a fix for that to Cheyenne SVN repo on Google code.
Sujoy
10-Oct-2012
[1233]
thanks doc...downloading now...
DocKimbel
10-Oct-2012
[1234]
From that, it seems to work until the job event is raised, then the 
server crashes (not sure if it's your code, scheduler or Uniserve 
that causes that).
Sujoy
10-Oct-2012
[1235x3]
:(
i'm actually trying to do something really simple
i have a bunch of feeds i want to download

i can do that sequentially (foreach feed feeds [...]), but thought 
it best to us background worker processes via task-master to download 
instead
is there an alternative?
or a better way of writing this using uniserve?
this is what i get with the latest from googlecode:

uniserve-path: %./
== %./
>> do %uni-engine.r
Script: "UniServe kernel" (17-Jan-2010)
Script: "Encap virtual filesystem" (21-Sep-2009)
== true
>> uniserve/boot
booya

10/10-18:37:48.883-## Error in [uniserve] : Cannot open server reminder 
on port 9000 !

10/10-18:37:48.884-## Error in [uniserve] : Cannot open server task-master 
on port 9799 !
== none
>>
DocKimbel
10-Oct-2012
[1238x2]
Uniserve task-master is mainly meant for server-side parallel request 
processing. For your need, you should use an async HTTP client rather, 
which would be a much simpler solution.
Cannot open...
 you need to close any previous Uniserve session.
Sujoy
10-Oct-2012
[1240]
sorry - just killed all previous Uniserve sessions. now get:

uniserve-path: %./
== %./
>> do %uni-engine.r
Script: "UniServe kernel" (17-Jan-2010)
Script: "Encap virtual filesystem" (21-Sep-2009)
== true
>> uniserve/boot
booya
** Script Error: Invalid path value: conf-file
** Where: on-started
** Near: if all [
    uniserve/shared
    file: uniserve/shared/conf-file
] [
    append worker-args reform [" -cf" mold file]
]
>>
DocKimbel
10-Oct-2012
[1241]
Are you running from SVN repo, or a copy of Uniserve folder?
Sujoy
10-Oct-2012
[1242]
a copy of the Uniserve folder...
DocKimbel
10-Oct-2012
[1243x2]
This looks like Cheyenne-dependent code...
But, you should *really* use a async HTTP client, that's the best 
solution for your need (multiple HTTP downloads at the same time).
Sujoy
10-Oct-2012
[1245x2]
hmmm. ok...will work on this and get back to you
thanks for the time Doc
(cant wait to see Cheyenne on Red ;)
DocKimbel
10-Oct-2012
[1247]
Well, you might see some micro-Cheyenne before Christmas. ;-)
Sujoy
10-Oct-2012
[1248x4]
best christmas ever!
just to persist with using uniserve...i think something i may be 
getting there

uniserve-path: %./
== %./
>> do %uni-engine.r
Script: "UniServe kernel" (17-Jan-2010)
Script: "Encap virtual filesystem" (21-Sep-2009)
== true
>> uniserve/boot
booya
127.0.0.1
127.0.0.1
== none
>>

i commented out the lines from on-started:

on-started: has [file][
		worker-args: reform [

   "-worker" mold any [in uniserve/shared 'server-ports port-id]		;TBD: 
   fix shared object issues
		]
		if not encap? [
			append worker-args reform [" -up" mold uniserve-path]
			if value? 'modules-path [
				append worker-args reform [" -mp" mold modules-path]
			]
			if all [
				uniserve/shared
				;file: uniserve/shared/conf-file 
			][		
				;append worker-args reform [" -cf" mold file]
			]
		]
		if integer? shared/pool-start [loop shared/pool-start [fork]]
	]

...since conf-file is cheyenne specific


i think maybe the scheduler is killing UniServe - it exits while 
returning none...
nope - the scheduler is just fine...

i'm now thinking it may have to do with using the shared/do-task 
in the on-load function...
nope
will take doc's advice and do something simpler