Doing Socket IO inside STM transaction

2014-06-17 Thread Hussein B.
Hi,

I have a ServerSocket that stores the client ID and the client socket 
object into a ref type. And I also have a thread that is running in the 
background that checks if a specific condition is met, then it will start 
send notifications to the clients (it will use the client-id-ref and 
messages-ref).

Of course, since both are refs; any operation needs to be run under a STM 
transaction.

My question is, is it ok to do IO Socket operation inside a STM 
transaction? STM transaction might retry, this means that there are great 
chances that the clients will receive the notifications more than once.

For Socket IO operations inside STM transaction, is better/recommended to 
do it using Agents? Since, AFAIK, agents inside a transaction will be 
executed only if the transaction is successful.

Thanks.

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Doing Socket IO inside STM transaction

2014-06-17 Thread Gary Trakhman
Agent send operations inside a transaction get queued up and don't actually
get sent until the transaction commits, that's probably what you want, it's
meant for side-effects.


On Tue, Jun 17, 2014 at 5:43 PM, Hussein B. hubaghd...@gmail.com wrote:

 Hi,

 I have a ServerSocket that stores the client ID and the client socket
 object into a ref type. And I also have a thread that is running in the
 background that checks if a specific condition is met, then it will start
 send notifications to the clients (it will use the client-id-ref and
 messages-ref).

 Of course, since both are refs; any operation needs to be run under a STM
 transaction.

 My question is, is it ok to do IO Socket operation inside a STM
 transaction? STM transaction might retry, this means that there are great
 chances that the clients will receive the notifications more than once.

 For Socket IO operations inside STM transaction, is better/recommended to
 do it using Agents? Since, AFAIK, agents inside a transaction will be
 executed only if the transaction is successful.

 Thanks.

 --
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clojure@googlegroups.com
 Note that posts from new members are moderated - please be patient with
 your first post.
 To unsubscribe from this group, send email to
 clojure+unsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 ---
 You received this message because you are subscribed to the Google Groups
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.


-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Doing Socket IO inside STM transaction

2014-06-17 Thread Hussein B.
I think send-off is used for IO operations, or?

If an agent is started with messages [1 2 3] and then another agent started 
with messages [4 5] , is it guaranteed that messages [1 2 3] will be 
delivered before [4 5]?

I'm talking about production and really concurrent system.

On Tuesday, June 17, 2014 11:45:52 PM UTC+2, Gary Trakhman wrote:

 Agent send operations inside a transaction get queued up and don't 
 actually get sent until the transaction commits, that's probably what you 
 want, it's meant for side-effects.


 On Tue, Jun 17, 2014 at 5:43 PM, Hussein B. hubag...@gmail.com 
 javascript: wrote:

 Hi,

 I have a ServerSocket that stores the client ID and the client socket 
 object into a ref type. And I also have a thread that is running in the 
 background that checks if a specific condition is met, then it will start 
 send notifications to the clients (it will use the client-id-ref and 
 messages-ref).

 Of course, since both are refs; any operation needs to be run under a STM 
 transaction.

 My question is, is it ok to do IO Socket operation inside a STM 
 transaction? STM transaction might retry, this means that there are great 
 chances that the clients will receive the notifications more than once.

 For Socket IO operations inside STM transaction, is better/recommended to 
 do it using Agents? Since, AFAIK, agents inside a transaction will be 
 executed only if the transaction is successful.

 Thanks.

 -- 
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clo...@googlegroups.com 
 javascript:
 Note that posts from new members are moderated - please be patient with 
 your first post.
 To unsubscribe from this group, send email to
 clojure+u...@googlegroups.com javascript:
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 --- 
 You received this message because you are subscribed to the Google Groups 
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an 
 email to clojure+u...@googlegroups.com javascript:.
 For more options, visit https://groups.google.com/d/optout.




-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Doing Socket IO inside STM transaction

2014-06-17 Thread Gary Trakhman
Yea, send uses a fixed threadpool, and send-off uses a growing one, so it's
more suitable for IO-bound tasks.  I don't think there's any difference in
terms of how it looks from STM.

2 agents will have 2 independent queues, even though they might share
threadpools, if you want to guarantee order, you need one queue.


