Concurrent writes to mkfifo seem to get lost
up vote
0
down vote
favorite
I am writing a script that will setup an environment of machines. I have the ability to put a startup script on the machines and so I am trying to use a named pipe mkfifo
in unix on my "workstation" machine that will listen for writes from these new machines when they come online.
The problem is, I have no control over when these machines may come online. In total there are over 20 machines that are being started simultaneously and I have tried to simulate the effects of a named pipe being written to multiple times before it has a chance to read and have had startling results....
I wrote two small test scripts:
mkfifogen.sh
#!/bin/bash
mkfifo h
testing=""
sleep 10
for((i=0;i<5;i++));do
echo $I
while read line;do
testing+="$line"
done < h
done
echo "$testing"
rm -f h
and
mkfifowrite.sh
#!/bin/bash
for((i=0;i<5;i++));do
echo "this is a test $i" > h
done
When I run the mkfifogen.sh followed by the mkfifowrite.sh the output is as follows
0
1
2
Then the mkfifowrite.sh script exits and the mkfifogen.sh script hangs
I then have to run the mkfifowrite.sh script 3 more times, and each time it will cause the output on the mkfifogen.sh script to increment one more time. The last run will cause the value of testing to be output 4 times, so my output after 4 runs of the mkfifowrite.sh script and once of the mkfifogen.sh script looks like this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
What I am expecting to see after running mkfifogen.sh and mkfifowrite.sh once each is simply this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
I have looked around online quite a bit and there are some cryptic answers to this, but I can't seem to make much sense out of them. I feel like this link might hold my answer, but I'm not sure https://unix.stackexchange.com/questions/68146/what-are-guarantees-for-concurrent-writes-into-a-named-pipe
TL;DR:
How do I ensure that all writes to a named pipe, regardless of quick in succession they are executed, are handled independently by the read?
linux bash unix pipe named-pipes
|
show 4 more comments
up vote
0
down vote
favorite
I am writing a script that will setup an environment of machines. I have the ability to put a startup script on the machines and so I am trying to use a named pipe mkfifo
in unix on my "workstation" machine that will listen for writes from these new machines when they come online.
The problem is, I have no control over when these machines may come online. In total there are over 20 machines that are being started simultaneously and I have tried to simulate the effects of a named pipe being written to multiple times before it has a chance to read and have had startling results....
I wrote two small test scripts:
mkfifogen.sh
#!/bin/bash
mkfifo h
testing=""
sleep 10
for((i=0;i<5;i++));do
echo $I
while read line;do
testing+="$line"
done < h
done
echo "$testing"
rm -f h
and
mkfifowrite.sh
#!/bin/bash
for((i=0;i<5;i++));do
echo "this is a test $i" > h
done
When I run the mkfifogen.sh followed by the mkfifowrite.sh the output is as follows
0
1
2
Then the mkfifowrite.sh script exits and the mkfifogen.sh script hangs
I then have to run the mkfifowrite.sh script 3 more times, and each time it will cause the output on the mkfifogen.sh script to increment one more time. The last run will cause the value of testing to be output 4 times, so my output after 4 runs of the mkfifowrite.sh script and once of the mkfifogen.sh script looks like this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
What I am expecting to see after running mkfifogen.sh and mkfifowrite.sh once each is simply this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
I have looked around online quite a bit and there are some cryptic answers to this, but I can't seem to make much sense out of them. I feel like this link might hold my answer, but I'm not sure https://unix.stackexchange.com/questions/68146/what-are-guarantees-for-concurrent-writes-into-a-named-pipe
TL;DR:
How do I ensure that all writes to a named pipe, regardless of quick in succession they are executed, are handled independently by the read?
linux bash unix pipe named-pipes
Down voter, do you have a reason? If so, please comment on how I can improve my question...
– CraigR8806
Nov 10 at 14:53
This is a little tricky. First, are you intentionally opening and closing the pipe inmkfifowrite.sh
at each iteration, or do you want a single run ofmkfifowrite.sh
to correspond to a single iteration of thefor
loop inmkfifogen.sh
? Second, I'm getting different results depending on which version ofbash
I used, and possibly whether I run this under macOS or Linux. Which version ofbash
are you using?
– chepner
Nov 10 at 15:54
Yes, each iteration of the for loop would emulate a different write to the pipe, like a machine coming online and relaying its status. I am running this on RHEL. @chepner
– CraigR8806
Nov 10 at 15:56
Essentially, I want to understand what happens when writes stack up on the pipe before the read has an attempt to read the first one.
– CraigR8806
Nov 10 at 15:59
Note that you aren't testing concurrent writes; you have a single reader and a single writer, and that writer is just making a series of sequential writes. The real problems will happen if you try to runmkfifowrite.sh
multiple times in parallel.
– chepner
Nov 10 at 15:59
|
show 4 more comments
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I am writing a script that will setup an environment of machines. I have the ability to put a startup script on the machines and so I am trying to use a named pipe mkfifo
in unix on my "workstation" machine that will listen for writes from these new machines when they come online.
The problem is, I have no control over when these machines may come online. In total there are over 20 machines that are being started simultaneously and I have tried to simulate the effects of a named pipe being written to multiple times before it has a chance to read and have had startling results....
I wrote two small test scripts:
mkfifogen.sh
#!/bin/bash
mkfifo h
testing=""
sleep 10
for((i=0;i<5;i++));do
echo $I
while read line;do
testing+="$line"
done < h
done
echo "$testing"
rm -f h
and
mkfifowrite.sh
#!/bin/bash
for((i=0;i<5;i++));do
echo "this is a test $i" > h
done
When I run the mkfifogen.sh followed by the mkfifowrite.sh the output is as follows
0
1
2
Then the mkfifowrite.sh script exits and the mkfifogen.sh script hangs
I then have to run the mkfifowrite.sh script 3 more times, and each time it will cause the output on the mkfifogen.sh script to increment one more time. The last run will cause the value of testing to be output 4 times, so my output after 4 runs of the mkfifowrite.sh script and once of the mkfifogen.sh script looks like this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
What I am expecting to see after running mkfifogen.sh and mkfifowrite.sh once each is simply this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
I have looked around online quite a bit and there are some cryptic answers to this, but I can't seem to make much sense out of them. I feel like this link might hold my answer, but I'm not sure https://unix.stackexchange.com/questions/68146/what-are-guarantees-for-concurrent-writes-into-a-named-pipe
TL;DR:
How do I ensure that all writes to a named pipe, regardless of quick in succession they are executed, are handled independently by the read?
linux bash unix pipe named-pipes
I am writing a script that will setup an environment of machines. I have the ability to put a startup script on the machines and so I am trying to use a named pipe mkfifo
in unix on my "workstation" machine that will listen for writes from these new machines when they come online.
The problem is, I have no control over when these machines may come online. In total there are over 20 machines that are being started simultaneously and I have tried to simulate the effects of a named pipe being written to multiple times before it has a chance to read and have had startling results....
I wrote two small test scripts:
mkfifogen.sh
#!/bin/bash
mkfifo h
testing=""
sleep 10
for((i=0;i<5;i++));do
echo $I
while read line;do
testing+="$line"
done < h
done
echo "$testing"
rm -f h
and
mkfifowrite.sh
#!/bin/bash
for((i=0;i<5;i++));do
echo "this is a test $i" > h
done
When I run the mkfifogen.sh followed by the mkfifowrite.sh the output is as follows
0
1
2
Then the mkfifowrite.sh script exits and the mkfifogen.sh script hangs
I then have to run the mkfifowrite.sh script 3 more times, and each time it will cause the output on the mkfifogen.sh script to increment one more time. The last run will cause the value of testing to be output 4 times, so my output after 4 runs of the mkfifowrite.sh script and once of the mkfifogen.sh script looks like this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
What I am expecting to see after running mkfifogen.sh and mkfifowrite.sh once each is simply this:
0
1
2
3
4
this is a test 0this is a test 1this is a test 2this is a test 3this is a test 4
I have looked around online quite a bit and there are some cryptic answers to this, but I can't seem to make much sense out of them. I feel like this link might hold my answer, but I'm not sure https://unix.stackexchange.com/questions/68146/what-are-guarantees-for-concurrent-writes-into-a-named-pipe
TL;DR:
How do I ensure that all writes to a named pipe, regardless of quick in succession they are executed, are handled independently by the read?
linux bash unix pipe named-pipes
linux bash unix pipe named-pipes
asked Nov 10 at 14:08
CraigR8806
1,443717
1,443717
Down voter, do you have a reason? If so, please comment on how I can improve my question...
– CraigR8806
Nov 10 at 14:53
This is a little tricky. First, are you intentionally opening and closing the pipe inmkfifowrite.sh
at each iteration, or do you want a single run ofmkfifowrite.sh
to correspond to a single iteration of thefor
loop inmkfifogen.sh
? Second, I'm getting different results depending on which version ofbash
I used, and possibly whether I run this under macOS or Linux. Which version ofbash
are you using?
– chepner
Nov 10 at 15:54
Yes, each iteration of the for loop would emulate a different write to the pipe, like a machine coming online and relaying its status. I am running this on RHEL. @chepner
– CraigR8806
Nov 10 at 15:56
Essentially, I want to understand what happens when writes stack up on the pipe before the read has an attempt to read the first one.
– CraigR8806
Nov 10 at 15:59
Note that you aren't testing concurrent writes; you have a single reader and a single writer, and that writer is just making a series of sequential writes. The real problems will happen if you try to runmkfifowrite.sh
multiple times in parallel.
– chepner
Nov 10 at 15:59
|
show 4 more comments
Down voter, do you have a reason? If so, please comment on how I can improve my question...
– CraigR8806
Nov 10 at 14:53
This is a little tricky. First, are you intentionally opening and closing the pipe inmkfifowrite.sh
at each iteration, or do you want a single run ofmkfifowrite.sh
to correspond to a single iteration of thefor
loop inmkfifogen.sh
? Second, I'm getting different results depending on which version ofbash
I used, and possibly whether I run this under macOS or Linux. Which version ofbash
are you using?
– chepner
Nov 10 at 15:54
Yes, each iteration of the for loop would emulate a different write to the pipe, like a machine coming online and relaying its status. I am running this on RHEL. @chepner
– CraigR8806
Nov 10 at 15:56
Essentially, I want to understand what happens when writes stack up on the pipe before the read has an attempt to read the first one.
– CraigR8806
Nov 10 at 15:59
Note that you aren't testing concurrent writes; you have a single reader and a single writer, and that writer is just making a series of sequential writes. The real problems will happen if you try to runmkfifowrite.sh
multiple times in parallel.
– chepner
Nov 10 at 15:59
Down voter, do you have a reason? If so, please comment on how I can improve my question...
– CraigR8806
Nov 10 at 14:53
Down voter, do you have a reason? If so, please comment on how I can improve my question...
– CraigR8806
Nov 10 at 14:53
This is a little tricky. First, are you intentionally opening and closing the pipe in
mkfifowrite.sh
at each iteration, or do you want a single run of mkfifowrite.sh
to correspond to a single iteration of the for
loop in mkfifogen.sh
? Second, I'm getting different results depending on which version of bash
I used, and possibly whether I run this under macOS or Linux. Which version of bash
are you using?– chepner
Nov 10 at 15:54
This is a little tricky. First, are you intentionally opening and closing the pipe in
mkfifowrite.sh
at each iteration, or do you want a single run of mkfifowrite.sh
to correspond to a single iteration of the for
loop in mkfifogen.sh
? Second, I'm getting different results depending on which version of bash
I used, and possibly whether I run this under macOS or Linux. Which version of bash
are you using?– chepner
Nov 10 at 15:54
Yes, each iteration of the for loop would emulate a different write to the pipe, like a machine coming online and relaying its status. I am running this on RHEL. @chepner
– CraigR8806
Nov 10 at 15:56
Yes, each iteration of the for loop would emulate a different write to the pipe, like a machine coming online and relaying its status. I am running this on RHEL. @chepner
– CraigR8806
Nov 10 at 15:56
Essentially, I want to understand what happens when writes stack up on the pipe before the read has an attempt to read the first one.
– CraigR8806
Nov 10 at 15:59
Essentially, I want to understand what happens when writes stack up on the pipe before the read has an attempt to read the first one.
– CraigR8806
Nov 10 at 15:59
Note that you aren't testing concurrent writes; you have a single reader and a single writer, and that writer is just making a series of sequential writes. The real problems will happen if you try to run
mkfifowrite.sh
multiple times in parallel.– chepner
Nov 10 at 15:59
Note that you aren't testing concurrent writes; you have a single reader and a single writer, and that writer is just making a series of sequential writes. The real problems will happen if you try to run
mkfifowrite.sh
multiple times in parallel.– chepner
Nov 10 at 15:59
|
show 4 more comments
1 Answer
1
active
oldest
votes
up vote
0
down vote
The reader reads until EOF, then repeats, until 5 EOFs have been received.
The writer opens and closes the pipe 5 times. Every time the writer closes the pipe, a potential EOF condition exists. It doesn't become an actual EOF until the reader attempts to read it (after reading everything that was written before).
During this potential EOF phase, there's a race. The writer is incrementing i
and preparing to open the pipe for writing again, while the reader is completing the read
command and processing the result, after which it will try to read again.
If the writer performs an open for writing before the reader attempts the read, the potential EOF condition disappears. If the reader attempts the read while the writer is no longer connected to the pipe, the EOF happens.
As you can see, when there are multiple writers to a pipe (whether sequential or parallel), EOFs are a pain. You can't expect them to reliably show up between messages from different writers. My way out of this would be to design the protocol so that the reader doesn't need EOFs to recognize the end of a message, and then have the reader open the pipe in read+write mode so there will always be at least one existing writer, and EOF will never occur.
Keeping the messages under PIPE_BUF
size so they don't get split up is a separate issue, which you also have to pay attention to.
The multiple writers are sequential. One doesn't begin until the previous one completes. There's no race condition there.
– chepner
Nov 11 at 2:06
@chepner I didn't say there was a race between 2 writers. I described (in great detail!) the race between the writer and the reader.
– Wumpus Q. Wumbley
Nov 11 at 2:09
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
The reader reads until EOF, then repeats, until 5 EOFs have been received.
The writer opens and closes the pipe 5 times. Every time the writer closes the pipe, a potential EOF condition exists. It doesn't become an actual EOF until the reader attempts to read it (after reading everything that was written before).
During this potential EOF phase, there's a race. The writer is incrementing i
and preparing to open the pipe for writing again, while the reader is completing the read
command and processing the result, after which it will try to read again.
If the writer performs an open for writing before the reader attempts the read, the potential EOF condition disappears. If the reader attempts the read while the writer is no longer connected to the pipe, the EOF happens.
As you can see, when there are multiple writers to a pipe (whether sequential or parallel), EOFs are a pain. You can't expect them to reliably show up between messages from different writers. My way out of this would be to design the protocol so that the reader doesn't need EOFs to recognize the end of a message, and then have the reader open the pipe in read+write mode so there will always be at least one existing writer, and EOF will never occur.
Keeping the messages under PIPE_BUF
size so they don't get split up is a separate issue, which you also have to pay attention to.
The multiple writers are sequential. One doesn't begin until the previous one completes. There's no race condition there.
– chepner
Nov 11 at 2:06
@chepner I didn't say there was a race between 2 writers. I described (in great detail!) the race between the writer and the reader.
– Wumpus Q. Wumbley
Nov 11 at 2:09
add a comment |
up vote
0
down vote
The reader reads until EOF, then repeats, until 5 EOFs have been received.
The writer opens and closes the pipe 5 times. Every time the writer closes the pipe, a potential EOF condition exists. It doesn't become an actual EOF until the reader attempts to read it (after reading everything that was written before).
During this potential EOF phase, there's a race. The writer is incrementing i
and preparing to open the pipe for writing again, while the reader is completing the read
command and processing the result, after which it will try to read again.
If the writer performs an open for writing before the reader attempts the read, the potential EOF condition disappears. If the reader attempts the read while the writer is no longer connected to the pipe, the EOF happens.
As you can see, when there are multiple writers to a pipe (whether sequential or parallel), EOFs are a pain. You can't expect them to reliably show up between messages from different writers. My way out of this would be to design the protocol so that the reader doesn't need EOFs to recognize the end of a message, and then have the reader open the pipe in read+write mode so there will always be at least one existing writer, and EOF will never occur.
Keeping the messages under PIPE_BUF
size so they don't get split up is a separate issue, which you also have to pay attention to.
The multiple writers are sequential. One doesn't begin until the previous one completes. There's no race condition there.
– chepner
Nov 11 at 2:06
@chepner I didn't say there was a race between 2 writers. I described (in great detail!) the race between the writer and the reader.
– Wumpus Q. Wumbley
Nov 11 at 2:09
add a comment |
up vote
0
down vote
up vote
0
down vote
The reader reads until EOF, then repeats, until 5 EOFs have been received.
The writer opens and closes the pipe 5 times. Every time the writer closes the pipe, a potential EOF condition exists. It doesn't become an actual EOF until the reader attempts to read it (after reading everything that was written before).
During this potential EOF phase, there's a race. The writer is incrementing i
and preparing to open the pipe for writing again, while the reader is completing the read
command and processing the result, after which it will try to read again.
If the writer performs an open for writing before the reader attempts the read, the potential EOF condition disappears. If the reader attempts the read while the writer is no longer connected to the pipe, the EOF happens.
As you can see, when there are multiple writers to a pipe (whether sequential or parallel), EOFs are a pain. You can't expect them to reliably show up between messages from different writers. My way out of this would be to design the protocol so that the reader doesn't need EOFs to recognize the end of a message, and then have the reader open the pipe in read+write mode so there will always be at least one existing writer, and EOF will never occur.
Keeping the messages under PIPE_BUF
size so they don't get split up is a separate issue, which you also have to pay attention to.
The reader reads until EOF, then repeats, until 5 EOFs have been received.
The writer opens and closes the pipe 5 times. Every time the writer closes the pipe, a potential EOF condition exists. It doesn't become an actual EOF until the reader attempts to read it (after reading everything that was written before).
During this potential EOF phase, there's a race. The writer is incrementing i
and preparing to open the pipe for writing again, while the reader is completing the read
command and processing the result, after which it will try to read again.
If the writer performs an open for writing before the reader attempts the read, the potential EOF condition disappears. If the reader attempts the read while the writer is no longer connected to the pipe, the EOF happens.
As you can see, when there are multiple writers to a pipe (whether sequential or parallel), EOFs are a pain. You can't expect them to reliably show up between messages from different writers. My way out of this would be to design the protocol so that the reader doesn't need EOFs to recognize the end of a message, and then have the reader open the pipe in read+write mode so there will always be at least one existing writer, and EOF will never occur.
Keeping the messages under PIPE_BUF
size so they don't get split up is a separate issue, which you also have to pay attention to.
answered Nov 10 at 18:14
Wumpus Q. Wumbley
16.9k12047
16.9k12047
The multiple writers are sequential. One doesn't begin until the previous one completes. There's no race condition there.
– chepner
Nov 11 at 2:06
@chepner I didn't say there was a race between 2 writers. I described (in great detail!) the race between the writer and the reader.
– Wumpus Q. Wumbley
Nov 11 at 2:09
add a comment |
The multiple writers are sequential. One doesn't begin until the previous one completes. There's no race condition there.
– chepner
Nov 11 at 2:06
@chepner I didn't say there was a race between 2 writers. I described (in great detail!) the race between the writer and the reader.
– Wumpus Q. Wumbley
Nov 11 at 2:09
The multiple writers are sequential. One doesn't begin until the previous one completes. There's no race condition there.
– chepner
Nov 11 at 2:06
The multiple writers are sequential. One doesn't begin until the previous one completes. There's no race condition there.
– chepner
Nov 11 at 2:06
@chepner I didn't say there was a race between 2 writers. I described (in great detail!) the race between the writer and the reader.
– Wumpus Q. Wumbley
Nov 11 at 2:09
@chepner I didn't say there was a race between 2 writers. I described (in great detail!) the race between the writer and the reader.
– Wumpus Q. Wumbley
Nov 11 at 2:09
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53239773%2fconcurrent-writes-to-mkfifo-seem-to-get-lost%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Down voter, do you have a reason? If so, please comment on how I can improve my question...
– CraigR8806
Nov 10 at 14:53
This is a little tricky. First, are you intentionally opening and closing the pipe in
mkfifowrite.sh
at each iteration, or do you want a single run ofmkfifowrite.sh
to correspond to a single iteration of thefor
loop inmkfifogen.sh
? Second, I'm getting different results depending on which version ofbash
I used, and possibly whether I run this under macOS or Linux. Which version ofbash
are you using?– chepner
Nov 10 at 15:54
Yes, each iteration of the for loop would emulate a different write to the pipe, like a machine coming online and relaying its status. I am running this on RHEL. @chepner
– CraigR8806
Nov 10 at 15:56
Essentially, I want to understand what happens when writes stack up on the pipe before the read has an attempt to read the first one.
– CraigR8806
Nov 10 at 15:59
Note that you aren't testing concurrent writes; you have a single reader and a single writer, and that writer is just making a series of sequential writes. The real problems will happen if you try to run
mkfifowrite.sh
multiple times in parallel.– chepner
Nov 10 at 15:59