fix: deletion of references (#2213)

diff --git a/pkg/apisix/cache/cache.go b/pkg/apisix/cache/cache.go
index 7fcdc4a..91e68b2 100644
--- a/pkg/apisix/cache/cache.go
+++ b/pkg/apisix/cache/cache.go
@@ -97,5 +97,7 @@
 	// DeletePluginConfig deletes the specified plugin_config in cache.
 	DeletePluginConfig(*v1.PluginConfig) error
 
+	CheckUpstreamReference(*v1.Upstream) error
+	CheckPluginConfigReference(*v1.PluginConfig) error
 	DeleteUpstreamServiceRelation(*v1.UpstreamServiceRelation) error
 }
diff --git a/pkg/apisix/cache/memdb.go b/pkg/apisix/cache/memdb.go
index 4a45a1a..3dc0393 100644
--- a/pkg/apisix/cache/memdb.go
+++ b/pkg/apisix/cache/memdb.go
@@ -311,7 +311,7 @@
 }
 
 func (c *dbCache) DeleteUpstream(u *v1.Upstream) error {
-	if err := c.checkUpstreamReference(u); err != nil {
+	if err := c.CheckUpstreamReference(u); err != nil {
 		return err
 	}
 	return c.delete("upstream", u)
@@ -334,7 +334,7 @@
 }
 
 func (c *dbCache) DeletePluginConfig(pc *v1.PluginConfig) error {
-	if err := c.checkPluginConfigReference(pc); err != nil {
+	if err := c.CheckPluginConfigReference(pc); err != nil {
 		return err
 	}
 	return c.delete("plugin_config", pc)
@@ -357,7 +357,7 @@
 	return nil
 }
 
-func (c *dbCache) checkUpstreamReference(u *v1.Upstream) error {
+func (c *dbCache) CheckUpstreamReference(u *v1.Upstream) error {
 	// Upstream is referenced by Route.
 	txn := c.db.Txn(false)
 	defer txn.Abort()
@@ -379,7 +379,7 @@
 	return nil
 }
 
-func (c *dbCache) checkPluginConfigReference(u *v1.PluginConfig) error {
+func (c *dbCache) CheckPluginConfigReference(u *v1.PluginConfig) error {
 	// PluginConfig is referenced by Route.
 	txn := c.db.Txn(false)
 	defer txn.Abort()
diff --git a/pkg/apisix/cache/noop_db.go b/pkg/apisix/cache/noop_db.go
index 6fce1ec..d3e7b77 100644
--- a/pkg/apisix/cache/noop_db.go
+++ b/pkg/apisix/cache/noop_db.go
@@ -172,3 +172,11 @@
 func (c *noopCache) DeleteUpstreamServiceRelation(us *v1.UpstreamServiceRelation) error {
 	return nil
 }
+
+func (c *noopCache) CheckUpstreamReference(u *v1.Upstream) error {
+	return nil
+}
+
+func (c *noopCache) CheckPluginConfigReference(pc *v1.PluginConfig) error {
+	return nil
+}
diff --git a/pkg/apisix/nonexistentclient.go b/pkg/apisix/nonexistentclient.go
index ac7e498..237cbbc 100644
--- a/pkg/apisix/nonexistentclient.go
+++ b/pkg/apisix/nonexistentclient.go
@@ -400,3 +400,5 @@
 func (c *dummyCache) DeleteSchema(_ *v1.Schema) error                                   { return nil }
 func (c *dummyCache) DeletePluginConfig(_ *v1.PluginConfig) error                       { return nil }
 func (c *dummyCache) DeleteUpstreamServiceRelation(_ *v1.UpstreamServiceRelation) error { return nil }
+func (c *dummyCache) CheckUpstreamReference(_ *v1.Upstream) error                       { return nil }
+func (c *dummyCache) CheckPluginConfigReference(_ *v1.PluginConfig) error               { return nil }
diff --git a/pkg/apisix/pluginconfig.go b/pkg/apisix/pluginconfig.go
index 0886e45..6a2d4f0 100644
--- a/pkg/apisix/pluginconfig.go
+++ b/pkg/apisix/pluginconfig.go
@@ -162,7 +162,11 @@
 		zap.String("cluster", pc.cluster.name),
 		zap.String("url", pc.url),
 	)
-
+	err := pc.cluster.cache.CheckPluginConfigReference(obj)
+	if err != nil {
+		log.Warnw("deletion for plugin config: " + obj.Name + " aborted as it is still in use.")
+		return err
+	}
 	if err := pc.cluster.HasSynced(ctx); err != nil {
 		return err
 	}
diff --git a/pkg/apisix/upstream.go b/pkg/apisix/upstream.go
index 2a0f394..6b53b39 100644
--- a/pkg/apisix/upstream.go
+++ b/pkg/apisix/upstream.go
@@ -158,7 +158,11 @@
 		zap.String("cluster", u.cluster.name),
 		zap.String("url", u.url),
 	)
-
+	err := u.cluster.cache.CheckUpstreamReference(obj)
+	if err != nil {
+		log.Warnw("deletion for upstream: " + obj.Name + " aborted as it is still in use.")
+		return err
+	}
 	if err := u.cluster.HasSynced(ctx); err != nil {
 		return err
 	}