On Tue, Jun 17, 2014 at 5:54 PM, Hussein B. hubaghd...@gmail.com wrote:

 I think send-off is used for IO operations, or?

 If an agent is started with messages [1 2 3] and then another agent
 started with messages [4 5] , is it guaranteed that messages [1 2 3] will
 be delivered before [4 5]?

 I'm talking about production and really concurrent system.


 On Tuesday, June 17, 2014 11:45:52 PM UTC+2, Gary Trakhman wrote:

 Agent send operations inside a transaction get queued up and don't
 actually get sent until the transaction commits, that's probably what you
 want, it's meant for side-effects.


 On Tue, Jun 17, 2014 at 5:43 PM, Hussein B. hubag...@gmail.com wrote:

 Hi,

 I have a ServerSocket that stores the client ID and the client socket
 object into a ref type. And I also have a thread that is running in the
 background that checks if a specific condition is met, then it will start
 send notifications to the clients (it will use the client-id-ref and
 messages-ref).

 Of course, since both are refs; any operation needs to be run under a
 STM transaction.

 My question is, is it ok to do IO Socket operation inside a STM
 transaction? STM transaction might retry, this means that there are great
 chances that the clients will receive the notifications more than once.

 For Socket IO operations inside STM transaction, is better/recommended
 to do it using Agents? Since, AFAIK, agents inside a transaction will be
 executed only if the transaction is successful.

 Thanks.

 --
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clo...@googlegroups.com

 Note that posts from new members are moderated - please be patient with
 your first post.
 To unsubscribe from this group, send email to
 clojure+u...@googlegroups.com

 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 ---
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send
 an email to clojure+u...@googlegroups.com.

 For more options, visit https://groups.google.com/d/optout.


  --
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clojure@googlegroups.com
 Note that posts from new members are moderated - please be patient with
 your first post.
 To unsubscribe from this group, send email to
 clojure+unsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 ---
 You received this message because you are subscribed to the Google Groups
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.


-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Doing Socket IO inside STM transaction

2014-06-17 Thread Hussein B.
you mean one agent to deliver the notifications. true?

On Wednesday, June 18, 2014 12:01:42 AM UTC+2, Gary Trakhman wrote:

 Yea, send uses a fixed threadpool, and send-off uses a growing one, so 
 it's more suitable for IO-bound tasks.  I don't think there's any 
 difference in terms of how it looks from STM.

 2 agents will have 2 independent queues, even though they might share 
 threadpools, if you want to guarantee order, you need one queue.


 On Tue, Jun 17, 2014 at 5:54 PM, Hussein B. hubag...@gmail.com 
 javascript: wrote:

 I think send-off is used for IO operations, or?

 If an agent is started with messages [1 2 3] and then another agent 
 started with messages [4 5] , is it guaranteed that messages [1 2 3] will 
 be delivered before [4 5]?

 I'm talking about production and really concurrent system.


 On Tuesday, June 17, 2014 11:45:52 PM UTC+2, Gary Trakhman wrote:

 Agent send operations inside a transaction get queued up and don't 
 actually get sent until the transaction commits, that's probably what you 
 want, it's meant for side-effects.
  

 On Tue, Jun 17, 2014 at 5:43 PM, Hussein B. hubag...@gmail.com wrote:

  Hi,

 I have a ServerSocket that stores the client ID and the client socket 
 object into a ref type. And I also have a thread that is running in the 
 background that checks if a specific condition is met, then it will start 
 send notifications to the clients (it will use the client-id-ref and 
 messages-ref).

 Of course, since both are refs; any operation needs to be run under a 
 STM transaction.

 My question is, is it ok to do IO Socket operation inside a STM 
 transaction? STM transaction might retry, this means that there are great 
 chances that the clients will receive the notifications more than once.

 For Socket IO operations inside STM transaction, is better/recommended 
 to do it using Agents? Since, AFAIK, agents inside a transaction will be 
 executed only if the transaction is successful.

 Thanks.

 -- 
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clo...@googlegroups.com

 Note that posts from new members are moderated - please be patient with 
 your first post.
 To unsubscribe from this group, send email to
 clojure+u...@googlegroups.com

 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 --- 
 You received this message because you are subscribed to the Google 
 Groups Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send 
 an email to clojure+u...@googlegroups.com.

 For more options, visit https://groups.google.com/d/optout.


  -- 
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clo...@googlegroups.com 
 javascript:
 Note that posts from new members are moderated - please be patient with 
 your first post.
 To unsubscribe from this group, send email to
 clojure+u...@googlegroups.com javascript:
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 --- 
 You received this message because you are subscribed to the Google Groups 
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an 
 email to clojure+u...@googlegroups.com javascript:.
 For more options, visit https://groups.google.com/d/optout.




