Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@
import org.tron.core.config.args.Args;
import org.tron.core.db.RevokingDatabase;
import org.tron.core.db2.core.SnapshotManager;
import org.tron.core.services.interfaceOnPBFT.HttpApiOnPBFTService;
import org.tron.core.services.interfaceOnPBFT.RpcApiServiceOnPBFT;
import org.tron.core.services.interfaceOnPBFT.http.PBFT.HttpApiOnPBFTService;
import org.tron.core.services.interfaceOnSolidity.HttpApiOnSolidityService;
import org.tron.core.services.interfaceOnSolidity.RpcApiServiceOnSolidity;
import org.tron.core.services.interfaceOnSolidity.http.solidity.HttpApiOnSolidityService;

@Slf4j(topic = "app")
@Configuration
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.tron.core.services.filter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.tron.core.db.Manager;
import org.tron.core.db2.core.Chainbase;

@Component
public class PbftCursorFilter extends WalletCursorFilter {

@Autowired
public PbftCursorFilter(Manager dbManager) {
super(dbManager, Chainbase.Cursor.PBFT);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.tron.core.services.filter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.tron.core.db.Manager;
import org.tron.core.db2.core.Chainbase;

@Component
public class SolidityCursorFilter extends WalletCursorFilter {

@Autowired
public SolidityCursorFilter(Manager dbManager) {
super(dbManager, Chainbase.Cursor.SOLIDITY);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package org.tron.core.services.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.tron.core.db.Manager;
import org.tron.core.db2.core.Chainbase;

/**
* Selects which state view (HEAD / SOLIDITY / PBFT) the http servlets on this port read from.
*
* <p>The read cursor is a per-thread setting ({@code ThreadLocal} in {@code Chainbase}): it only
* decides from which snapshot the current thread starts its reads, and has no effect on any
* other thread. This filter sets the cursor before the servlet runs, so the same stateless
* servlet beans can serve {@code /wallet} (HEAD), {@code /walletsolidity} (SOLIDITY) and
* {@code /walletpbft} (PBFT) without per-port subclasses.
*
* <p>The cursor is always reset to HEAD in a finally block: jetty pools its worker threads, and
* a leftover cursor would leak into the next request served by the same thread. Only read-only
* endpoints may be mounted behind this filter — write paths must run with the HEAD cursor.
*/
public abstract class WalletCursorFilter implements Filter {

private final Manager dbManager;
private final Chainbase.Cursor cursor;

protected WalletCursorFilter(Manager dbManager, Chainbase.Cursor cursor) {
this.dbManager = dbManager;
this.cursor = cursor;
}

@Override
public void init(FilterConfig filterConfig) throws ServletException {
// do nothing
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
try {
// for PBFT the offset (head - pbft) is computed inside Manager#setCursor per request
dbManager.setCursor(cursor);
filterChain.doFilter(servletRequest, servletResponse);
} finally {
dbManager.resetCursor();
}
}

@Override
public void destroy() {
// do nothing
}
}
Loading
Loading