Skip to content

non-thread-safe RouteRegistry #193

@alalag1

Description

@alalag1

Expected behavior

Thread-safe & fast

Actual behavior

  • Router state(mappingLookups & uriLookups) can not be guaranteed
  • expect synchronized in deRegister()
  • too much performance loss, cause' of mappingLookups(CopyOnWriteArrayList) & uriLookups(ConcurrentHashMap)`

@Override
public void register(Route route) {
if (route == null) {
return;
}
RouteWrap routeWrap = new RouteWrap(route);
//Add synchronized to avoid same routeWraps add to router without log
synchronized (this) {
router.mappingLookups.forEach(registered -> {
if (registered.predicate.mayAmbiguousWith(routeWrap.predicate)) {
logger.warn("Found ambiguous route:\n{}\n{}", routeWrap.route, registered);
}
});
router.add(routeWrap);
}
logger.debug("Registering route: {}", route);
}
@Override
public void deRegister(Route route) {
if (route == null) {
return;
}
RouteWrap routeWrap = new RouteWrap(route);
RouteWrap target = null;
for (RouteWrap item : router.mappingLookups) {
if (isEquals(item, routeWrap)) {
target = item;
break;
}
}
if (target != null) {
logger.debug("deRegistering route: {}", route);
router.remove(target);
}
}
@Override
public Route route(RequestContext context) {
return router.route(context);
}

Steps to reproduce

Env

  • Restlight version: 1.0.0-SNAPSHOT

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions