diff options
author | Eike Stepper | 2015-07-17 09:03:31 +0000 |
---|---|---|
committer | Eike Stepper | 2015-07-17 09:03:31 +0000 |
commit | 504b4e687c057d5b29bc7ff461dea2e840602185 (patch) | |
tree | dcba411e7495f982f5e1db45164d2c2aab615040 /plugins/org.eclipse.emf.cdo.server.net4j/src | |
parent | 0d7c85286fc360c149c5f3f2e93c6193a4892a3f (diff) | |
download | cdo-504b4e687c057d5b29bc7ff461dea2e840602185.tar.gz cdo-504b4e687c057d5b29bc7ff461dea2e840602185.tar.xz cdo-504b4e687c057d5b29bc7ff461dea2e840602185.zip |
[472924] Problems with explicit locking and high-frequency session open/close
https://bugs.eclipse.org/bugs/show_bug.cgi?id=472924
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.server.net4j/src')
5 files changed, 64 insertions, 9 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java index 1f3f8cba50..88bbb15734 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/CDOServerProtocol.java @@ -34,6 +34,7 @@ import org.eclipse.net4j.signal.security.AuthenticationRequest; import org.eclipse.net4j.util.io.StringCompressor; import org.eclipse.net4j.util.io.StringIO; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; +import org.eclipse.net4j.util.om.trace.ContextTracer; import org.eclipse.net4j.util.security.CredentialsUpdateOperation; import org.eclipse.net4j.util.security.DiffieHellman.Client.Response; import org.eclipse.net4j.util.security.DiffieHellman.Server.Challenge; @@ -45,6 +46,8 @@ public class CDOServerProtocol extends SignalProtocol<InternalSession>implements { public static final long DEFAULT_NEGOTIATION_TIMEOUT = 15 * 1000; + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG_PROTOCOL, CDOServerProtocol.class); + private long negotiationTimeout = DEFAULT_NEGOTIATION_TIMEOUT; private IRepositoryProvider repositoryProvider; @@ -220,7 +223,10 @@ public class CDOServerProtocol extends SignalProtocol<InternalSession>implements protected void handleInactiveSession() { - OM.LOG.warn("Session channel is inactive: " + this); //$NON-NLS-1$ + if (TRACER.isEnabled()) + { + TRACER.trace("Session channel is inactive: " + this); //$NON-NLS-1$ + } } @Override @@ -378,6 +384,9 @@ public class CDOServerProtocol extends SignalProtocol<InternalSession>implements case SIGNAL_LOAD_OBJECT_LIFETIME: return new LoadObjectLifetimeIndication(this); + case SIGNAL_OPENED_SESSION: + return new OpenedSessionNotification(this); + default: return super.createSignalReactor(signalID); } diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java index 4681bdfa03..23822b846a 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/LockObjectsIndication.java @@ -46,6 +46,11 @@ public class LockObjectsIndication extends CDOServerWriteIndication super(protocol, signalID); } + protected IView getView(int viewID) + { + return getSession().getView(viewID); + } + @Override protected void indicating(CDODataInput in) throws IOException { @@ -66,11 +71,6 @@ public class LockObjectsIndication extends CDOServerWriteIndication result = repository.lock((InternalView)view, lockType, revisionKeys, recursive, timeout); } - protected IView getView(int viewID) - { - return getSession().getView(viewID); - } - @Override protected void responding(CDODataOutput out) throws IOException { diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java index 4078fed6a3..7c02e8cefd 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenSessionIndication.java @@ -192,7 +192,7 @@ public class OpenSessionIndication extends CDOServerIndicationWithMonitoring } out.writeLong(repository.getCreationTime()); - out.writeLong(repository.getLastCommitTimeStamp()); + out.writeLong(session.getFirstUpdateTime()); out.writeCDOID(repository.getRootResourceID()); out.writeBoolean(repository.isAuthenticating()); out.writeBoolean(repository.isSupportingAudits()); diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenedSessionNotification.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenedSessionNotification.java new file mode 100644 index 0000000000..9750edb2ce --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/OpenedSessionNotification.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2009-2013, 2015 Eike Stepper (Berlin, Germany) and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Eike Stepper - initial API and implementation + * Christian W. Damus (CEA LIST) - bug 418454 + */ +package org.eclipse.emf.cdo.server.internal.net4j.protocol; + +import org.eclipse.emf.cdo.common.protocol.CDOProtocolConstants; +import org.eclipse.emf.cdo.spi.server.InternalSession; + +import org.eclipse.net4j.signal.Indication; +import org.eclipse.net4j.util.io.ExtendedDataInputStream; + +/** + * @author Eike Stepper + */ +public class OpenedSessionNotification extends Indication +{ + public OpenedSessionNotification(CDOServerProtocol protocol) + { + super(protocol, CDOProtocolConstants.SIGNAL_OPENED_SESSION); + } + + @Override + protected void indicating(ExtendedDataInputStream in) throws Exception + { + CDOServerProtocol protocol = (CDOServerProtocol)getProtocol(); + InternalSession session = protocol.getSession(); + + if (in.readBoolean()) + { + session.setOpenOnClientSide(); + } + else + { + // Can't possibly happen. + session.close(); + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/RepositoryTimeIndication.java b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/RepositoryTimeIndication.java index 19f6bda99a..6a124f709a 100644 --- a/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/RepositoryTimeIndication.java +++ b/plugins/org.eclipse.emf.cdo.server.net4j/src/org/eclipse/emf/cdo/server/internal/net4j/protocol/RepositoryTimeIndication.java @@ -42,13 +42,13 @@ public class RepositoryTimeIndication extends CDOServerIndication @Override protected void indicating(CDODataInput in) throws IOException { - indicated = System.currentTimeMillis(); + indicated = getRepository().getTimeStamp(); } @Override protected void responding(CDODataOutput out) throws IOException { - long responded = System.currentTimeMillis(); + long responded = getRepository().getTimeStamp(); if (TRACER.isEnabled()) { TRACER.format("Writing indicated: {0}", CDOCommonUtil.formatTimeStamp(indicated)); //$NON-NLS-1$ |