Class EnvironmentEdgeManager
EnvironmentEdge
, then defer to the delegate on invocation. Original Motivation: The main purpose of the Environment Edge Manager was to have better control over the tests so that they behave the same when run in any system. (Refer: HBASE-2578 - The issue which added the
EnvironmentEdgeManager
). The idea is to have a central
place where time can be assigned in HBase. That makes it easier to inject different
implementations of time. The default environment edge is the Java Current Time in millis. The
environment edge manager class is designed to be able to plug in a new implementation of time by
simply injecting an implementation of EnvironmentEdge
interface to EnvironmentEdgeManager
Problems with Environment Edge:
1. One of the major problems is the side effects of injecting an Environment Edge into
Environment Edge Manager.
For example, A test could inject an edge to fast forward time in order to avoid thread sleep to
save time, but it could trigger a premature waking up of another thread waiting on a condition
dependent on time lapse, which could potentially affect the normal working of the system leading
to failure of tests.
2. Every test should ensure it is setting the Environment Edge it needs for the test to perform
in an expected way. Because another test which might have run before the current test could have
injected its own custom Environment Edge which may not be applicable to this test. This is still
solvable but the problem is that the tests can run in parallel leading to different combinations
of environment edges being injected causing unexpected results.
3. Another important issue with respect to injecting time through Environment Edge is that the
milliseconds unit of time is ingrained throughout the codebase in the form of hardcoded sleep
time or timeouts that any change of time unit or making it fast or slow can potentially trigger
unexpected failures due to timeout or unintended flow of execution.
DefaultEnvironmentEdge
is
being used, whose implementation of time returns the System.currentTimeMillis()
. It is
advised not to inject any other EnvironmentEdge
.-
Field Summary
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic long
Defers to the delegate and calls theEnvironmentEdge.currentTime()
method.static EnvironmentEdge
Retrieves the singleton instance of theEnvironmentEdge
that is being managed.static void
injectEdge
(EnvironmentEdge edge) Injects the given edge such that it becomes the managed entity.static void
reset()
Resets the managed instance to the default instance:DefaultEnvironmentEdge
.
-
Field Details
-
delegate
-
-
Constructor Details
-
EnvironmentEdgeManager
private EnvironmentEdgeManager()
-
-
Method Details
-
getDelegate
Retrieves the singleton instance of theEnvironmentEdge
that is being managed.- Returns:
- the edge.
-
reset
Resets the managed instance to the default instance:DefaultEnvironmentEdge
. -
injectEdge
Injects the given edge such that it becomes the managed entity. If null is passed to this method, the default type is assigned to the delegate.- Parameters:
edge
- the new edge.
-
currentTime
Defers to the delegate and calls theEnvironmentEdge.currentTime()
method.- Returns:
- current time in millis according to the delegate.
-