-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Doing Socket IO inside STM transaction

2014-06-17 Thread Gary Trakhman
Yes, you could do it with 3 agents, one to order the messages, two to do
the work :-).  I'm not sure if the STM guarantees any ordering, but you'd
probably want to be explicit.


On Tue, Jun 17, 2014 at 6:11 PM, Hussein B. hubaghd...@gmail.com wrote:

 you mean one agent to deliver the notifications. true?


 On Wednesday, June 18, 2014 12:01:42 AM UTC+2, Gary Trakhman wrote:

 Yea, send uses a fixed threadpool, and send-off uses a growing one, so
 it's more suitable for IO-bound tasks.  I don't think there's any
 difference in terms of how it looks from STM.

 2 agents will have 2 independent queues, even though they might share
 threadpools, if you want to guarantee order, you need one queue.


 On Tue, Jun 17, 2014 at 5:54 PM, Hussein B. hubag...@gmail.com wrote:

 I think send-off is used for IO operations, or?

 If an agent is started with messages [1 2 3] and then another agent
 started with messages [4 5] , is it guaranteed that messages [1 2 3] will
 be delivered before [4 5]?

 I'm talking about production and really concurrent system.


 On Tuesday, June 17, 2014 11:45:52 PM UTC+2, Gary Trakhman wrote:

 Agent send operations inside a transaction get queued up and don't
 actually get sent until the transaction commits, that's probably what you
 want, it's meant for side-effects.


 On Tue, Jun 17, 2014 at 5:43 PM, Hussein B. hubag...@gmail.com wrote:

  Hi,

 I have a ServerSocket that stores the client ID and the client socket
 object into a ref type. And I also have a thread that is running in the
 background that checks if a specific condition is met, then it will start
 send notifications to the clients (it will use the client-id-ref and
 messages-ref).

 Of course, since both are refs; any operation needs to be run under a
 STM transaction.

 My question is, is it ok to do IO Socket operation inside a STM
 transaction? STM transaction might retry, this means that there are great
 chances that the clients will receive the notifications more than once.

 For Socket IO operations inside STM transaction, is better/recommended
 to do it using Agents? Since, AFAIK, agents inside a transaction will be
 executed only if the transaction is successful.

 Thanks.

 --
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clo...@googlegroups.com

 Note that posts from new members are moderated - please be patient
 with your first post.
 To unsubscribe from this group, send email to
 clojure+u...@googlegroups.com

 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 ---
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send
 an email to clojure+u...@googlegroups.com.

 For more options, visit https://groups.google.com/d/optout.


  --
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clo...@googlegroups.com
 Note that posts from new members are moderated - please be patient with
 your first post.
 To unsubscribe from this group, send email to
 clojure+u...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 ---
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send
 an email to clojure+u...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.


  --
 You received this message because you are subscribed to the Google
 Groups Clojure group.
 To post to this group, send email to clojure@googlegroups.com
 Note that posts from new members are moderated - please be patient with
 your first post.
 To unsubscribe from this group, send email to
 clojure+unsubscr...@googlegroups.com
 For more options, visit this group at
 http://groups.google.com/group/clojure?hl=en
 ---
 You received this message because you are subscribed to the Google Groups
 Clojure group.
 To unsubscribe from this group and stop receiving emails from it, send an
 email to clojure+unsubscr...@googlegroups.com.
 For more options, visit https://groups.google.com/d/optout.


-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.


Re: Doing Socket IO inside STM transaction

2014-06-17 Thread Stuart Sierra
On Tuesday, June 17, 2014 6:14:27 PM UTC-4, Gary Trakhman wrote:

 I'm not sure if the STM guarantees any ordering, but you'd probably want 
 to be explicit.



Two or more `send`s or `send-off`s from the *same* thread will be delivered 
in the order they were sent. There are no guarantees about the interleaving 
of those messages with send's from other threads.

-S 

-- 
You received this message because you are subscribed to the Google
Groups Clojure group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
Clojure group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.