Apply transaction to setting connected to Room entities, to resolve a possible race condition at two clients connecting simultaneously.

BUG = 1742
Test = Apprtc Integration Test

R=phoglund@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/3489004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5247 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
braveyao@webrtc.org 2013-12-09 19:37:45 +00:00
parent 70ddf9355f
commit c329529047

View File

@ -91,6 +91,9 @@ def handle_message(room, user, message):
if other_user == user:
message = make_loopback_answer(message)
on_message(room, other_user, message)
else:
# For unittest
on_message(room, user, message)
def get_saved_messages(client_id):
return Message.gql("WHERE client_id = :id", id=client_id)
@ -255,22 +258,27 @@ class Room(db.Model):
if user == self.user2:
return self.user2_connected
@db.transactional
def connect_user_to_room(room_key, user):
room = Room.get_by_key_name(room_key)
# Check if room has user in case that disconnect message comes before
# connect message with unknown reason, observed with local AppEngine SDK.
if room and room.has_user(user):
room.set_connected(user)
logging.info('User ' + user + ' connected to room ' + room_key)
logging.info('Room ' + room_key + ' has state ' + str(room))
else:
logging.warning('Unexpected Connect Message to room ' + room_key)
return room
class ConnectPage(webapp2.RequestHandler):
def post(self):
key = self.request.get('from')
room_key, user = key.split('/')
with LOCK:
room = Room.get_by_key_name(room_key)
# Check if room has user in case that disconnect message comes before
# connect message with unknown reason, observed with local AppEngine SDK.
room = connect_user_to_room(room_key, user)
if room and room.has_user(user):
room.set_connected(user)
send_saved_messages(make_client_id(room, user))
logging.info('User ' + user + ' connected to room ' + room_key)
logging.info('Room ' + room_key + ' has state ' + str(room))
else:
logging.warning('Unexpected Connect Message to room ' + room_key)
class DisconnectPage(webapp2.RequestHandler):
def post(self):